線性錶鏈表實現資料並集
阿新 • • 發佈:2018-12-16
使用連結串列來實現兩組資料的合併(求並集)。主要思想就是在兩個連結串列建立後(分別是1號連結串列和2號連結串列),先把其中一個(比如1號連結串列)複製給一個新連結串列(稱之為3號連結串列),在對2號連結串列進行遍歷,並把符合要求的資料繼續插入3號連結串列。直至2號連結串列遍歷結束,即完成。 以下是程式碼:
#include<bits/stdc++.h> using namespace std; struct ListNode { int date; ListNode *next; }; class List { ListNode *head; public: List(){head=new ListNode;head->next=NULL;} void buildList(); List hebing(List A,List B); void DisPlay(); }; void List::buildList() { ListNode *s,*r; r=head; while(1) { int a; cin>>a; if(a!=0) { s=new ListNode; s->date=a; r->next=s; r=s; } else break; } r->next=NULL; } List List::hebing(List A,List B) { List C; ListNode *p1=A.head->next; ListNode *p2=B.head->next; ListNode *s,*r; r=C.head; while(p1!=NULL) { s=new ListNode; s->date=p1->date; r->next=s; r=s; p1=p1->next; } r->next=NULL; while(p2!=NULL) { int judge=0; ListNode *p3=A.head->next; while(p3!=NULL) { if(p3->date==p2->date) { judge=1; p2=p2->next; break; } else p3=p3->next; } if(judge==0) { s=new ListNode; s->date=p2->date; r->next=s; r=s; p2=p2->next; } } r->next=NULL; return C; } void List::DisPlay() { ListNode *p=head->next; while(p!=NULL) { cout<<p->date<<" "; p=p->next; } cout<<endl; } int main() { List A,B,C; A.buildList(); B.buildList(); C=C.hebing(A,B); C.DisPlay(); return 0; }
需要注意的問題: 對2號連結串列遍歷時,內層迴圈為遍歷已經被複制到3號連結串列的1號連結串列。此時應針對1號連結串列的每個元素遍歷2號連結串列,如果出現相同直接break;如果全部不相同(設定一個judge值進行判斷),則把對應的2號連結串列這個數插入3號連結串列中。因此每次的內層迴圈應從頭開始,記得初始化指標。