一元多項式相加問題 一、 問題描述 通過鍵盤輸入兩個形如 P 0 +P 1 X 1 +P 2 X 2 +…+P n X 的多項式,經過程序運后在屏幕上輸出它們的相加和。
二、數據結構設計 一個一元多項式的每一個子項都由“系數-指數”兩部分組成,因此可將其抽象為包含系數 coef、指數 exp、指針域 next 構成的鏈式線性表。將兩個多項式分別存放在兩個線性表中,然后經過相加后將所得多項式存放在一個新的線性表中,但是不用再開辟新的存儲空間,只依靠結點的移動來構成新的線性表,期間可以將某些不需要的空間回收。基于這樣的分析,可以采用不帶頭結點的單鏈表來表示一個一元多項式。具體數據類型定義為:
struct node {
float coef;
//系數域
int exp;
//指數域
struct node *next; }; 三、 功能函數設計 1、 輸入多項式的系數和指數初始化多項式的功能模塊 具體函數為 node *in_fun() 此函數的處理較為全面,要求用戶按照指數遞增的順序和一定的輸入格式輸入各個系數不為 0 的子項,輸入一個子項建立一個相關結點,當遇到輸入結束標志時停止輸入。關鍵步驟具體如下:
⑴控制用戶按照指數遞增的順序輸入
r=a; while(r!=q->next)
{
if(y<=r->exp)
{
cout<<"請按照指數遞增順序輸入,請重新輸入";
cin>>x>>y;
break;
}
r=r->next;
} 從頭開始遍歷,若遇到目前輸入的指數不是最大時,就跳出循環,讓用戶重新輸入。
⑵當輸入的系數為零時,不為其分配存儲空間存儲 while(x==0) { cin>>x>>y; continue;} 即若系數為 0,不再進行動態分配并新建結點,而是重新提取用戶輸入的下一個子項的系數和指數,利用 continue 進入下一次循環。
⑶初始化完成后將最后一個結點的指針域置為空,并返回該新建鏈表的首地址。
if(q!=NULL)
q->next=NULL;
return a; ⑷動態分配空間新建結點存儲系數和指數的代碼如下:
p=new node;
p->coef=x;
p->exp=y;
if(a==NULL) a=p;
else q->next=p;
q=p; 2、 多項式顯示功能函數 由于系數有正有負,故采取如下處理:
對于正數,輸出時在前面加“+”,頭指針除外;對于負數,直接將系數輸出即可,即:
p=a;
while(p)
{
if(p==a)
cout<<p->coef<<"*x^"<<p->exp;
else if(p->coef<0)
cout<<p->coef<<"*x^"<<p->exp;
else if(p->coef>0)
cout<<"+"<<p->coef<<"*x^"<<p->exp;
p=p->next;
} 輸出的多項式的形式形如:P 1 X^1+P 2 X^2+…+P n X^n 3、 多項式相加的功能函數 函數為:node *plus_fun(node *a,node *b) 此函數根據在 1 中初始化的兩個多項式進行相加運算,并存放在以 c 為頭指針的一個新鏈表中。
設指針 p,q,r 分別指向描述多項式的鏈表 a,b,c 的頭部,其中將 a 也賦給 c。p,q兩個指針同時移動,并根據 p,q 兩結點對應的指數的大小采取不同的操作。
⑴當(p->exp)<(q->exp)時,操作如下:
w=p;
p=p->next;
r->next=w;
r=w; 即定義一個結點 w,將結點 p 賦給它,然后將 p 結點后移,指向 a 中下一個待處理結點,然后將 w 移動到新生成鏈表 c 的尾結點的后面,最后將 w 賦給r,使得 r 仍指向鏈表 c 的尾結點。
⑵當 p->exp>q->exp 時,采取如下操作:
w=q;
q=q->next;
r->next=w;
r=w; 即此時將 q 賦給 w,然后使 q 結點指向鏈表 b 中下一個待處理結點,然后將 w移動到新生成鏈表 c 的尾結點的后面,最后將 w 賦給 r,使得 r 仍指向鏈表 c 的尾結點。
⑶當 p->exp==q->exp 時,定義一個 float 類型的變量 x,當 x 不為 0 時,采取如下操作:
p->coef=x;
w=p;
p=p->next;
r->next=w;
r=w;
w=q;
q=q->next;
delete w;
即將 x 的值賦給 p 的系數域,之后將結點 p 賦給 w,然后將 p 結點后移,指向 a 中下一個待處理結點,然后將 w 移動到新生成鏈表 c 的尾結點的后面,最后將 w 賦給 r,使得 r 仍指向鏈表 c 的尾結點。同時,將 q 的內存空間釋放,并使得 q 指向 b 中下一個待處理結點。
當 x 為 0 時,采取如下操作:
w=p;
p=p->next;
delete w;
w=q;
q=q->next;
delete w; 即將 pq 的空間釋放,并分別使其指向各自鏈表中下一個待處理結點。
⑷當上面的循環進行完后,至少有一個鏈表已被遍歷完,然后只需將另一個鏈表剩余的所有結點都移動到 c 中即可。
if(p!=NULL)
{
while(p)
{
w=p;
p=p->next;
r->next=w;
r=w;
}
}
if(q!=NULL)
{
while(q)
{
w=q;
q=q->next;
r->next=w;
r=w;
}
} ⑸最后將 c 中的最后一個結點的指針域置為空,并返回 c 的地址。
r->next=NULL;
return c; 4、 主函數功能設計 采用循環的形式可以多次進行兩個多項式的初始化和求和。
四、 界面設計 提示用戶進行每一步操作以及每一步輸出的內容,界面簡明清晰。
五、 運行與調試
六、 源代碼 #include<iostream.h> struct node {
float coef;
//系數域
int exp;
//指數域
struct node *next; }; node *in_fun() {
node *p,*a,*q,*r;
a=q=NULL;
float x;
int y;
cin>>x>>y;
while(x!=0||y!=0)
{
while(x==0)
{
cin>>x>>y;
if(x==0&&y==0)
break;
else
{continue;}
}
if(x==0&&y==0)
break;
p=new node;
p->coef=x;
p->exp=y;
if(a==NULL) a=p;
else q->next=p;
q=p;
cin>>x>>y;
if(x==0&&y==0)
break;
r=a;
while(r!=q->next)
{
if(y<=r->exp)
{
cout<<"請按照指數遞增順序輸入,請重新輸入";
cin>>x>>y;
break;
}
r=r->next;
}
if(x==0&&y==0) break;
}
if(q!=NULL)
q->next=NULL;
return a; } void out_fun(node *a) {
node *p;
p=a;
while(p)
{
if(p==a)
cout<<p->coef<<"*x^"<<p->exp;
else if(p->coef<0)
cout<<p->coef<<"*x^"<<p->exp;
else if(p->coef>0)
cout<<"+"<<p->coef<<"*x^"<<p->exp;
p=p->next;
}
cout<<endl; } node *plus_fun(node *a,node *b) {
node *c,*p,*q,*r,*w;
float x;
p=a;
q=b;
c=a;
r=c;
while(p&&q)
{
if((p->exp)<(q->exp))
{
w=p;
p=p->next;
r->next=w;
r=w;
}
else if(p->exp==q->exp)
{
x=p->coef+q->coef;
if(x!=0)
{
p->coef=x;
w=p;
p=p->next;
r->next=w;
r=w;
w=q;
q=q->next;
delete w;
}
else if(x==0)
{
w=p;
p=p->next;
delete w;
w=q;
q=q->next;
delete w;
}
}
else if(p->exp>q->exp)
{
w=q;
q=q->next;
r->next=w;
r=w;
}
}
if(p!=NULL)
{
while(p)
{
w=p;
p=p->next;
r->next=w;
r=w;
}
}
if(q!=NULL)
{
while(q)
{
w=q;
q=q->next;
r->next=w;
r=w;
}
}
r->next=NULL;
return c; } int main() {
node *a,*b,*c;
int n=1;
while(n)
{
cout<<endl<<"--------一元多項式相加問題----------"<<endl;
cout<<endl<<"請輸入第一個多項式的系數和指數"<<endl;
a=in_fun();
cout<<endl<<"您所輸入的多項式為"<<endl;
out_fun(a);
cout<<endl<<"請輸入第二個多項式的系數和指數"<<endl;
b=in_fun();
cout<<endl<<"您所輸入的多項式為"<<endl;
out_fun(b);
cout<<endl<<"初始化完畢,兩多項式相加得"<<endl;
c=plus_fun(a,b);
out_fun(c);
cout<<"繼續初始化多項式請輸入 1,停止請輸入 0
";
cin>>n;
cout<<endl;
while(n!=1&&n!=0)
{
cout<<"輸入錯誤,請重新輸入:";
cin>>n;
}
cout<<endl;
}
return 0; }
推薦訪問: 多項式 相加 實驗在偉大祖國73華誕之際,我參加了單位組織的“光影鑄魂”主題黨日活動,集中觀看了抗美援朝題材影片《長津湖》,再一次重溫這段悲壯歷史,再一次深刻感悟偉大抗美援朝精神。1950年10月,新中國剛剛成立一年,
根據省局黨組《關于舉辦習近平談治國理政(第四卷)讀書班的通知》要求,我中心通過專題學習、專題研討以及交流分享等形式,系統的對《習近平談治國理政》(第四卷)進行了深入的學習與交流,下面我就來談一談我個人
《習近平談治國理政》(第四卷)是在百年變局和世紀疫情相互疊加的大背景下,對以習近平同志為核心的黨中央治國理政重大戰略部署、重大理論創造、重大思想引領的系統呈現。它生動記錄了新一代黨中央領導集體統籌兩個
《真抓實干做好新發展階段“三農工作”》是《習近平談治國理政》第四卷中的文章,這是習近平總書記在2020年12月28日中央農村工作會議上的集體學習時的講話。文章指出,我常講,領導干部要胸懷黨和國家工作大
在《習近平談治國理政》第四卷中,習近平總書記強調,江山就是人民,人民就是江山,打江山、守江山,守的是人民的心。從嘉興南湖中駛出的小小紅船,到世界上最大的執政黨,在中國共產黨的字典里,“人民”一詞從來都
黨的十八大以來,習近平總書記以馬克思主義戰略家的博大胸襟和深謀遠慮,在治國理政和推動全球治理中牢固樹立戰略意識,在不同場合多次圍繞戰略策略的重要性,戰略和策略的關系,提高戰略思維、堅定戰略自信、強化戰
《習近平談治國理政》第四卷集中展示了以習近平同志為核心的黨中央在百年變局和世紀疫情相互疊加背景下,如何更好地堅持和發展中國特色社會主義而進行的生動實踐與理論探索;對于新時代堅持和發展什么樣的中國特色社
在黨組織的關懷下,我有幸參加了區委組織部組織的入黨積極分子培訓班。為期一周的學習,學習形式多樣,課程內容豐富,各位專家的講解細致精彩,對于我加深對黨的創新理論的認識、對黨的歷史的深入了解、對中共黨員的
《習近平談治國理政》第四卷《共建網上美好精神家園》一文中指出:網絡玩命是新形勢下社會文明的重要內容,是建設網絡強國的重要領域。截至2021年12月,我國網民規模達10 32億,較2020年12月增長4
剛剛召開的中國共產黨第十九屆中央委員會第七次全體會議上討論并通過了黨的十九屆中央委員會向中國共產黨第二十次全國代表大會的報告、黨的十九屆中央紀律檢查委員會向中國共產黨第二十次全國代表大會的工作報告和《