將兩個非遞減的有序連結串列合併為一個非遞增的有序連結串列。要求結果連結串列仍使用原來兩個連結串列的儲存空間,不另外佔用其他的儲存空間。表中允許有重複的資料。
阿新 • • 發佈:2018-10-31
語言:C++
1、忽略了不另外佔用其他的儲存空間><
#include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(LinkList &L,int n) { LNode *p,*r;int i; L=new LNode; L->next=NULL; r=L; for(i=0;i<n;i++) { p=new LNode; cin>>p->data; p->next=NULL;r->next=p; r=p; } return 0; } //輸出連結串列 void display(LinkList L) { LNode *p; p=L->next; cout<<"("; while(p) {cout<<p->data<<" "; p=p->next;} cout<<")"<<endl; } //合併 void MergeList_L(LinkList LA,LinkList LB,LinkList &LC) { LNode *pa;LNode *pb;LNode *p; pa=LA->next;pb=LB->next; LC=LA;LC->next=NULL; while(pa&&pb) { if(pa->data<=pb->data) { p=new LNode; p->data=pa->data; p->next=LC->next;LC->next=p; pa=pa->next; } else { p=new LNode; p->data=pb->data; p->next=LC->next;LC->next=p; pb=pb->next; } } if(pa) { while(pa) { p=new LNode; p->data=pa->data; p->next=LC->next;LC->next=p; pa=pa->next; } } if(pb) { while(pb) { p=new LNode; p->data=pb->data; p->next=LC->next;LC->next=p; pb=pb->next; } } delete LB; } int main() { LinkList LA;LinkList LB;LinkList LC;int n; cout<<"請輸入需要建立的LA連結串列的長度:"<<endl; cin>>n; cout<<"請依次輸入需要存入的資料(尾插法&&非遞減):"<<endl; CreateList (LA,n); cout<<"請輸入需要建立的LB連結串列的長度:"<<endl; cin>>n; cout<<"請依次輸入需要存入的資料(尾插法&&非遞減):"<<endl; CreateList (LB,n); cout<<"當前LA連結串列為:"; display(LA); cout<<"當前LB連結串列為:"; display(LB); MergeList_L(LA,LB,LC); cout<<"合併後的LC連結串列為:"; display(LC); return 0; }
2、修改之後
#include <iostream> using namespace std; typedef struct LNode { int data; LNode *next; }LNode,*LinkList; //建立連結串列 int CreateList(LinkList &L,int n) { LNode *p,*r;int i; L=new LNode; L->next=NULL; r=L; for(i=0;i<n;i++) { p=new LNode; cin>>p->data; p->next=NULL;r->next=p; r=p; } return 0; } //輸出連結串列 void display(LinkList L) { LNode *p; p=L->next; cout<<"("; while(p) {cout<<p->data<<" "; p=p->next;} cout<<")"<<endl; } //合併 void MergeList_L(LinkList& LA, LinkList& LB, LinkList& LC) { LNode *pa;LNode *pb;LNode *pc; pa=LA->next;pb=LB->next; LC=LA;pc=LC; LC->next=NULL; while(pa||pb) { if(!pa)//La表為空,用q指向pb,pb指標後移 { pc=pb; pb=pb->next; } else if(!pb)//Lb表為空,用q指向pa,pa指標後移 { pc=pa; pa=pa->next; } else if(pa->data<=pb->data)//取較小者(相等)La中的元素,用q指向pa,pa指標後移 { pc=pa; pa=pa->next; } else //取較小者Lb中的元素,用q指向pb,pb指標後移 { pc=pb; pb=pb->next; } pc->next = LC->next; LC->next = pc; } delete LB; } int main() { LinkList LA;LinkList LB;LinkList LC;int n; cout<<"請輸入需要建立的LA連結串列的長度:"<<endl; cin>>n; cout<<"請依次輸入需要存入的資料(尾插法&&非遞減):"<<endl; CreateList (LA,n); cout<<"請輸入需要建立的LB連結串列的長度:"<<endl; cin>>n; cout<<"請依次輸入需要存入的資料(尾插法&&非遞減):"<<endl; CreateList (LB,n); cout<<"當前LA連結串列為:"; display(LA); cout<<"當前LB連結串列為:"; display(LB); MergeList_L(LA,LB,LC); cout<<"合併後的LC連結串列為:"; display(LC); return 0; }