天勤论坛高分笔记 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; }
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。