天勤論壇高分筆記 2016 版,第 28 頁,例 2-3。
描述:A和B是兩個單鏈表(帶表頭結點),其中元素遞增有序。設計一個算法將A和B歸併成一個按元素值非遞減有序的鏈表C,C由A和B中的結點組成。算法
尾插法實現:函數
c/* Page 28, Example 2-3. 描述:A和B是兩個單鏈表(帶表頭結點),其中元素遞增有序。 設計一個算法將A和B歸併成一個按元素值非遞減有序的鏈表C,C由A和B中的結點組成。 */ #include "stdio.h" #include "stdlib.h" // 使用了malloc函數 typedef struct LNode { int data; struct LNode *next; // 別漏寫 struct }LNode; void createLinkedListR(LNode *&LL, int a[], int n) // 尾插法建立鏈表 { LNode *s, *r; int i; LL=(LNode *)malloc(sizeof(LNode)); // 頭結點 LL->next=NULL; r=LL; for(i=0; i<n; i++) { s=(LNode *)malloc(sizeof(LNode)); s->data=a[i]; s->next=NULL; r->next=s; r=r->next; // r=s; } // r->next=NULL; } void printLinkedList(LNode *LL) // 打印單鏈表 { LNode *p=LL; int count=0; if(p->next != NULL){ // 若是鏈表非空 p=p->next; } else { return ; } do { printf("%d, ", p->data); count++; p=p->next; }while(p != NULL); // 使用 do-while 語句,while 語句沒法打印最後一個結點 printf("Node Count: %d. \n", count); } void mergeLinkedList(LNode *A, LNode *B, LNode *&C) { LNode *p=A->next, *q=B->next, *r; // p和q都跳過了頭結點 C=A; // 把A的頭結點拿過來利用 C->next=NULL; free(B); // 釋放單鏈表B的頭結點 r=C; // r一直指向C的尾結點 while(p != NULL && q !=NULL) { if(p->data < q->data) { r->next=p; // 連接上 p=p->next; // A的下一個結點 r=r->next; // 尾結點跟蹤 } else { r->next=q; q=q->next; r=r->next; } } r->next=NULL; if(p!=NULL) r->next=p; if(q!=NULL) r->next=q; } int main() { LNode *A=NULL, *B=NULL, *C=NULL; int a[]={1,4,5,7,9,13,16,19,23,24,32}; // 11 int b[]={1,6,15,19,27,32,40}; // 7 createLinkedListR(A, a, 11); createLinkedListR(B, b, 7); printLinkedList(A); printLinkedList(B); mergeLinkedList(A, B, C); // 該函數事後釋放掉了B,不能再打印了 printLinkedList(C); return 0; }