线性表应用之线性表算法设计六大经典案例
目錄:
1.順序有序表的合并
???? ?? 重復式合并
???? ?? 不重復式合并
2.鏈式有序表的合并
???? ?? 重復式合并
???? ?? 不重復式合并
3.鏈式有序表的反序合并
4.兩個遞增鏈表的交集
5.兩個遞增鏈表的差集
6.6.稀疏多項式的合并
1.順序有序表的合并
1.1重復式合并
已知有兩個有序集合A和B按照遞增有序排列,現在有一個集合C =AUB,C也要按照遞增有序排列,舉例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,8,9,11,11,15,20}
void MergeList(SqList La,SqList Lb,SqList &Lc) {Lc.length=La.length+Lb.length;Lc.elem=new ElemType[Lc.length];ElemType *pc=Lc.elem;//pc指向集合C的第一個元素 ElemType *pa=La.elem;//pa指向集合A的第一個元素 ElemType *pb=Lb.elem;//pb指向集合B的第一個元素 ElemType *pa_last=La.elem+La.length-1;//指向A集合的尾元素 ElemType *pb_last=Lb.elem+Lb.length-1;//指向B集合的尾元素 while((pa<=pa_last)&&(pb<=pb_last)){if(*pa<=*pb)//比較兩個元素大小,小的在前大的在后 *pc++=*pa++;//賦值的同時指針向后移動 else*pc++=*pb++;}while(pa<=pa_last)//誰先結束誰再次循環 *pc++=*pa++;while(pb<=pb_last)*pc++=*pb++; }1.2不重復式合并
已知有兩個有序集合A和B按照遞增有序排列,現在有一個集合C =AUB,C也要按照遞增有序排列,舉例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,9,11,15,20}
void MergeList(SqList La,SqList Lb,SqList &Lc) {Lc.length=La.length+Lb.length;Lc.elem=new ElemType[Lc.length];ElemType *pc=Lc.elem;//pc指向集合C的第一個元素 ElemType *pa=La.elem;//pa指向集合A的第一個元素 ElemType *pb=Lb.elem;//pb指向集合B的第一個元素 ElemType *pa_last=La.elem+La.length-1;//指向A集合的尾元素 ElemType *pb_last=Lb.elem+Lb.length-1;//指向B集合的尾元素 while((pa<=pa_last)&&(pb<=pb_last)){if(*pa<*pb)//比較兩個元素大小,小的在前大的在后 *pc++=*pa++;//賦值的同時指針向后移動 else if(*pa>*pb){*pc++=*pb++;}else{*pc++=*pa++;//把兩者之一插入即可pb++;//兩個表的指針都要向后移動Lc.length--;//對于長度需要減1}}while(pa<=pa_last)//誰先結束誰再次循環 *pc++=*pa++;while(pb<=pb_last)*pc++=*pb++; }2.鏈式有序表的合并
已知有兩個有序集合A和B按照遞增有序排列,現在有一個集合C =AUB,C也要按照遞增有序排列,舉例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,8,9,11,11,15,20}
2.1重復式合并
已知有兩個有序集合A和B按照遞增有序排列,現在有一個集合C =AUB,C也要按照遞增有序排列,舉例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,8,9,11,11,15,20}
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)//兩鏈表合并 {LinkList pa,pb,pc;pa=La->next;pb=Lb->next;Lc=La;//讓la的頭結點作為lc的頭結點 pc=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;//當其中一個鏈表結束,那么插入另外一個鏈表的剩余的部分 delete Lb;//釋放Lb的頭結點 }2.2不重復式合并
已知有兩個有序集合A和B按照遞增有序排列,現在有一個集合C =AUB,C也要按照遞增有序排列,舉例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={2,3,5,6,8,9,11,15,20}
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)//兩鏈表合并 {LinkList pa,pb,pc,q;pa=La->next;pb=Lb->next;Lc=La;//讓la的頭結點作為lc的頭結點 pc=Lc; //pc初始化也指向la的頭結點 while(pa&&pb)//兩集合如果都沒到最后那么進行此循環進行,按照從小到大的順序將結點依次相連 {if(pa->data<pb->data){pc->next=pa;pc=pa;pa=pa->next;}else if(pa->data>pb->data){pc->next=pb;pc=pb;pb=pb->next;}else{pc->next=pa;pc=pa;pa=pa->next;q=pb->next;delete pb;pb=q;}}pc->next=pa?pa:pb;//當其中一個鏈表結束,那么插入另外一個鏈表的剩余的部分 delete Lb;//釋放Lb的頭結點 }3.鏈式有序表的反序合并
已知有兩個有序集合A和B按照遞增有序排列,現在有一個集合C =AUB,C也要按照遞減有序排列,舉例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={20,15,11,11,11,9,8,8,6,5,3,2}
#include<stdio.h> #include<iostream> using namespace std; #define OK 1 #define ERROR 0 #define MAXSIZE 100 typedef int Status; typedef int ElemType; typedef struct LNode{ElemType data;struct LNode *next; }LNode,*LinkList; Status InitList(LinkList &L)//初始化單鏈表 {L=new LNode;L->next=NULL;return OK; } void CreateList(LinkList &L,int n)//創建順序表函數,初始化前幾個元素 {LinkList p,q;q=L;for(int i=n;i>0;i--){p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p;} } void TraverseList_L(LinkList l)//遍歷集合 {l=l->next;while(l){if(l->next!=NULL)cout<<l->data<<",";elsecout<<l->data; l=l->next;} } void MergeList(LinkList &La,LinkList &Lb)//兩鏈表合并 {LinkList pa,pb,p;pa=La->next;pb=Lb->next; La->next=NULL;while(pa&&pb)//兩集合如果都沒到最后那么進行此循環進行,按照從小到大的順序將結點依次相連 {if(pa->data<=pb->data){p=pa->next;pa->next=La->next;La->next=pa;pa=p; }else{p=pb->next;pb->next=La->next;La->next=pb;pb=p;}}while(pa){p=pa->next;//把pa的后繼暫存于ppa->next=La->next;//將pa結點鏈接于結果表中,同時實現倒置La->next=pa;pa=p;}while(pb){p=pb->next;pb->next=La->next;La->next=pb;pb=p;}delete Lb;//釋放Lb的頭結點 } int main() { LinkList La;LinkList Lb;InitList(La);InitList(Lb);int n;int m;cout<<"請輸入在表A中添加的元素個數:";cin>>n; CreateList(La,n);cout<<"請輸入在表B中添加的元素個數:";cin>>m; CreateList(Lb,m);cout<<"兩表合并后的表c元素依次為:"; MergeList(La,Lb);TraverseList_L(La); }4.兩個遞增鏈表的交集
已知有兩個有序集合A和B按照遞增有序排列,現在有一個集合C =AUB,C也要按照遞減有序排列,舉例:A={3,5,8,11},B={2,6,8,9,11,15,20},那么C={8,11}
void Intersection(LinkList &La,LinkList &Lb,LinkList &Lc) {LinkList pa,pb,pc,q;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;q=pb;pb=pb->next;delete q; } else if(pa->data<pb->data){q=pa;pa=pa->next;delete q;}else{q=pb;pb=pb->next;delete q;}while(pa){q=pa;pa=pa->next;delete q;}while(pb){q=pb;pb=pb->next;delete q;}pc->next=NULL;delete Lb; } }5.兩個遞增鏈表的差集
我們有兩個鏈表A,B,差集表示的是指僅在A中出現而不再B中出現的元素所構成的集合,并返回該集合的個數
void Difference(LinkList &La,LinkList &Lb,LinkList &Lc) {LinkList pa,pb,pre,q;pa=La->next;pb=Lb->next;pre=La;int n=0;while(pa&&pb){if(pa->data<pb->date){n++;pre=pa;pa=pa->next;}else if(pa->data>pb->data)pb=pb->next;else{pre->next=pa->next;q=pa;pa=pa->next;delete q;}}while(pa){n++;pa=pa->next; } }6.稀疏多項式的合并
比如我們有兩個多項式A(x)=7+3x+9x8+5x17,B(x)=8x+22x7-9x8,要求把他們倆相加合并
#include<iostream> using namespace std; typedef struct PNode{float coef;//系數 int expn;//指數 struct PNode *next; }PNode,*Polynomial; void CreatePolyn(Polynomial &P,int n)//輸入n項系數和指數,建立多項式有序鏈表P {Polynomial s,pre,p,q;P=new PNode;//建立一個帶頭結點的單鏈表 P->next=NULL;for(int i=1;i<=n;i++){s=new PNode;//生成新的結點 cin>>s->coef>>s->expn;pre=P;//pre用于保存q的前驅,初值為頭結點 q=P->next;//q初始化指向第一個有元素的結點 while(q&&q->expn<s->expn)//通過比較指數找到第一個大于輸入項指數的項*q {pre=q;q=q->next;}s->next=q;//把新的結點s插在q和前驅結點之間 pre->next=s;} } void AddPolyn(Polynomial &pa,Polynomial &pb)//計算多項式的和 {float sum; Polynomial p1,p2,p3,r;p1=pa->next;//p1,p2分別指向第一個有元素的結點 p2=pb->next;p3=pa;//p3就是運算后的結果鏈表的頭指針,初始值為pa while(p1&&p2)//p1和p2均為非空 {if(p1->expn==p2->expn)//如果兩個指數相同 {sum=p1->coef+p2->coef;//系數相加 if(sum!=0){p1->coef=sum;//修改pa當前結點的系數值為兩項系數之和 p3->next=p1;// 將修改后的pa當前結點鏈在p3之后,p3指向p1 p3=p1;p1=p1->next;r=p2;p2=p2->next;delete r;}else{r=p1;p1=p1->next;delete r;r=p2;p2=p2->next;delete r;}}else if(p1->expn<p2->expn){p3->next=p1;p3=p1;p1=p1->next;}else{p3->next=p2;p3=p2;p2=p2->next;}} p3->next=p1?p1:p2;delete pb; } void print(Polynomial L1)//依次打印各個結點的系數和指數 {L1=L1->next;while(L1){cout<<endl<<L1->coef<<" "<<L1->expn<<endl; L1=L1->next;} } int main() {Polynomial L1;Polynomial L2;int n;int m;cout<<"請輸入第一個鏈表的元素個數和各個元素的系數和指數值:";cin>>n; CreatePolyn(L1,n);cout<<"請輸入第一個鏈表的元素個數和各個元素的系數和指數值:";cin>>m;CreatePolyn(L2,m);AddPolyn(L1,L2);cout<<"------------------------運行結果為----------------------------------\n"; print(L1); }總結
以上是生活随笔為你收集整理的线性表应用之线性表算法设计六大经典案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剑指offer之斐波那契问题(C++/J
- 下一篇: 时隔七个月,我终于弄懂了汉诺塔的思想