用單鏈表儲存一元多項式,並實現兩個多項式的加法。
多項式的通式是pn
(x)=
anxn
+an−
1xn−
1+..
.+a1
x+a0
。n次多項式共有n+1項。直觀地,可以定義乙個陣列來儲存這n+1個係數。以多項式p(
x)=−
3.4x10−
9.6x8+
7.2x2+
x為例,儲存這個多項式的陣列如下圖:
可以看出,這種方案適合對某些多項式的處理。但是,在處理一些次數高但項數少的多項式時,存在浪費空間的現象,會有很多閒置的0。
可以使用如下定義的單鏈表結構儲存多項式:鍊錶中的每乙個結點是多項式中的一項,結點的資料域包括指數和係數兩部分,由指標域連線起多項式中的各項。
typedef struct pnode //定義單鏈表結點型別,儲存多項式中的一項,鍊錶構成多項式 polynode;
用於表示多項式的鍊錶將如下圖所示,在建立多項式的鍊錶時,已經令結點按指數由大到小的順序排列。
2、多項式加法在鍊錶儲存結構下的實現
鍊錶儲存結構下,多項式加法的實現 在如上定義的單鏈表儲存結構基礎上,討論實現多項式加法的演算法。
兩個多項式相加,其規則是對具有相同指數的項,令其係數相加。設兩個待相加的多項式的鍊錶的頭指標分別為head1(第乙個多項式)和head2(第二個多項式),兩者的和儲存到鍊錶head1中。只需要先將head1和head2鍊錶的首結點作為當前結點(分別用p1和p2指向)開始檢測,在遍歷鍊錶的過程中,分情況作如下處理:
(1)若兩個多項式中當前結點的指數值相同,則它們的係數相加,結果儲存到p1結點,並將p2結點刪除。如果相加後的係數不為0,p1指向第乙個多項式的下乙個結點,準備隨後的工作,否則,不儲存係數為0的項,將當前p1結點刪除。
(2)當兩個多項式中對應結點的指數值不相等時,若p1指向的結點的指數大,則p1簡單地指向下一結點即可;而p2指向的結點大時,需要將p2結點插入到p1前,然後p2再重新指回到第二個多項式中的下一結點,繼續進行處理。
(3)檢測過程直到其中的任乙個鍊錶結束。若p1不為空,第乙個多項式中的剩餘項已經在鍊錶中,不作處理,如果p2不為空,只需要將p2鏈結到相加後的第乙個多項式末尾。
上面的討論假設多項式鍊錶中,已經按指數由大到小排序,在加法之前,採取多種手段保證這一前提成立。
實現源**:
#include
#include
#define max 20 //多項式最多項數
typedef
struct
//定義存放多項式的陣列型別
polyarray;
typedef
struct
pnode
//定義單鏈表結點型別,儲存多項式中的一項,鍊錶構成多項式
polynode;
void
disppoly(polynode *l)
//輸出多項式
printf("\n"
);
} void
destroylist(polynode *&l)
//銷毀單鏈表
free(p);
} void
createlistr(polynode *&l, polyarray a,
intn)
//尾插法建表
r->next=null; //終端結點next域置為null
} void
sort(polynode *&head)
//按exp域遞減排序
} } void
add(polynode *ha,polynode *hb,polynode *&hc)
//求兩有序集合的並,完成加法
else
if(pa->expexp)
else
//pa->exp=pb->exp
pa=pa->next;
pb=pb->next;
} }
if(pb!=null) pa=pb;
//複製餘下的結點
while
(pa!=null)
tc->next=null;
} int
main()
,,,};
polyarray b= ,,,,};
createlistr(ha,a,4);
createlistr(hb,b,5);
printf("原多項式a: "
);
disppoly(ha);
printf("原多項式b: "
);
disppoly(hb);
sort(ha);
sort(hb);
printf("有序多項式a: "
);
disppoly(ha);
printf("有序多項式b: "
);
disppoly(hb);
add(ha,hb,hc);
printf("多項式相加: "
);
disppoly(hc);
destroylist(ha);
destroylist(hb);
destroylist(hc);
return
0;
}
執行結果截圖如下:
第四周專案三 資料結構實踐(二) 單鏈表 連線
檔名稱 linklist.cpp,main.cpp,linklist.h 完成日期 2015年9月23日 版本號 codeblocks 問題描述 已知l1和l2分別指向兩個單鏈表的頭結點,且已知其長度分別為m n,請設計演算法將l2連線到l1的後面。輸入描述 無 程式輸出 連線以後的結果。ifnde...
第四周專案二
檔名稱 array.cpp 作 者 李中意 完成日期 2014 年 3月 19 日 版本號 v1.0 輸入描述 無 include includeusing namespace std class void setb double y void setc double z double geta v...
第四周專案二
01.02.程式的版權和版本宣告部分 05.檔名稱 score.cpp 06.作 者 07.完成日期 2014年 3 月 25 日 08.版本號 v1.0 09.輸入描述 已經在程式中初始化 10.問題描述 11.輸出 12.include includeusing namespace std cl...