兩個有序連結串列的合併2
阿新 • • 發佈:2020-11-01
/* void MergeList_L(LinkList La, LinkList Lb, LinkList Lc){ //已知La、Lb的元素按值非遞減排列 //歸併La、Lb得到單鏈表Lc,Lc的元素也是按值非遞減排列的 LinkList pa,pb,pc; pa = La->next; pb = Lb->next; Lc = pc = La;//用La的頭結點作為Lc的頭結點 while(pa && pb){ if(pa->data<=pb->data){ pc->next = pa; pc = pa; pa = pa->next; } else{ pc->next = pb; pc = pb; pb = pb->next; } } pc->next = pa?pa:pb;//插入剩餘段 free(Lb); } */
/*————————————————————————————————*/ // 將兩個有序連結串列合併到一個連結串列C++版 // /*———————————————————————————————*/ #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> #include<iostream> using namespace std; #define OVERFLOW -2 typedef struct Node{ int data; struct Node *next; }Node,*LinkList;
int InitList(LinkList &L){ L = (LinkList)malloc(sizeof(Node)); if(!L) exit(OVERFLOW); L->next = NULL; return 1; } void CreatList(LinkList &L, int n){ LinkList p,r; r = L; int a; for(int i = 0; i < n; i++){ p = (LinkList)malloc(sizeof(Node)); scanf("%d",&a); p->data = a; r->next = p; r = p; } r->next = NULL; } void PrintList(LinkList &L){//輸出單鏈表 LinkList q; q = L->next; while(q){ printf("%d ",q->data); q = q->next; } } void Combine(LinkList La, LinkList Lb, LinkList Lc){ LinkList pa,pb,pc; pa = La->next; pb = Lb->next; Lc = pc = La; while(pa && pb){ if(pa->data <= pb->data){ pc->next = pa; pc = pa; pa = pa->next; } else{ pc->next = pb; pc = pb; pb = pb->next; } } pc->next = pa? pa:pb; free(Lb); PrintList(Lc); }
int main(){
int m,n;
LinkList LA,LB;
InitList(LA);
InitList(LB);
cout<<"請輸入建立單鏈表LA的元素個數:";
cin>>m;
CreatList(LA,m);
cout<<"請輸入建立單鏈表LB的元素個數:";
cin>>n;
CreatList(LB,n);
cout<<endl;
cout<<" 連結串列LA中的元素"<<endl;
cout<<"-----------------------\n";
PrintList(LA);
cout<<endl;
cout<<"\n\n 連結串列LB中的元素"<<endl;
cout<<"-----------------------\n";
PrintList(LB);
cout<<"\n\nLA、LB合併後的輸出結果:"<<endl;
LinkList Lc;
InitList(Lc);
Combine(LA,LB,Lc);
return 0;
}