全文參看:這裡寫鏈結內容
一、題目要求
使用鍊錶實現多項式的相加,最終輸出相加的多項式。預設鍊錶的指數為遞增。輸入時依次輸入係數和指數,以0 0 作為結束標誌。
比如:
多項式a:1+2*x-4*x^4
多項式b:2-2*x+5^x^4
輸入:
0 1 2 1 -4 4 0 0
2 0 -2 1 5 4 0 0
輸出:3-4*x^3+5*x^4
二、題目分析
我們先要解決的問題是多項式的儲存問題,即它在計算機中的表現形式,很明顯我們只需要儲存了多項式的係數和指數即可以開始後面加法計算。這裡我們又兩種儲存方式,一種是線性儲存,另一種是鏈式儲存。
線性儲存,比如我們採用陣列來儲存這些資料,理論來說是可以的,但是由於我們的多項式的項數是不確定的,但陣列必須在剛開始就必須
先給定乙個初始的大小,這個初始大小我們不好確定,分配少了,沒法儲存全部多項式,分配多了,會造成空間浪費,所以我們在這裡採用鍊錶來儲存多項式,每次輸入乙個多項式節點,我們就分配乙個鍊錶的節點,這樣便可以合理的節約空間。
如圖中所示,我們準備了a、b兩個鍊錶
鍊錶a表示的多項式: 7 * x^1 + 2 * x^2 + 8 * x^5
鍊錶b表示的多項式: 2 * x^1 + (-2 * x^2) + 2 * x^3
鍊錶c是我們最終的和鍊錶
這裡我們按照這樣的步驟進行處理:
1 . 我們規定三個頭指標,分別指向三個鍊錶的頭,然後再規定三個移動指標,分別指向當前三個鍊錶中正在處理的那個節點
2 . 我們讓a、b、c的移動指標剛開始也處於頭指標的位置,然後,我們拿a第乙個節點中的指數和b第乙個節點中的指數進行比較,這個時候有三種情況:
a情況 . a中當前的節點指數 < b中當前的節點指數 —— 我們將a中的當前節點插入c中,然後向後移動a和c的指標(因為a中當前節點已經處理了)
b情況 . a中當前的節點指數 > b中當前的節點指數 —— 我們將b中的當前節點插入c中,然後向後移動b和c的指標(因為b中當前節點已經處理了) 即圖中⑧的情況。
c情況 . a中當前的節點指數 > b中當前的節點指數 —— 此時a和b當前節點指數相同,可以進行係數相加,這時候也會出現兩種情況:
情況1 . 係數之和不為0 —— 我們此時將係數之和放到a中的當前節點的係數域,然後將a中的該節點插入c中,然後向後移動c的指標(記住,我們這裡不是產生乙個新的節點,而是直接更改a的係數域,然後將a的當前節點插入c中),即圖中的①和②產生③的過程。
情況2 . 係數之和為0 —— 此時我們不能將係數和為0的項放入鍊錶c中,理論來說我們什麼都不用做,但是這裡有乙個小問題,因為按照情況1來看,我們在係數和不為0時是將a節點直接插到c中,我們假設我們在係數和為0後什麼都不做,繼續處理a中後續節點,後面遇到乙個係數和不為0的情況,我們將後面遇到的這個係數不為0的節點插入c中,那其實也將前面那個係數為0的項也一併插入c中了,以為前面那個係數為0的節點和其他後面的節點一直保持聯絡。所以我們此時必須在係數和為0時,將a中的當前節點刪除了。即圖中的④和⑤產生⑥的過程。
無論上面是情況1還是情況2,總之我們都同時處理了節點a和節點b,所以,我們還需要同時將節點a和b的移動指標向後移動。
這裡還有乙個情況,我們的a、b鍊錶可能長度不是一致的,那麼就有可能其中乙個鍊錶的移動指標已經移動到了末尾,那麼此時,我們就不需要繼續移動了,我們只需要將另乙個鍊錶中未處理的資料直接接在當前已經生產的c鍊錶的後面即可。
第三步:
列印輸出最終計算所得的和鍊錶表示式
三、**的實現
#include
#include
typedef struct node
node;
node *creat()
p->next=null;
return head;
} node *addpolylist(node *la,node *lb)//polynomial:多項式
else
if(pa->index==pb->index)
else
}else
}pc->next=(pa?pa:pb);
return
lc;}
void pri(node *head)
printf("\n");
}void main()
四、**執行驗證
略,上傳不上去。
為啥我複製的格式都這麼難看
鍊錶實現多項式相加
均已除錯通過,編譯器為dev c 多項式相加程式,用鍊錶實現 係數 coefficient 指數exponent 多項式 multinomial include typedef struct lnode lnode,linklist 建立兩個鍊錶 int main while pr1 next pr...
鍊錶實現多項式相加
演算法attch c,e,d 建立乙個新結點,其係數 coef c 指數exp e 並把它鏈到 d 所指結點之後,返回該結點指標。polypointer attch int c int e polypointer d 演算法 padd 實現兩個多項式 a b 相加 c x a x b x polyp...
c 鍊錶實現多項式相加
測試 測試結果 例如,已知多項式l 1l 1 l1 l 2l 2 l2 如下 l 1 4x 5 3x 4 2x 2 x 6 l 2 6x 7 5x 4 3x 3 7x end node,list 為鍊錶建立乙個頭結點,便於表示 void init list l 由於每次輸入時都是乙個節點 多項式的某...