日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

第四周实践项目7 多项式求和

發(fā)布時(shí)間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四周实践项目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)

  多項(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ù)組如下圖:


這里寫(xiě)圖片描述
  可以看出,這種方案適合對(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。