就地並歸兩個有序表
阿新 • • 發佈:2021-06-17
任務描述
本關任務:程式設計實現兩個有序表的就地歸併。
相關知識
為了完成本關任務,你需要掌握: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; }