資料結構實驗之連結串列四:有序連結串列的歸併
阿新 • • 發佈:2018-12-19
Problem Description 分別輸入兩個有序的整數序列(分別包含M和N個數據),建立兩個有序的單鏈表,將這兩個有序單鏈表合併成為一個大的有序單鏈表,並依次輸出合併後的單鏈表資料。 Input 第一行輸入M與N的值; 第二行依次輸入M個有序的整數; 第三行依次輸入N個有序的整數。 Output 輸出合併後的單鏈表所包含的M+N個有序的整數。 Sample Input 6 5 1 23 26 45 66 99 14 21 28 50 100 Sample Output 1 14 21 23 26 28 45 50 66 99 100
程式碼:
#include <stdio.h> #include <stdlib.h> struct st { int date; struct st *next; }; struct st *f(int n) { struct st *h,*q,*p; int i; h=(struct st *)malloc(sizeof(struct st)); h->next=NULL; q=h; for(i=0;i<n;i++) { p=(struct st*)malloc(sizeof(struct st)); scanf("%d",&p->date); p->next=NULL; q->next=p; q=p; } return h; }; struct st *merge(struct st *h1,struct st *h2){ struct st *p1,*p2,*z; p1=h1->next; p2=h2->next; z=h1; free(h2); z->next=NULL; while(p1&&p2) { if(p1->date<p2->date) { z->next=p1; z=p1; p1=p1->next; z->next=NULL; } else { z->next=p2; z=p2; p2=p2->next; z->next=NULL; } } while(p2) { z->next=p2; z=p2; p2=p2->next; \\或者去掉後三行 z->next=NULL; } while(p1) { z->next=p1; z=p1; p1=p1->next; \\或者去掉後三行 z->next=NULL; } return h1; }; void print(struct st *h) { struct st *g; g=h->next; while(g) { if(g->next==NULL) printf("%d\n",g->date); else printf("%d ",g->date); g=g->next; } } int main() { struct st *h1,*h2,*h; int n,m; scanf("%d%d",&n,&m); h1=f(n); h2=f(m); h=merge(h1,h2); print(h); return 0; }
無函式版的:
#include <stdio.h> #include <stdlib.h> struct st { int date; struct st *next; }; int main() { struct st *h1,*h2,*q,*p,*p1,*p2,*z; int n,m,i; scanf("%d%d",&n,&m); h1=(struct st *)malloc(sizeof(struct st)); h1->next=NULL; q=h1; for(i=0;i<n;i++) { p=(struct st*)malloc(sizeof(struct st)); scanf("%d",&p->date); p->next=NULL; q->next=p; q=p; } h2=(struct st *)malloc(sizeof(struct st)); h2->next=NULL; q=h2; for(i=0;i<m;i++) { p=(struct st*)malloc(sizeof(struct st)); scanf("%d",&p->date); p->next=NULL; q->next=p; q=p; } p1=h1->next; p2=h2->next; z=h1; free(h2); z->next=NULL; while(p1&&p2) { if(p1->date<p2->date) { z->next=p1; z=p1; p1=p1->next; z->next=NULL; } else { z->next=p2; z=p2; p2=p2->next; z->next=NULL; } } while(p2) { z->next=p2; z=p2; p2=p2->next; z->next=NULL; } while(p1) { z->next=p1; z=p1; p1=p1->next; z->next=NULL; } p=h1->next; while(p) { if(p->next==NULL) printf("%d\n",p->date); else printf("%d ",p->date); p=p->next; } return 0; }