第四周实践项目7 多项式求和
生活随笔
收集整理的這篇文章主要介紹了
第四周实践项目7 多项式求和
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/*
*Copyright (c) 2017,煙臺(tái)大學(xué)計(jì)算機(jī)與控制工程學(xué)院
*All rights reserved.
*文件名稱:項(xiàng)目7- 用單鏈表存儲(chǔ)一元多項(xiàng)式,并實(shí)現(xiàn)兩個(gè)多項(xiàng)式的加法。
*作 者:邵雪源
*完成日期:2017年12月13日
*版 本 號(hào):v1.0
*/
#include <stdio.h>
#include <malloc.h>
#define MAX 20 //多項(xiàng)式最多項(xiàng)數(shù)
typedef struct //定義存放多項(xiàng)式的數(shù)組類型
{double coef; //系數(shù)int exp; //指數(shù)
} PolyArray;typedef struct pnode //定義單鏈表結(jié)點(diǎn)類型,保存多項(xiàng)式中的一項(xiàng),鏈表構(gòu)成多項(xiàng)式
{double coef; //系數(shù)int exp; //指數(shù)struct pnode *next;
} PolyNode;void DispPoly(PolyNode *L) //輸出多項(xiàng)式
{bool first=true; //first為true表示是第一項(xiàng)PolyNode *p=L->next;while (p!=NULL){if (first)first=false;else if (p->coef>0)printf("+");if (p->exp==0)printf("%g",p->coef);else if (p->exp==1)printf("%gx",p->coef);elseprintf("%gx^%d",p->coef,p->exp);p=p->next;}printf("\n");
}void DestroyList(PolyNode *&L) //銷毀單鏈表
{PolyNode *p=L,*q=p->next;while (q!=NULL){free(p);p=q;q=p->next;}free(p);
}void CreateListR(PolyNode *&L, PolyArray a[], int n) //尾插法建表
{PolyNode *s,*r;int i;L=(PolyNode *)malloc(sizeof(PolyNode)); //創(chuàng)建頭結(jié)點(diǎn)L->next=NULL;r=L; //r始終指向終端結(jié)點(diǎn),開(kāi)始時(shí)指向頭結(jié)點(diǎn)for (i=0; i<n; i++){s=(PolyNode *)malloc(sizeof(PolyNode));//創(chuàng)建新結(jié)點(diǎn)s->coef=a[i].coef;s->exp=a[i].exp;r->next=s; //將*s插入*r之后r=s;}r->next=NULL; //終端結(jié)點(diǎn)next域置為NULL
}void Sort(PolyNode *&head) //按exp域遞減排序
{PolyNode *p=head->next,*q,*r;if (p!=NULL) //若原單鏈表中有一個(gè)或以上的數(shù)據(jù)結(jié)點(diǎn){r=p->next; //r保存*p結(jié)點(diǎn)后繼結(jié)點(diǎn)的指針p->next=NULL; //構(gòu)造只含一個(gè)數(shù)據(jù)結(jié)點(diǎn)的有序表p=r;while (p!=NULL){r=p->next; //r保存*p結(jié)點(diǎn)后繼結(jié)點(diǎn)的指針q=head;while (q->next!=NULL && q->next->exp>p->exp)q=q->next; //在有序表中找插入*p的前驅(qū)結(jié)點(diǎn)*qp->next=q->next; //將*p插入到*q之后q->next=p;p=r;}}
}void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc) //求兩有序集合的并,完成加法
{PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;double c;hc=(PolyNode *)malloc(sizeof(PolyNode)); //創(chuàng)建頭結(jié)點(diǎn)tc=hc;while (pa!=NULL && pb!=NULL){if (pa->exp>pb->exp){s=(PolyNode *)malloc(sizeof(PolyNode)); //復(fù)制結(jié)點(diǎn)s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}else if (pa->exp<pb->exp){s=(PolyNode *)malloc(sizeof(PolyNode)); //復(fù)制結(jié)點(diǎn)s->exp=pb->exp;s->coef=pb->coef;tc->next=s;tc=s;pb=pb->next;}else //pa->exp=pb->exp{c=pa->coef+pb->coef;if (c!=0) //系數(shù)之和不為0時(shí)創(chuàng)建新結(jié)點(diǎn){s=(PolyNode *)malloc(sizeof(PolyNode)); //復(fù)制結(jié)點(diǎn)s->exp=pa->exp;s->coef=c;tc->next=s;tc=s;}pa=pa->next;pb=pb->next;}}if (pb!=NULL) pa=pb; //復(fù)制余下的結(jié)點(diǎn)while (pa!=NULL){s=(PolyNode *)malloc(sizeof(PolyNode)); //復(fù)制結(jié)點(diǎn)s->exp=pa->exp;s->coef=pa->coef;tc->next=s;tc=s;pa=pa->next;}tc->next=NULL;
}int main()
{PolyNode *ha,*hb,*hc;PolyArray a[]= {{1.2,0},{2.5,1},{3.2,3},{-2.5,5}};PolyArray b[]= {{-1.2,0},{2.5,1},{3.2,3},{2.5,5},{5.4,10}};CreateListR(ha,a,4);CreateListR(hb,b,5);printf("原多項(xiàng)式A: ");DispPoly(ha);printf("原多項(xiàng)式B: ");DispPoly(hb);Sort(ha);Sort(hb);printf("有序多項(xiàng)式A: ");DispPoly(ha);printf("有序多項(xiàng)式B: ");DispPoly(hb);Add(ha,hb,hc);printf("多項(xiàng)式相加: ");DispPoly(hc);DestroyList(ha);DestroyList(hb);DestroyList(hc);return 0;
}
提示:
1、存儲(chǔ)多項(xiàng)式的數(shù)據(jù)結(jié)構(gòu)
可以看出,這種方案適合對(duì)某些多項(xiàng)式的處理。但是,在處理一些次數(shù)高但項(xiàng)數(shù)少的多項(xiàng)式時(shí),存在浪費(fèi)空間的現(xiàn)象,會(huì)有很多閑置的0。
可以使用如下定義的單鏈表結(jié)構(gòu)存儲(chǔ)多項(xiàng)式:鏈表中的每一個(gè)結(jié)點(diǎn)是多項(xiàng)式中的一項(xiàng),結(jié)點(diǎn)的數(shù)據(jù)域包括指數(shù)和系數(shù)兩部分,由指針域連接起多項(xiàng)式中的各項(xiàng)。
typedef struct pnode //定義單鏈表結(jié)點(diǎn)類型,保存多項(xiàng)式中的一項(xiàng),鏈表構(gòu)成多項(xiàng)式?
{
double coef; //系數(shù),浮點(diǎn)數(shù)
int exp; //指數(shù),正整數(shù)*
struct pnode *next; //指向下一項(xiàng)的指針
} PolyNode;
用于表示多項(xiàng)式的鏈表將如下圖所示,在建立多項(xiàng)式的鏈表時(shí),已經(jīng)令結(jié)點(diǎn)按指數(shù)由大到小的順序排列。
這里寫(xiě)圖片描述
2、多項(xiàng)式加法在鏈表存儲(chǔ)結(jié)構(gòu)下的實(shí)現(xiàn)
鏈表存儲(chǔ)結(jié)構(gòu)下,多項(xiàng)式加法的實(shí)現(xiàn) 在如上定義的單鏈表存儲(chǔ)結(jié)構(gòu)基礎(chǔ)上,討論實(shí)現(xiàn)多項(xiàng)式加法的算法。
兩個(gè)多項(xiàng)式相加,其規(guī)則是對(duì)具有相同指數(shù)的項(xiàng),令其系數(shù)相加。設(shè)兩個(gè)待相加的多項(xiàng)式的鏈表的頭指針?lè)謩e為head1(第一個(gè)多項(xiàng)式)和head2(第二個(gè)多項(xiàng)式),兩者的和保存到鏈表head1中。只需要先將head1和head2鏈表的首結(jié)點(diǎn)作為當(dāng)前結(jié)點(diǎn)(分別用p1和p2指向)開(kāi)始檢測(cè),在遍歷鏈表的過(guò)程中,分情況作如下處理:
(1)若兩個(gè)多項(xiàng)式中當(dāng)前結(jié)點(diǎn)的指數(shù)值相同,則它們的系數(shù)相加,結(jié)果保存到p1結(jié)點(diǎn),并將p2結(jié)點(diǎn)刪除。如果相加后的系數(shù)不為0,p1指向第一個(gè)多項(xiàng)式的下一個(gè)結(jié)點(diǎn),準(zhǔn)備隨后的工作,否則,不保存系數(shù)為0的項(xiàng),將當(dāng)前p1結(jié)點(diǎn)刪除。
(2)當(dāng)兩個(gè)多項(xiàng)式中對(duì)應(yīng)結(jié)點(diǎn)的指數(shù)值不相等時(shí),若p1指向的結(jié)點(diǎn)的指數(shù)大,則p1簡(jiǎn)單地指向下一結(jié)點(diǎn)即可;而p2指向的結(jié)點(diǎn)大時(shí),需要將p2結(jié)點(diǎn)插入到p1前,然后p2再重新指回到第二個(gè)多項(xiàng)式中的下一結(jié)點(diǎn),繼續(xù)進(jìn)行處理。
(3)檢測(cè)過(guò)程直到其中的任一個(gè)鏈表結(jié)束。若p1不為空,第一個(gè)多項(xiàng)式中的剩余項(xiàng)已經(jīng)在鏈表中,不作處理,如果p2不為空,只需要將p2鏈接到相加后的第一個(gè)多項(xiàng)式末尾。
提示:
1、存儲(chǔ)多項(xiàng)式的數(shù)據(jù)結(jié)構(gòu)
多項(xiàng)式的通式是pn(x)=anxn+an?1xn?1+...+a1x+a0。n次多項(xiàng)式共有n+1項(xiàng)。直觀地,可以定義一個(gè)數(shù)組來(lái)存儲(chǔ)這n+1個(gè)系數(shù)。以多項(xiàng)式p(x)=?3.4x10?9.6x8+7.2x2+x為例,存儲(chǔ)這個(gè)多項(xiàng)式的數(shù)組如下圖:
可以看出,這種方案適合對(duì)某些多項(xiàng)式的處理。但是,在處理一些次數(shù)高但項(xiàng)數(shù)少的多項(xiàng)式時(shí),存在浪費(fèi)空間的現(xiàn)象,會(huì)有很多閑置的0。
可以使用如下定義的單鏈表結(jié)構(gòu)存儲(chǔ)多項(xiàng)式:鏈表中的每一個(gè)結(jié)點(diǎn)是多項(xiàng)式中的一項(xiàng),結(jié)點(diǎn)的數(shù)據(jù)域包括指數(shù)和系數(shù)兩部分,由指針域連接起多項(xiàng)式中的各項(xiàng)。
typedef struct pnode //定義單鏈表結(jié)點(diǎn)類型,保存多項(xiàng)式中的一項(xiàng),鏈表構(gòu)成多項(xiàng)式?
{
double coef; //系數(shù),浮點(diǎn)數(shù)
int exp; //指數(shù),正整數(shù)*
struct pnode *next; //指向下一項(xiàng)的指針
} PolyNode;
用于表示多項(xiàng)式的鏈表將如下圖所示,在建立多項(xiàng)式的鏈表時(shí),已經(jīng)令結(jié)點(diǎn)按指數(shù)由大到小的順序排列。
這里寫(xiě)圖片描述
2、多項(xiàng)式加法在鏈表存儲(chǔ)結(jié)構(gòu)下的實(shí)現(xiàn)
鏈表存儲(chǔ)結(jié)構(gòu)下,多項(xiàng)式加法的實(shí)現(xiàn) 在如上定義的單鏈表存儲(chǔ)結(jié)構(gòu)基礎(chǔ)上,討論實(shí)現(xiàn)多項(xiàng)式加法的算法。
兩個(gè)多項(xiàng)式相加,其規(guī)則是對(duì)具有相同指數(shù)的項(xiàng),令其系數(shù)相加。設(shè)兩個(gè)待相加的多項(xiàng)式的鏈表的頭指針?lè)謩e為head1(第一個(gè)多項(xiàng)式)和head2(第二個(gè)多項(xiàng)式),兩者的和保存到鏈表head1中。只需要先將head1和head2鏈表的首結(jié)點(diǎn)作為當(dāng)前結(jié)點(diǎn)(分別用p1和p2指向)開(kāi)始檢測(cè),在遍歷鏈表的過(guò)程中,分情況作如下處理:
(1)若兩個(gè)多項(xiàng)式中當(dāng)前結(jié)點(diǎn)的指數(shù)值相同,則它們的系數(shù)相加,結(jié)果保存到p1結(jié)點(diǎn),并將p2結(jié)點(diǎn)刪除。如果相加后的系數(shù)不為0,p1指向第一個(gè)多項(xiàng)式的下一個(gè)結(jié)點(diǎn),準(zhǔn)備隨后的工作,否則,不保存系數(shù)為0的項(xiàng),將當(dāng)前p1結(jié)點(diǎn)刪除。
(2)當(dāng)兩個(gè)多項(xiàng)式中對(duì)應(yīng)結(jié)點(diǎn)的指數(shù)值不相等時(shí),若p1指向的結(jié)點(diǎn)的指數(shù)大,則p1簡(jiǎn)單地指向下一結(jié)點(diǎn)即可;而p2指向的結(jié)點(diǎn)大時(shí),需要將p2結(jié)點(diǎn)插入到p1前,然后p2再重新指回到第二個(gè)多項(xiàng)式中的下一結(jié)點(diǎn),繼續(xù)進(jìn)行處理。
(3)檢測(cè)過(guò)程直到其中的任一個(gè)鏈表結(jié)束。若p1不為空,第一個(gè)多項(xiàng)式中的剩余項(xiàng)已經(jīng)在鏈表中,不作處理,如果p2不為空,只需要將p2鏈接到相加后的第一個(gè)多項(xiàng)式末尾。
上面的討論假設(shè)多項(xiàng)式鏈表中,已經(jīng)按指數(shù)由大到小排序,在加法之前,采取多種手段保證這一前提成立。
總結(jié)
以上是生活随笔為你收集整理的第四周实践项目7 多项式求和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 第四周实践项目6 循环双链表应用
- 下一篇: 第四周实践项目8 C++标准模板库与数据