合併兩個有序連結串列(完整程式碼)
阿新 • • 發佈:2018-12-29
合併兩有序連結串列為一個有序連結串列:第一步,先給三個連結串列定義三個頭指標,讓其指向當前比較的結點(讓pc先指向la);
第二步,比較la,lb中元素大小,若pa->data<=pb->data;則將pa放入lc中,將pc指向剛插入的元素pa,再將pa往後移一位。
若pa->data>pb->data;同理則將pb放入lc中,將pc指向剛插入的元素pb,再將pb往後移一位。
第三步,若while(pa&&pb)不成立,則說明有一個連結串列已全部插入lc,則執行pc->next=pa?pa:pb;把剩餘段全部插入lc中。
程式碼實現:
#include <stdio.h> #include <iostream> #include <malloc.h> using namespace std; typedef int status; typedef int elemtype; typedef struct LNode{ elemtype data; struct LNode *next; //定義的*next為指向結構體LNode型別的指標 }LNode,*linklist; // *linklist相等於一個列表頭指標,也是結構體型別 //逆位序插入n個元素的值,建立帶表頭結點的單鏈表 status createlist(linklist &l,int n) {int i; linklist p; l=(linklist)malloc(sizeof(linklist)); l->next=NULL;//先建立一個帶頭結點的單鏈表 for(i=n;i>0;i--) { p=(linklist)malloc(sizeof(linklist));//生成新結點 cout<<"請輸入第"<<i<<"個數據:"; cin>>p->data; p->next=l->next; l->next=p; } i=0; cout<<endl<<"輸出連結串列:"; for(p=l->next;p!=NULL;p=p->next) cout<<p->data<<" "; cout<<endl<<endl; return 0; } void mergelist(linklist &la,linklist &lb,linklist &lc) {//已知單鏈表la,lb以遞增順序排列 //歸併la,lb得到新連結串列lc,lc也以遞增順序排列 linklist pa,pb,pc,p; pa=la->next; pb=lb->next; lc=pc=la; //用la的頭結點做lc的頭結點 while(pa&&pb) //pa與pb都不為空時 { if(pa->data<=pb->data) { pc->next=pa; pc=pa; //pc指向lc中表中當前最後一個結點 pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } pc->next=pa?pa:pb; //插入剩餘段 free(lb); //釋放lb的頭結點 cout<<endl<<"輸出lc:"; for(p=lc->next;p!=NULL;p=p->next) cout<<p->data<<" "; cout<<endl<<endl; } int main() { linklist la,lb,lc; cout<<"建立la"<<endl; createlist(la,5); cout<<"建立lb"<<endl; createlist(lb,4); mergelist(la, lb,lc); }
輸出結果: