/* 問題描述:A和B是兩個單鏈表(帶頭結點) 其中元素遞增有序,設計一個算法,將A,B歸並成一個按元素值非遞減有序的鏈表C C由A,B中的結點構成 */ #include<stdio.h> #include<malloc.h> typedef struct LNode{ int data; struct LNode* next; }LNode,*LinkList; //頭插法構建單鏈表(輸出時與創建順序相反) void init1(LinkList &L){ //一定要給L動態開辟空間,並且讓 L->next = NULL; L = (LinkList)malloc(sizeof(LinkList)); L->next = NULL; LinkList s; int x; scanf("%d",&x); while(x!=-1){ s = (LinkList)malloc(sizeof(LinkList)); s->data = x; s->next = L->next; L->next = s; scanf("%d",&x); } } //尾插法構建單鏈表 void init2(LinkList &L){ L = (LinkList)malloc(sizeof(LinkList)); L->next = NULL; LinkList s,r; r = L; int x; scanf("%d",&x); while(x!=-1){ s = (LinkList)malloc(sizeof(LinkList)); s->data = x; r->next = s; r = s; scanf("%d",&x); } s->next = NULL; } void merge(LinkList a,LinkList b,LinkList &c){ LinkList p,q,s,r; p = a->next; q = b->next; c = (LinkList)malloc(sizeof(LinkList)); c->next = NULL; r = c; while(p!=NULL&&q!=NULL){ s = (LinkList)malloc(sizeof(LinkList)); if(p->data<q->data){ s->data = p->data; printf("=========%d\n",s->data ); r->next = s; r = s; //只動一個指針,切記 p = p->next; }else{ s->data = q->data; printf("++++++++++%d\n",s->data ); r->next = s; r = s; //只動一個指針,切記 q = q->next; } } if(p!=NULL){ s = (LinkList)malloc(sizeof(LinkList)); s->data = p->data; r->next = s; r = s; //只動一個指針,切記 p = p->next; }else{ s = (LinkList)malloc(sizeof(LinkList)); s->data = q->data; r->next = s; r = s; //只動一個指針,切記 q = q->next; } r->next=NULL; } //輸出鏈表中的元素 void show(LinkList L){ LinkList p = L->next; while(p){ printf("%d ",p->data); p = p->next; } } int main(){ // LinkList L; //// //頭插法測試 //// init1(L); //// //尾插法插法測試 //// init2(L); // // show(L); LinkList a,b,c; printf("請輸入鏈表a的元素:"); init2(a); printf("\n"); printf("請輸入鏈表b的元素:"); init2(b); printf("\n"); merge(a,b,c); show(c); return 0; }