实现思路:
通过链表实现,会更为简单直观。用链表中的每个结点表示多项式中的每一项,多项式每一项都是由数据域(包含系数和指数)和指针域构成的,所以在定义表示结点的结构体时,可如下所示进行定义:
typedef struct PLnode{ //数据域,coef 表示系数,expn 表示指数 float coef; int expn; //指针域 struct PLnode *next;
}PLnode,*PLinkList;
#include <stdio.h>
#include <stdlib.h>
typedef struct PLnode{//数据域,coef 表示系数,expn 表示指数float coef;int expn;//指针域struct PLnode *next;
}PLnode,*PLinkList;//一元多项式的链表表示创建函数,输入 m 项的系数和指数,建立表示一元多项式的有序链表L
void creatpolyn(PLinkList L, int m){int i;float coef;int expn;PLinkList tail,n;L->coef = m;L->expn = -1;tail = L;for(i=1 ; i<=m ; i++){n = (PLinkList)malloc(sizeof(PLnode));scanf("%f",&coef);scanf("%d",&expn);n->coef = coef;n->expn = expn;n->next = NULL;tail->next = n;tail = n;}
}
//完成多项式相加运算,即 Lc = La + Lb,并销毁一元多项式 Lb
PLinkList addpolyn(PLinkList La , PLinkList Lb){int x,len;float y;PLinkList Lc,pa,pb,pc,u;Lc = La;len = 0;pc = Lc;//另pa,pb 指向La 、Lb 的首元结点pa = La->next;pb = Lb->next;//通过 pa,pb 遍历链表 La、Lb,只有两指针同时存在时,才需要讨论while(pa && pb){x = pa->expn-pb->expn;//判断pa 所指结点的指数与pb 所指结点指数的大小关系if(x<0){//如果小,则找去 qa 结点到Lc 上pc = pa;len++;pa = pa->next;}//如果相等,则判断两结点的系数和是否为0else if(x == 0){// 请在下面的Begin-End之间补充代码,完成一元多项式的相加。/********** Begin *********/y = pa->coef+pb->coef;if(y!=0.0){pa->coef = y; //如果不为 0,修改 pa 结点的系数值,同时链接到 LC 上pc = pa;len++;}//如果 y 值为0,则从 pc 的链表中摘除该结点,并释放该结点else{pc->next = pa->next;free(pa);}pa = pc->next; //更新完之后的pau = pb;pb = pb->next;free(u);/********** End **********/}//如果pb 所指结点指数值小,则摘取pb所指结点到 LC链表上else{u = pb->next;pb->next= pa;pc->next=pb;pc = pb;len++;pb = u;}}//由于是在 La 上进行一元多项式的加和,所以如果运行过程 pa 不再有结点,而pb 上有,则需要将pb剩余结点链接到 Lc 上if(pb){pc->next = pb;}//计算 Lc 的长度while(pc){pc = pc->next;if(pc){len++;}}//Lc 的头结点中记录Lc 链表的长度Lc->coef = len;//加和完成的同时,释放Lb 结点free(Lb);return Lc;
}
//根据链表存储信息。输出结点 q
void printpoly(PLinkList q){if(q->expn == 0){printf("%.0f",q->coef);}else if(q->expn == 1){if(q->coef == 1){printf("x");}else if (q->coef == -1){printf("-x");}else{printf("%.0f",q->coef);printf("x");}}else if (q->coef == 1){printf("x^%d",q->expn);}else if(q->coef == -1){printf("-x^%d",q->expn);}else{printf("%.0fx^%d",q->coef,q->expn);}
}
//输出一元多项式L
void printpolyn(PLinkList L){int n;PLinkList p;p = L->next;n = 0;while(p){n++;if(n == 1){printpoly(p);}else if(p->coef>0){printf("+");printpoly(p);}else{printpoly(p);}p = p->next;}
}
int main(){PLinkList La,Lb,Lc;int m,n;//根据 n 的值,创建链表Lascanf("%d",&n);La = (PLinkList)malloc(sizeof(PLnode));creatpolyn(La,n);//根据 m 的值,创建 Lbscanf("%d",&m);Lb = (PLinkList)malloc(sizeof(PLnode));creatpolyn(Lb,m);//输出La和Lbprintf("La=");printpolyn(La);printf("\nLb=");printpolyn(Lb);//计算La+Lb,结果保存在 Lc中printf("\n计算结果为:");Lc = addpolyn(La,Lb);printf("\nLc=");printpolyn(Lc);return 0;
}