函數功能說明:
Void InitList(PolyNode &L) /初始化多項式單鏈表*/
Int GetLength(PolyNode*L) /求多項式單鏈表的長度/
PolyNode GetElem(PolyNode *L,int i) /返回多項式單鏈表中第i個結點的指針*/
PolyNode Locate(PolyNode *L,float c,inte) /在多項式單鏈表中按值查找*/
int InsElem(PolyNode &L,float c,inte,int i) /在多項式單鏈表中插入一個結點*/
int DelElem(PolyNode L,int i) /在多項式單鏈表中刪除一個結點*/
void DispList(PolyNode L) /輸出多項式單鏈表的元素值*/
void CreaPolyList(PolyNode &L,floatC[],int E[],int n) /創建一個鏈表 */
void SortPloy(PolyNode &L) /對L的多項式單鏈表按expn域遞增排序*/
PolyNode AddPoly(PolyNode *pa,PolyNode*pb) /兩個多項式單鏈表合併*/
2、以單鏈表作爲存儲結構插入多項式:多項式按冪從高到低,以“係數,冪”的格式輸入,並以“0,0”結束。
3、多項式相加,單鏈表合併 :
1)兩個多項式對應的單鏈表頭節點開始,依次掃描各節點;
2)若兩表的節點均非空:比較二者的冪,按冪大者先入表。如果冪相等,則係數相加再入表;
3) 若有一鏈表已空,則將非空鏈表插入新表;
4) 輸出合併後的鏈表;
5) 主函數調用,完成多項式相加。
算法實現:
一.一元多項式加法:
1.建立多項式:尾插法建立一元多項式的鏈表,通過鍵盤輸入多項式的係數和指數,以輸入係數0爲結束標誌,並約定建立一元多項式鏈表時,總是按指數從小到大的順序排列。
2.輸出多項式:從單鏈表的第一項開始逐項讀出係數和指數,按多項式的形式輸出。
3.多項式相加:設La和Lb分別表示兩個多項式。Lc表示和多項式。p,q,r分別表示指向單鏈表的當前項比較指數大小。
(1)若La->expexp,則結點p應是和多項式中的一項,將p複製到r,並使p後移。
(2)若La->exp = Lb->exp,則將兩個結點中的係數相加,當和不爲0時,La的係數域加上Lb的係數域作爲Lc的係數域;若和爲0,則和多項式中沒有這一項,p,q後移。
(3)若La->exp > Lb->exp,則將結點q複製到Lc中,q後移。
二.一元多項式減法
算法:將減數多項式的所有係數先變爲相反數,然後調用多項式相加的函數進行運算。
三.一元多項式乘法
兩個多項式相乘,應該是第一個多項式中的每一項分別與第二個多項式相乘,將相乘得到的結果都存在第一個多項式中,再調用合併多項式的函數。我寫的多項式相乘用到了兩重循環,合併多項式也用到了兩重循環。
代碼如下:
#include <stdio.h>
#include <malloc.h>
typedef struct node
{ float coef; /*序數*/
int expn; /*指數*/
struct node *next; /*指向下一個結點的指針*/
} PolyNode;
void InitList(PolyNode *&L) /*初始化多項式單鏈表*/
{
L=(PolyNode *)malloc(sizeof(PolyNode)); /*建立頭結點*/
L->next=NULL;
}
int GetLength(PolyNode *L) /*求多項式單鏈表的長度*/
{
int i=0;
PolyNode *p=L->next;
while (p!=NULL) /*掃描單鏈表L,用i累計結點個數*/
{
i++;p=p->next;
}
return i;
}
PolyNode *GetElem(PolyNode *L,int i) /*返回多項式單鏈表中第i個結點的指針*/
{
int j=1;
PolyNode *p=L->next;
if (i<1 || i>GetLength(L))
return NULL;
while (j<i) /*沿next域找第i個結點*/
{
p=p->next;j++;
}
return p;
}
PolyNode *Locate(PolyNode *L,float c,int e) /*在多項式單鏈表中按值查找*/
{
PolyNode *p=L->next;
while (p!=NULL && (p->coef!=c ||p->expn!=e))
p=p->next;
return p;
}
int InsElem(PolyNode *&L,float c,int e,int i) /*在多項式單鏈表中插入一個結點*/
{
int j=1;
PolyNode *p=L,*s;
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=c;s->expn=e;s->next=NULL;
if (i<1 || i>GetLength(L)+1)
return 0;
while (j<i) /*查找第i-1個結點*p*/
{
p=p->next;j++;
}
s->next=p->next;
p->next=s;
return 1;
}
int DelElem(PolyNode *L,int i) /*在多項式單鏈表中刪除一個結點*/
{
int j=1;
PolyNode *p=L,*q;
if (i<1 || i>GetLength(L))
return 0;
while (j<i) /*在單鏈表中查找第i-1個結點,由p指向它*/
{
p=p->next;j++;
}
q=p->next; /*q指向被刪結點*/
p->next=q->next; /*刪除*q結點*/
free(q);
return 1;
}
void DispList(PolyNode *L) /*輸出多項式單鏈表的元素值*/
{
PolyNode *p=L->next;
while (p!=NULL)
{
printf("(%g,%d) ",p->coef,p->expn);
p=p->next;
}
printf("\n");
}
void CreaPolyList(PolyNode *&L,float C[],int E[],int n)
{
int i;
InitList(L);
for (i=0;i<n;i++)
InsElem(L,C[i],E[i],i+1);
}
void SortPloy(PolyNode *&L) /*對L的多項式單鏈表按expn域遞增排序*/
{
PolyNode *p=L->next,*q,*pre;
L->next=NULL;
while (p!=NULL)
{
if (L->next==NULL) /*處理第1個結點*/
{
L->next=p;p=p->next;
L->next->next=NULL;
}
else /*處理其餘結點*/
{
pre=L;q=pre->next;
while (q!=NULL && p->expn>q->expn) /*找q->expn剛大於或等於p->expn的結點*q的前驅結點*pre*/
{
pre=q;q=q->next;
}
q=p->next; /*在*pre結點之後插入*p*/
p->next=pre->next;
pre->next=p;
p=q;
}
}
}
PolyNode *AddPoly(PolyNode *pa,PolyNode *pb)
{
PolyNode *pc,*p1=pa->next,*p2=pb->next,*p,*tc,*s;
pc=(PolyNode *)malloc(sizeof(PolyNode)); /*新建頭結點*pc*/
pc->next=NULL; /*pc爲新建單鏈表的頭結點*/
tc=pc; /*tc始終指向新建單鏈表的最後結點*/
while (p1!=NULL && p2!=NULL)
{
if (p1->expn<p2->expn) /*將*p1結點複製到*s並鏈到pc尾*/
{
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
tc->next=s;tc=s;
p1=p1->next;
}
else if (p1->expn>p2->expn) /*將*p2結點複製到*s並鏈到pc尾*/
{
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;
}
else /*p1->expn=p2->expn的情況*/
{
if (p1->coef+p2->coef!=0) /*序數相加不爲0時新建結點*s並鏈到pc尾*/
{
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p1->coef+p2->coef;s->expn=p1->expn;
s->next=NULL;
tc->next=s;tc=s;
}
p1=p1->next;p2=p2->next;
}
}
if (p1!=NULL) p=p1; /*將尚未掃描完的餘下結點複製並鏈接到pc單鏈表之後*/
else p=p2;
while (p!=NULL)
{
s=(PolyNode *)malloc(sizeof(PolyNode));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
tc->next=s;tc=s;
p=p->next;
}
tc->next=NULL; /*新建單鏈表最後結點的next域置空*/
return pc;
}
void main()
{
PolyNode *L1,*L2,*L3;
float C1[]={3,7,5,9},C2[]={-9,8,22};
int E1[]={1,0,17,8},E2[]={8,1,7};
InitList(L1);
InitList(L2);
InitList(L3);
CreaPolyList(L1,C1,E1,4);
CreaPolyList(L2,C2,E2,3);
printf("***兩多項式相加運算***\n");
printf("原多項式A:\n");DispList(L1);
printf("原多項式B:\n");DispList(L2);
SortPloy(L1);
SortPloy(L2);
printf("排序後的多項式A:\n");DispList(L1);
printf("排序後的多項式B:\n");DispList(L2);
L3=AddPoly(L1,L2);
printf("多項式相加結果:\n");DispList(L3);
}