2015年大二上-資料結構-連結串列(7)-多項式求和
提示:
1、儲存多項式的資料結構
多項式的通式是pn(x)=anxn+an−1xn−1+...+a1x+a0。n次多項式共有n+1項。直觀地,可以定義一個陣列來儲存這n+1個係數。以多項式p(x)=−3.4x10−9.6x8+7.2x2+x為例,儲存這個多項式的陣列如下圖:
可以看出,這種方案適合對某些多項式的處理。但是,在處理一些次數高但項數少的多項式時,存在浪費空間的現象,會有很多閒置的0。
可以使用如下定義的單連結串列結構儲存多項式:連結串列中的每一個結點是多項式中的一項,結點的資料域包括指數和係數兩部分,由指標域連線起多項式中的各項。
typedef struct pnode //定義單連結串列結點型別,儲存多項式中的一項,連結串列構成多項式 {
double coef; //係數,浮點數
int exp; //指數,正整數*
struct pnode *next; //指向下一項的指標
} 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連結到相加後的第一個多項式末尾。
上面的討論假設多項式連結串列中,已經按指數由大到小排序,在加法之前,採取多種手段保證這一前提成立。
/*
*Copyright (c) 2014,煙臺大學計算機學院
*All rights reserved.
*檔名稱:Annpion.cpp
*作者:王耀鵬
*完成日期:2015年11月5日
*版本號:v1.0
*
*問題描述:用單連結串列儲存一元多項式,並實現兩個多項式的加法。
*輸入描述:兩個多項式。
*輸出描述:兩個多項式相加後的多項式。
*/
#include <stdio.h>
#include <malloc.h>
#define MAX 20 //多項式最多項數
typedef struct //定義存放多項式的陣列型別
{
double coef; //係數
int exp; //指數
} PolyArray;
typedef struct pnode //定義單連結串列結點型別,儲存多項式中的一項,連結串列構成多項式
{
double coef; //係數
int exp; //指數
struct pnode *next;
} PolyNode;
void DispPoly(PolyNode *L) //輸出多項式
{
bool first = true;
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->coef ==1)
printf("%gx",p->coef);
else printf("%gx^%d",p->coef,p->exp);
p=p->next;
}
printf("\n");
}
void DestroyList(PolyNode *&L)
{
PolyNode *p=L,*q;
while(p!=NULL)
{
q=p->next;
free(p);
p=q;
}
}
void CreateListR(PolyNode *&L, PolyArray a[], int n)
{
L=(PolyNode *)malloc(sizeof(PolyNode));
L->next=NULL;
PolyNode *p,*q;
for(int i=0; i<n; ++i)
{
q=L;
p=(PolyNode *)malloc(sizeof(PolyNode));
p->coef=a[i].coef;
p->exp=a[i].exp;
p->next=NULL;
while(q->next!=NULL&&q->next->exp>p->exp)
q=q->next;
p->next=q->next;
q->next=p;
}
}
void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)
{
PolyNode *p=ha->next,*q=hb->next,*listc,*s;
double c;
hc=(PolyNode *)malloc(sizeof(PolyNode));
listc=hc;
while(p!=NULL && q!=NULL)
{
if(p->exp>q->exp)
{
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p->coef;
s->exp=p->exp;
listc->next=s;
listc=s;
p=p->next;
}
else if(p->exp<q->exp)
{
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=q->coef;
s->exp=q->exp;
listc->next=s;
listc=s;
q=q->next;
}
else
{
c=q->coef+p->coef;
if(c!=0)
{
s=(PolyNode *)malloc(sizeof(PolyNode));
s->exp=q->exp;
s->coef=c;
listc->next=s;
listc=s;
}
q=q->next;
p=p->next;
}
}
if(q!=NULL)
p=q;
while(p!=NULL)
{
s=(PolyNode *)malloc(sizeof(PolyNode));
s->exp=q->exp;
s->coef=c;
listc->next=s;
listc=s;
p=p->next;
}
listc->next=NULL;
}
int main()
{
PolyNode *ha,*hb,*hc;
PolyArray a[]= {{2.5,1},{1.2,0},{3.2,3},{-2.5,5}};
PolyArray b[]= {{2.5,1},{3.2,3},{-1.2,0},{2.5,5},{5.4,10}};
CreateListR(ha,a,4);
CreateListR(hb,b,5);
printf("原多項式A: ");
DispPoly(ha);
printf("原多項式B: ");
DispPoly(hb);
Add(ha,hb,hc);
printf("多項式相加: ");
DispPoly(hc);
DestroyList(ha);
DestroyList(hb);
DestroyList(hc);
return 0;
}
執行結果:
相關文章
- 實戰資料結構(9)_單連結串列實現多項式的相乘資料結構
- 資料結構-連結串列資料結構
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- 資料結構--連結串列資料結構
- 資料結構—連結串列資料結構
- 資料結構-單連結串列、雙連結串列資料結構
- JavaScript資料結構--連結串列JavaScript資料結構
- 資料結構之「連結串列」資料結構
- 資料結構之連結串列資料結構
- 資料結構學習(C++)——單連結串列應用(一元多項式【1】) (轉)資料結構C++
- 資料結構學習(C++)——單連結串列應用(一元多項式【2】) (轉)資料結構C++
- Java版-資料結構-連結串列Java資料結構
- JavaScript資料結構 之 連結串列JavaScript資料結構
- 資料結構學習--連結串列資料結構
- 資料結構:跳躍連結串列資料結構
- js資料結構--連結串列(likedList)JS資料結構
- 資料結構基礎 連結串列資料結構
- 資料結構之連結串列【上】資料結構
- 資料結構之連結串列操作資料結構
- 資料結構——雙向連結串列資料結構
- 資料結構04——單連結串列資料結構
- JAVA資料結構之連結串列Java資料結構
- 資料結構之單連結串列資料結構
- 資料結構:雙向連結串列資料結構
- JS資料結構(四)——連結串列JS資料結構
- 前端資料結構--線性結構-連結串列前端資料結構
- 資料結構實驗之連結串列九:雙向連結串列資料結構
- 資料結構實驗之連結串列二:逆序建立連結串列資料結構
- 資料結構--陣列、單向連結串列、雙向連結串列資料結構陣列
- Redis資料結構—連結串列與字典的結構Redis資料結構
- Redis資料結構—連結串列與字典Redis資料結構
- 資料結構之迴圈連結串列資料結構
- 資料結構之雙向連結串列資料結構
- 核心中的連結串列資料結構資料結構
- 資料結構連結串列筆試題資料結構筆試
- 資料結構-線性表、連結串列資料結構
- 資料結構實驗之連結串列三:連結串列的逆置資料結構