![數(shù)據(jù)結(jié)構(gòu)C語言抽象數(shù)據(jù)類型Polynomial一元多項式實現(xiàn)文庫_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/21/5b64c7a9-16fc-4483-905c-a86445e7d391/5b64c7a9-16fc-4483-905c-a86445e7d3911.gif)
![數(shù)據(jù)結(jié)構(gòu)C語言抽象數(shù)據(jù)類型Polynomial一元多項式實現(xiàn)文庫_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/21/5b64c7a9-16fc-4483-905c-a86445e7d391/5b64c7a9-16fc-4483-905c-a86445e7d3912.gif)
![數(shù)據(jù)結(jié)構(gòu)C語言抽象數(shù)據(jù)類型Polynomial一元多項式實現(xiàn)文庫_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-2/21/5b64c7a9-16fc-4483-905c-a86445e7d391/5b64c7a9-16fc-4483-905c-a86445e7d3913.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、數(shù)據(jù)結(jié)構(gòu) C 語言版 抽象數(shù)據(jù)類型 Polynomial 一元多項式的實現(xiàn)文庫 .txt 生活是過出來的, 不是想出來的。放得下的是曾經(jīng),放不下的是記憶。無論我在哪里,我離你都只有一轉(zhuǎn)身的 距離。 /*數(shù)據(jù)結(jié)構(gòu) C 語言版 抽象數(shù)據(jù)類型 Polynomial 一元多項式的實現(xiàn)P42-43編譯環(huán)境: Dev-C+ 日期: 2011年 2月 10日*/ #include <stdio.h>#include <malloc.h>#include <stdlib.h> / 抽象數(shù)據(jù)類型 Polynomial 一元多項式的實現(xiàn)typedef struct /項的表示
2、, 多項式的項作為 LinkList 的數(shù)據(jù)元素float coef; / 系數(shù) int expn;/ 指數(shù)term, ElemType;/兩個類型名 :term用于本 ADT,ElemType 為 LinkList的數(shù)據(jù)對象名typedef struct LNode /ElemType data; struct LNode *next; LNode,*Link,*Position;結(jié)點類型typedef struct _LinkList / Link head,tail; /鏈表類型分別指向線性鏈表中的頭結(jié)點和最后一個結(jié)點int len;/ 指示當(dāng)前線性鏈表中數(shù)據(jù)元素的個數(shù)LinkList;
3、typedef LinkList polynomial; #define DestroyPolyn DestroyList #define PolynLength ListLength / 已知 p 指向線性鏈表 L 中的一個結(jié)點,返回 p 所指結(jié)點的直接前驅(qū)的位置 / 若無前驅(qū),則返回 NULLPosition PriorPos(LinkList L,Link p)Link q;q=L.head->next;if(q=p) / 無前驅(qū) return NULL;else while(q->next!=p) / q 不是 p 的直接前驅(qū) q=q->next;return q;/
4、 若升序鏈表 L 中存在與 e 滿足判定函數(shù) compare() 取值為 0 的元素,則 q 指示 L 中/第一個值為e的結(jié)點的位置,并返回1;否則q指示第一個與e滿足判定函數(shù)/ compare()取值>0 的元素的前驅(qū)的位置。并返回0。(用于一元多項式)int LocateElemP(LinkList L,ElemType e,Position *q, int(*compare)(ElemType,ElemType)Link p=L.head,pp;dopp=p; p=p->next;while(p&&(compare(p->data,e)<0); /
5、沒到表尾且 p->data.expn<e.expnif(!p|compare(p->data,e)>0) /到表尾或 compare(p->data,e)>0*q=pp; return 0;else / 找到*q=p; return 1; / h指向L的一個結(jié)點,把h當(dāng)做頭結(jié)點,刪除鏈表中的第一個結(jié)點并以q返回。/若鏈表為空(h指向尾結(jié)點),q=NULL返回0int DelFirst(LinkList *L,Link h,Link *q)*q=h->next;if(*q) / 鏈表非空 h->next=(*q)->next;if(!h-&g
6、t;next)/ 刪除尾結(jié)點(*L).tail=h; /修改尾指針(*L).len-;return 1;elsereturn 0; / 鏈表空/ 分配由 p 指向的值為 e 的結(jié)點,并返回 1;若分配失敗。則返回 0 int MakeNode(Link *p,ElemType e)*p = (Link)malloc(sizeof(LNode);/ 動態(tài)分配一個 Link 空間if(!*p)return 0;(*p)->data = e; / 賦值return 1;/ 釋放 p 所指結(jié)點void FreeNode(Link *p)free(*p); / 老規(guī)矩,先釋放存儲空間,然后置空*p
7、=NULL;/ h 指向 L 的一個結(jié)點,把 h 當(dāng)做頭結(jié)點,將 s 所指結(jié)點插入在第一個結(jié)點之前 / 頭結(jié)點沒有數(shù)據(jù)域,而第一個結(jié)點是 h->nextint InsFirst(LinkList *L,Link h,Link s)s->next = h->next;h->next=s;if(h=(*L).tail)/ 如果 h 指向尾結(jié)點(*L).tail=h->next;/ 修改尾指針(*L).len+;return 1;/ 按有序判定函數(shù) compare() 的約定,將值為 e 的結(jié)點插入或合并到升序/ 鏈表 L 的適當(dāng)位置int OrderInsertMer
8、ge(LinkList *L,ElemType e,int(* compare)(term,term)Position q,s;if(LocateElemP(*L,e,&q,compare) / L中存在該指數(shù)項q->data.coef+=e.coef; / 改變當(dāng)前結(jié)點系數(shù)的值if(!q->data.coef) / 系數(shù)為 0 / 刪除多項式 L 中當(dāng)前結(jié)點s = PriorPos(*L,q); / s 為當(dāng)前結(jié)點的前驅(qū) if(!s) / q 無前驅(qū)s=(*L).head; DelFirst(L,s,&q); FreeNode(&q); return 1;
9、else / 生成該指數(shù)項并插入鏈表 if(MakeNode(&s,e) / 生成結(jié)點成功 InsFirst(L,q,s); return 1;else / 生成結(jié)點失敗 return 0;/依a的指數(shù)值 <、=或>b的指數(shù)值,分別返回-1、0或+1/ CreatPolyn() 的實參int cmp(term a,term b)if(a.expn=b.expn)return 0;elsereturn (a.expn-b.expn)/abs(a.expn-b.expn);/ 構(gòu)造一個空的線性鏈表int InitList(LinkList *L)Link p;p=(Link)m
10、alloc(sizeof(LNode); /生成頭結(jié)點if(p)p->next=NULL;/ 將頭尾結(jié)點都分配好,并將其下一結(jié)點置空 (*L).head=(*L).tail=p;(*L).len=0; / 初始為 0return 1;else / 分配失敗返回 return 0;/ 算法 2.22 P42/輸入m項的系數(shù)和指數(shù),建立表示一元多項式的有序鏈表Pvoid CreatPolyn(polynomial *P,int m)Position q,s;term e;int i;InitList(P);printf(”請依次輸入d個系數(shù),指數(shù):(空格)n”,m);for(i=1;i<
11、;=m;+i)/依次輸入m個非零項(可按任意順序) scanf("%f%d",&e.coef,&e.expn);/ 當(dāng)前鏈表中不存在該指數(shù)項 ,cmp 是實參 if(!LocateElemP(*P,e,&q,cmp)if(MakeNode(&s,e) / 生成結(jié)點并插入鏈表 InsFirst(P,q,s);/ 返回線性鏈表 L 中頭結(jié)點的位置Position GetHead(LinkList L)return L.head;/ 已知 p 指向線性鏈表 L 中的一個結(jié)點,返回p 所指結(jié)點的直接后繼的位置/ 若無后繼,則返回 NULLPositi
12、on NextPos(Link p)return p->next;/ 已知 p 指向線性鏈表中的一個結(jié)點,返回 p 所指結(jié)點中數(shù)據(jù)元素的值 ElemType GetCurElem(Link p)return p->data;/將指針s(s->data為第一個數(shù)據(jù)元素)所指(彼此以指針相鏈,以NULL結(jié)尾)的 / 一串結(jié)點鏈接在線性鏈表 L 的最后一個結(jié)點之后 , 并改變鏈表 L 的尾指針指向新 / 的尾結(jié)點int Append(LinkList *L,Link s)int i=1;/ 記錄 s 為頭的串結(jié)點個數(shù)(*L).tail->next=s;/ 尾結(jié)點指向 swhi
13、le(s->next)s=s->next;i+;(*L).tail=s;(*L).len+=i; return 1;/ 若線性鏈表 L 為空表,則返回 1,否則返回 0int ListEmpty(LinkList L)if(L.len)return 0;elsereturn 1;/ 將線性鏈表 L 重置為空表(頭尾結(jié)點相同為空表) ,并釋放原鏈表的結(jié)/ 點空間,不釋放頭尾結(jié)點,只是置空而已int ClearList(LinkList *L)Link p,q; if(*L).head!=(*L).tail)/不是空表p=q=(*L).head->next;(*L).head-&
14、gt;next=NULL;while(p!=(*L).tail)p=q->next; free(q); q=p;free(q);(*L).tail=(*L).head;(*L).len=0;return 1;/ 銷毀線性鏈表 L,L 不再存在int DestroyList(LinkList *L)ClearList(L);/ 清空鏈表(頭尾結(jié)點并沒有釋放)FreeNode(&(*L).head);/ 再釋放頭尾結(jié)點(*L).tail=NULL;(*L).len=0;return 1;/ 算法 2.23 P43/ 多項式加法 :Pa=Pa+Pb, 并銷毀一元多項式 Pbvoid A
15、ddPolyn(polynomial *Pa,polynomial *Pb)Position ha,hb,qa,qb;term a,b;ha=GetHead(*Pa);hb=GetHead(*Pb); / ha 和 hb 分別指向 Pa 和 Pb 的頭結(jié)點 qa=NextPos(ha);qb=NextPos(hb); / qa 和 qb 分別指向 Pa 和 Pb 中當(dāng)前結(jié)點(現(xiàn)為第一個結(jié)點) while(!ListEmpty(*Pa)&&!ListEmpty(*Pb)&&qa) / Pa 和 Pb 均非空且 ha 沒指向尾結(jié)點 (qa!=0) a=GetCurE
16、lem(qa);b=GetCurElem(qb); / a 和 b 為兩表中當(dāng)前比較元素 switch(cmp(a,b)case -1:ha=qa; / 多項式 Pa 中當(dāng)前結(jié)點的指數(shù)值小 qa=NextPos(ha); / ha 和 qa 均向后移一個結(jié)點 break;case 0: qa->data.coef+=qb->data.coef;/兩者的指數(shù)值相等,修改Pa當(dāng)前結(jié)點的系數(shù)值if(qa->data.coef=0)/系數(shù)和為0,則刪除多項式Pa中當(dāng)前結(jié)點DelFirst(Pa,ha,&qa);FreeNode(&qa); elseha=qa;DelF
17、irst(Pb,hb,&qb);FreeNode(&qb);qb=NextPos(hb);qa=NextPos(ha);break;case 1:DelFirst(Pb,hb,&qb); / 多項式 Pb 中當(dāng)前結(jié)點的指數(shù)值小 InsFirst(Pa,ha,qb);ha=ha->next;qb=NextPos(hb);if(!ListEmpty(*Pb)(*Pb).tail=hb;Append(Pa,qb); / 鏈接 Pb 中剩余結(jié)點DestroyPolyn(Pb); / 銷毀 Pb/ 另一種多項式加法的算法:Pa=Pa+Pb, 并銷毀一元多項式 Pbvoid
18、AddPolyn1(polynomial *Pa,polynomial *Pb)Position qb;term b;qb=GetHead(*Pb); / qb 指向 Pb 的頭結(jié)點 qb=qb->next; / qb 指向 Pb 的第一個結(jié)點 while(qb)b=GetCurElem(qb);OrderInsertMerge(Pa,b,cmp); qb=qb->next;DestroyPolyn(Pb); / 銷毀 Pb/ 一元多項式系數(shù)取反 void Opposite(polynomial Pa) Position p; p=Pa.head;while(p->next)
19、 p=p->next; p->data.coef*=-1;/ 多項式減法 :Pa=Pa-Pb, 并銷毀一元多項式 Pb void SubtractPolyn(polynomial *Pa,polynomial *Pb) Opposite(*Pb);AddPolyn(Pa,Pb);/ 多項式乘法 :Pa=PaPb, 并銷毀一元多項式 Pb void MultiplyPolyn(polynomial *Pa,polynomial *Pb) polynomial Pc;Position qa,qb;term a,b,c;InitList(&Pc); qa=GetHead(*Pa)
20、; qa=qa->next; while(qa)a=GetCurElem(qa); qb=GetHead(*Pb);qb=qb->next; while(qb) b=GetCurElem(qb); c.coef=a.coef*b.coef; c.expn=a.expn+b.expn; OrderInsertMerge(&Pc,c,cmp); qb=qb->next; qa=qa->next;DestroyPolyn(Pb); / 銷毀 PbClearList(Pa); / 將 Pa 重置為空表 (*Pa).head=Pc.head;(*Pa).tail=Pc.t
21、ail;(*Pa).len=Pc.len;/ 打印輸出一元多項式 Pvoid PrintPolyn(polynomial P)Link q;q=P.head->next; / q 指向第一個結(jié)點printf(" 系數(shù) 指數(shù) n");while(q)printf("%f %dn",q->data.coef,q->data.expn); q=q->next;int main()polynomial p,q;int m;/ 多項式相加printf(" 兩個一元多項式相加 n");/ 構(gòu)建一個多項式printf(&qu
22、ot; 請輸入第一個一元多項式的非零項的個數(shù): "); scanf("%d",&m);CreatPolyn(&p,m);/ 構(gòu)建另一個多項式printf(" 請輸入第二個一元多項式的非零項的個數(shù): "); scanf("%d",&m);CreatPolyn(&q,m);/ 多項式相加AddPolyn(&p,&q);printf(" 兩個一元多項式相加的結(jié)果: n");/ 打印多項式PrintPolyn(p);/ 使用另一種多項式相加的方法printf(&qu
23、ot;n 兩個一元多項式相加 ( 另一種方法 )n"); printf(" 請輸入第三個一元多項式的非零項的個數(shù): "); scanf("%d",&m);CreatPolyn(&p,m);printf(" 請輸入第四個一元多項式的非零項的個數(shù): "); scanf("%d",&m);CreatPolyn(&q,m);/ 多項式相加的另一種方法 AddPolyn1(&p,&q);printf(" 兩個一元多項式相加的結(jié)果 (另一種方法 ) :n&qu
24、ot;); PrintPolyn(p);/ 多項式相減printf("n 兩個一元多項式相減 n");printf(" 請輸入第五個個一元多項式的非零項的個數(shù): "); scanf("%d",&m);CreatPolyn(&p,m);printf(" 請輸入第六個一元多項式的非零項的個數(shù): "); scanf("%d",&m);CreatPolyn(&q,m);/ 多項式相減 SubtractPolyn(&p,&q);printf(" 兩個一元多項式相減的結(jié)果: n"); PrintPolyn(p);/ 多項式相乘printf("n 兩個一元多項式相乘 n");printf(" 請輸入第七個個一元多項式的非零項的個數(shù): "); scanf("%d",&m);CreatPolyn(&p,m);printf(" 請輸入第八個一元多項式的非零項的個數(shù): "); scanf("%d",&m)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年電子系統(tǒng)項目可行性研究報告
- 成都2025年四川省成都市雙流區(qū)西航港第二初級中學(xué)招聘教師3人筆試歷年參考題庫附帶答案詳解
- 2025年智能泥漿儲量檢測儀項目可行性研究報告
- 2025年摩托車大架項目可行性研究報告
- 2025年對開機項目可行性研究報告
- 2025年可調(diào)開電源項目可行性研究報告
- 2025至2031年中國不銹鋼化妝鏡行業(yè)投資前景及策略咨詢研究報告
- 2025年三層氣泡膜機組項目可行性研究報告
- 2025至2030年集裝箱標(biāo)角件項目投資價值分析報告
- 2025至2030年通訊口光隔離保護器項目投資價值分析報告
- 針對老年人的交通安全宣傳
- 2023年廣東省公務(wù)員錄用考試《行測》真題及答案解析
- 中央空調(diào)系統(tǒng)維保服務(wù)報價清單
- 2024年山西省中考數(shù)學(xué)試卷含答案
- 2024小學(xué)語文課標(biāo)培訓(xùn)
- 初中數(shù)學(xué)幾何《將軍飲馬》模型題匯編含答案解析
- 基于大數(shù)據(jù)分析的市場營銷策略優(yōu)化探討
- 《鴻門宴》優(yōu)教課件1
- GB/T 44325-2024工業(yè)循環(huán)冷卻水零排污技術(shù)規(guī)范
- 工廠用電安全培訓(xùn)課件(課件)
- 風(fēng)電項目施工進(jìn)度計劃
評論
0/150
提交評論