@## 標題[toc]多項式計算機:實現兩個多項式的相加、相減及相乘計算,並輸出公升冪和降冪兩種結果形式。
此部落格所有內容均基於個人對資料結構的理解,僅供參考,若發現任何錯誤希望得到指點,衷心希望此內容對您有所幫助!接下來讓我們一起來學習資料結構吧!
多項式計算機實現有很多種方法,我們實現的方法是對同乙個鍊錶進行處理。鍊錶的乙個結點包括乙個指標域和兩個資料域如下:
typedef
struct node
lnode,
*linklist;
index為指數,coefficient為係數,next指向下乙個結點。所以我們就可以用乙個鍊錶實現所有的操作。
我們的路線是(以下每乙個操作均用函式實現):
先生成第乙個指數遞增的多項式
計算過程:逐個輸入第二個多項式的每一項並和第乙個多項式進行不同的處理
多項式處理:主要是刪除係數為0的結點和把指數為0的結點(常數項)的係數求和並提取出來。
/*在有序單鏈表中插入(加法)元素,鍊錶仍然有序(預設公升序),插入成功返回ok,插入失敗返回error*/
status insert_linklist_add
(linklist l, elemtype x, elemtype y)
else
if(x == q-
>index)
else
}init_linklist
(temp)
;//如果長度為0,則新結點為的第乙個結點,否則新結點接在最後
temp-
>index = x;
temp-
>coefficient = y;
temp-
>next =
null
; p-
>next = temp;
return ok;
}
通過利用上述函式,在公升序表中插入元素仍可以保持公升序狀態(指數遞增形式:通過對比指數的方式,實現了多項式的指數遞增)。當插入元素的指數與所對比的元素的指數相同時,則將插入元素的係數加到對比元素的係數上,保證了多項式中無指數相同的項。
/*建立指數遞增多項式(單鏈表)*/
status creatorder_linklist
(linklist &l)
此函式利用了上乙個單次插入函式,此函式主要是初始化了乙個鍊錶,用於計算以及儲存結果。另外,加了乙個while迴圈用於多項式每一項的輸入。
附:
/*初始化空表*/
status init_linklist
(linklist &l)
加法實現比較簡單,只需要把第二個多項式逐個插入第乙個多項式中即可。
(主函式部分)
case1:
printf
("請輸入被加數(多項式)\n");
if(creatorder_linklist
(la)
)//輸入第乙個多項式,creatorder_linklist(la)返回值為1
printf
("單鏈表建立成功\n");
else
printf
("單鏈表建立失敗\n");
printf
("請輸入加數(多項式)\n");
printf
("請順序輸入係數與指數(注意:資料成對輸入),係數輸入0停止輸入\n");
while
(scanf
("%d%d"
,&y,
&x)==
2&& y !=0)
//輸入第二個多項式(含結束條件)
insert_linklist_add
(la, x, y)
;//加法函式,逐個加入到第乙個多項式中
減法和加法實現差別,僅在於用於單次插入函式中乙個符號的不同,即在係數相等時將係數相加改為係數相減即可。修改部分在下面**中已做標記。
修正:對於最後指數最大的多項式未進行「負值」(在係數前加乙個負號)。
/*減法插入*/
status insert_linklist_subt
(linklist l, elemtype x, elemtype y)
else
if(x == q-
>index)
else
//否則 向後移位(繼續尋找)
p = p-
>next;
}init_linklist
(temp)
;//如果單鏈表的長度為0,則新結點為單鏈表的第乙個結點/亦或上述條件不滿足時,將新結點結在後面
temp-
>index = x;
temp-
>coefficient =
-y;//(修改處)負值處理
temp-
>next =
null
; p-
>next = temp;
return ok;
}
主函式部分如下:
(主函式部分)
case2:
printf
("請輸入被減數(多項式)\n");
if(creatorder_linklist
(la)
)//輸入第乙個多項式(creatorder_linklist(la)返回值為1)
printf
("單鏈表建立成功\n");
else
printf
("單鏈表建立失敗\n");
printf
("請輸入減數(多項式)\n");
printf
("請順序輸入係數與指數(注意:資料成對輸入),係數輸入0停止輸入\n");
while
(scanf
("%d%d"
,&y,
&x)==
2&& y !=0)
//輸入第二個多項式(含結束條件)
insert_linklist_subt
(la, x, y)
;//減法函式,逐個與第乙個多項式相減
/錯誤思路/:乘法實現過程相較於加法和減法則更容易實現也更容易理解,即將第二個多項式的每一項與第乙個多項式的所有項相乘即可。只需使第乙個多項式每一項的係數與第二個多項式所有項的係數相乘並求和;使第乙個多項式每一項的指數與第二個多項式所有項的係數相加。因為第乙個多項式本身就是指數遞增,那麼加上相同的指數和,得到的多項式仍然是指數遞增形式的。
/修改後/: 上面的乘法實現過程是錯誤的,我出現了比較嚴重的計算邏輯錯誤,在這裡向大家說聲抱歉! 在計算的過程中不可以改變la中儲存的資料(第乙個多項式),因為第二個多項式的每一項都必須與第乙個多項式的所有項相乘並最終相加,如果在計算的過程中改變了第乙個多項式的資料,那麼計算就已經失敗了。所以我們在建立乙個新錶lb,將第二個多項式每一項與第乙個多項式每一項相乘的結果都以相加的形式(使用加法函式)插入到lb中,那麼lb就是我們需要的結果。然後對lb進行處理和輸出即可。
乘法函式**如下:
/*乘法插入*/
status insert_linklist_multip
(linklist la, linklist lb, elemtype x, elemtype y)
}
主函式部分如下:
case3:
init_linklist
(lb)
;//生成鍊錶lb的頭節點(初始化空表)
printf
("請輸入被乘數(多項式)\n");
if(creatorder_linklist
(la)
)//輸入第乙個多項式
printf
("單鏈表建立成功\n");
else
printf
("單鏈表建立失敗\n");
printf
("請輸入乘數(多項式)\n");
printf
("請順序輸入係數與指數(注意:資料成對輸入),係數輸入0停止輸入\n");
while
(scanf
("%d%d"
,&y,
&x)==
2&& y !=0)
//輸入第二個多項式
insert_linklist_multip
(la, lb, x, y)
;//乘法函式
小結:以上就是實現計算部分,但是實際是係數為零的項無意義,指數為零的項為常數項,所以我們必須對此進行處理。
主要是刪除係數為0的結點和把指數為0的結點(常數項)的係數求和並提取出來。
/*刪除係數為零的結點,並將常數項(指數為零)求和,返回變數count中*/
void
deleven_linklist_coeff
(linklist l, elemtype &count)
else
if(q-
>index ==0)
else
}}
遍歷多項式的每一項,刪除係數為0的項,以及將指數為0的項(常數項)求和並儲存在count變數中。
公升序和降序兩種結果輸出:
多項式計算
計算多項式的值 3x2 1 輸入 多項式係數的個數,x的值 輸出 表示式的值 include stdafx.h include iomanip.h include iostream.h define maxsize 100 此多項式是的係數是按照從a0的係數開始輸入的 當x n前的係數為0時,就輸入...
計算多項式
一元多項式的計算用鍊錶實現,本題需要注意的是 1.係數為 1的項只輸出負號,例如1 x 4 2x 8 3x 10 15x 14 4x 18 2.當所有輸入均為0時,輸出結果0 3.如果階數較多的那個多項式剩下的項的係數為0不要建立新的結點 否則會輸出0x 160x 17 include includ...
計算多項式
一元多項式的計算用鍊錶實現,本題需要注意的是 1.係數為 1的項只輸出負號,例如1 x 4 2x 8 3x 10 15x 14 4x 18 2.當所有輸入均為0時,輸出結果0 3.如果階數較多的那個多項式剩下的項的係數為0不要建立新的結點 否則會輸出0x 160x 17 include includ...