链表应用——多项式相加
f(X)=1+x+x2+x5
g(X)=x3+x6+x8+x100
f(X)+g(X)=1+x+x2+x3+x5+x6+x8+x100
兩個有序多項式相加合并問題:?
顯然第一個想到的是用數(shù)組解決,可仔細想一想,數(shù)組有諸多弊端,比如大量空間浪費,無法同時存儲系數(shù)和指數(shù)(當然可以用結構體數(shù)組,但那不還是鏈表嗎),插入刪除都需移動大量數(shù)據(jù),索性,就用單鏈表解決吧
思路如下:
1)將f(X)和g(X)分別存儲在兩個單向鏈表內(nèi),每個節(jié)點存儲多項式的一項,內(nèi)含系數(shù)和指數(shù),并指向下一項節(jié)點,連貫成一個多項式,頭結點分別是head1,和head2;
2)接下來就是兩個多項式合并同類項了(初中貌似最喜歡做這玩意了,可計算機可不如你啊),用Node?*p1=head->next;?指向f(X)的第一個項節(jié)點(head節(jié)點均為無數(shù)據(jù)的表頭),
Node?*p2=head->next;指向g(X)的的一項;?在定義兩個指針pre1=head1、pre2=head2(一會兒有用),準備工作基本做完了。
3)此算法的關鍵在于將兩個有序鏈表合并成一個,并依然有序;只需將f(X)看成主串,g(X)看成插入串即可,遍歷g(X)的各節(jié)點,比較其與f(X)各節(jié)點指數(shù)的大小,小的就插在前面,大的話指針p1就往后移,相等就合并,如果f(X)先遍歷到結尾,說明g(X)的其余項都比f(X)的最后一項的指數(shù)大,只需將f(X)的最后一個節(jié)點指向g(x)的剩余節(jié)點即可,最后別忘了把head2刪了,因為它是個沒有數(shù)據(jù)的節(jié)點。
好了還是上代碼吧:
#include<iostream>using?namespace?std;
typedef?struct?node
{
????int?coe;?????//系數(shù)
????int?exp;?????//指數(shù)
????struct?node?*next;
}Node;
/生成鏈表
Node?*Create()
{
????Node?*head=new?Node;
????head->next=NULL;
????Node?*p=head;
????int?n;???????????//項數(shù)
????cout<<"N:";
????cin>>n;
????for(int?i=0;i<n;i++)
????{
??????p->next=new?Node?;
??????p=p->next;
??????cin>>p->coe>>p->exp;
??????p->next=NULL;
????}
????return?head;
}
int?main()
{
????Node?*head1=Create();
????Node?*head2=Create();
????Node?*p1=head1->next,*p2=head2->next;
????Node?*pre1=head1,*pre2=head2;?????//pre1指針用來指向比較節(jié)點的前一個節(jié)點
??????????????????????????????????????//pre2指針用作temp
????while(p1?&&?p2)
????{
????????if(p1->exp?<?p2->exp)
????????{
????????????pre1=p1;
????????????p1=p1->next;
????????}
????????else?if(p1->exp?>?p2->exp)
????????{
????????????pre1->next=p2;
????????????pre2=p2->next;
????????????p2->next=p1;
????????????p2=pre2;
????????????pre1=pre1->next;
????????}
????????else?if(p1->exp?==?p2->exp)
????????{
????????????p1->coe+=p2->coe;
????????????pre2=p2;
????????????p2=p2->next;
????????????delete?pre2;
????????}
????}
????if(p1==NULL)
????{
???????pre1->next=p2;
????}
????delete?head2;
???Node?*temp=head1->next;
???while(temp)
???{
??????cout<<temp->coe<<'X'<<'('<<temp->exp<<')'<<"?";
??????temp=temp->next;
????}
????return?0;
}?
?
轉(zhuǎn)載于:https://www.cnblogs.com/gavindlutsw/archive/2011/09/24/2189784.html
總結
以上是生活随笔為你收集整理的链表应用——多项式相加的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: httpclient4 中文版帮助文档,
- 下一篇: 服务行为 之 并发与实例化