任務描述
本關任務:編程實現兩個有序表的就地歸並。
相關知識
為了完成本關任務,你需要掌握:1.單鏈表的存儲;2.單鏈表的基本操作。
注意事項
1.已有的兩個有序表使用帶頭結點的單鏈表的存儲方式
2.歸並以后不允許表中有重復元素
3.就地歸並
編程要求
首先建立兩個有序單鏈表,就地歸並后輸出。
測試說明
平台會對你編寫的代碼進行測試:
7 //輸入第一個表的長度n1
2 4 7 8 10 13 18 //依次輸入n1個有序的元素
5 /輸入第一個表的長度n2
3 4 5 6 9 //依次輸入n2個有序的元素
預期輸出:
歸並表為:2 3 4 5 6 7 8 9 10 13 18
代碼實現:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 20
void Merge(int a[],int p, int q,int r)
{
int result[N];
int k=0;
int i=p;
int j=q+1;
while(i<=q && j<=r){
if(a[i]<a[j]){
result[k++]=a[i++];
}
else {
result[k++]=a[j++];
}
}
if(i==q+1){
while(j<=r){
result[k++]=a[j++];
}
}
if(j=r+1){
while(i<=q){
result[k++]=a[i++];
}
}
for(j=0,i=p;j<k;i++,j++){
a[i]=result[j];
}
}
void Mergesort(int a[],int p, int r)
{
int q;
if(p<r)
{
q=(p+r)/2;
Mergesort(a,p,q);
Mergesort(a,q+1,r);
Merge(a,p,q,r);
}
}
int main( void )
{
int a[]={2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 18};
Mergesort(a,0,9);
int m=0;
for(m=0;m<11;m++)
printf("%d ",a[m]);
return 0;
}
