线性表实现一元多项式操作
?
數組存放:
不需要記錄冪,下標就是。
比如1,2,3,5表示1+2x+3x^2+5x^3
有了思路,我們很容易定義結構
typedef struct node{float * coef;//系數數組int maxSize;//最大容量int order;//最高階數 }Polynomial;先實現求和:我們想求兩個式子a+b,結果存在c中。
邏輯很簡單,就是相加啊。
void Add(Polynomial & A,Polynomial & B,Polynomial & C) {int i;int m=A.order;int n=B.order;for(i=0;i<=m && i<=n;i++)//共有部分加一起C.coef[i]=A.coef[i]+B.coef[i];while(i<=m)//只會執行一個,作用是把剩下的放入cC.coef[i]=A.coef[i];while(i<=n)C.coef[i]=B.coef[i];C.order=(m>n)?m:n;//等于較大項 }實現乘法:
我們思考一下,兩個多項式怎么相乘?
把a中每一項都和b中每一項乘一遍就好了。
高中知識
?
void Mul(Polynomial & A,Polynomial & B,Polynomial & C) {int i;int m=A.order;int n=B.order;if(m+n>C.maxSize){printf("超限");return;}for(i=0;i<=m+n;i++)//注意范圍,是最高項的冪加起來C.coef[i]=0.0;for(i=0;i<=m;i++){for(j=0;j<=n;j++){C.coef[i+j]+=A.coef[i]*B.coef[j];}}C.order=m+n;//注意范圍,是最高項的冪加起來 }?
利用數組存放雖然簡單,但是當冪相差很大時,會造成空間上的嚴重浪費(包括時間也是),所以我們考慮采用鏈表存儲。
?
我們思考一下如何存儲和做運算。
?
我們肯定要再用一個變量記錄冪了。每個節點記錄系數和指數。
考慮如何相加:
對于c,其實剛開始是空的,我們首先要實現一個插入功能,然后,遍歷a和b,進一步利用插入函數來不斷尾插。
因為a和b都是升冪排列,所以相加的時候,絕對不會發生結果冪小而后遇到的情況,所以放心的一直插入就好了。
具體實現也比較好想:a和b冪相等就加起來,不等就小的單獨插入,然后指針向后移。
加法就放老師寫的代碼吧,很漂亮的代碼:(沒和老師商量,希望不會被打)
老師原地插的,都一樣都一樣
老師原文:http://www.edu2act.net/article/shu-ju-jie-gou-xian-xing-biao-de-jing-dian-ying-yong/
void AddPolyn(polynomial &Pa, polynomial &Pb)//多項式的加法:Pa = Pa + Pb,利用兩個多項式的結點構成“和多項式”。 {LinkList ha = Pa; //ha和hb分別指向Pa和Pb的頭指針LinkList hb = Pb;LinkList qa = Pa->next;LinkList qb = Pb->next; //ha和hb分別指向pa和pb的前驅while (qa && qb) //如果qa和qb均非空{float sum = 0.0;term a = qa->data;term b = qb->data;switch (cmp(a,b)){case -1: //多項式PA中當前結點的指數值小ha = qa;qa = qa->next;break;case 0: //兩者指數值相等sum = a.coef + b.coef;if(sum != 0.0){ //修改多項式PA中當前結點的系數值qa->data.coef = sum;ha = qa;}else{ //刪除多項式PA中當前結點DelFirst(ha, qa);free(qa);}DelFirst(hb, qb);free(qb);qb = hb->next;qa = ha->next;break;case 1:DelFirst(hb, qb);InsFirst(ha, qb);qb = hb->next;ha = ha->next;break;}//switch}//whileif(!ListEmpty(Pb))Append(Pa,qb);DestroyList(hb);}//AddPolyn對于乘法,我們就不能一直往后插了,因為遍歷兩個式子,可能出現冪變小的情況。所以我們要實現一個插入函數,如果c中有這一項,就加起來,沒這一項就插入。
我們先實現插入函數:(哦,對了,我沒有像老師那樣把系數和指數再定義一個結構體,都放一起了。還有next我寫的link,還有點別的不一樣,都無傷大雅,絕對能看懂)
void Insert(Polynomial &L,float c,int e)//系數c,指數e {Term * pre=L;Term * p=L->link;while(p && p->exp<e)//查找{pre=p;p=p->link;}if(p->exp==e)//如果有這一項{if(p->coef+c)//如果相加是0了,就刪除節點{pre->link=p->link;free(p);}else//相加不是0,就合并{p->coef+=c;}}else//如果沒這一項,插入就好了,鏈表插入寫了很多遍了{Term * pc=new Term;//創建pc->exp=e;pc->coef=c;pre->link=pc;pc->link=p; } }插入寫完了,乘法就好實現了,還是兩個循環,遍歷a和b,只是最后調用Insert方法實現就ok
insert(c,乘系數,加冪)
?
拓展:一維數組可以模擬一元多項式。類似的,二維數組可以模擬二元多項式。實現以后有時間寫了再放鏈接。
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的线性表实现一元多项式操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode242. 有效的字母异位
- 下一篇: leetcode330. 按要求补齐数组