p=q;scanf(\"%f %d\
q=(struct linklist*)malloc(sizeof(struct linklist));
p->next=q;
i++;
}
p->next=NULL;
}
int compare (int a,int b){
//比较函数当a>b时返回1当aif (a>b) return (1);
if (aif (a==b) return (0);
}
struct linklist * addpolyn(struct linklist*p,struct linklist*q){
//两个多项式相加,返回结果指针
int compare (int a ,int b);
int a,b;
float s;
struct linklist *la,*lb,*head;
struct linklist *lc,*ld,*r;
lc=(struct linklist*)malloc(sizeof(struct linklist));
ld=(struct linklist*)malloc(sizeof(struct linklist));
if((p->expn)<(q->expn)){
la=p;
lb=q;
}
else{
la=q;
lb=p;
}
head=la;
lc->next=la;
ld->next=lb;
p=lc;
q=ld;
while(la&&lb){
a=la->expn;
b=lb->expn;
switch(compare(a,b)){
case -1: //多项式la中当前节点指数小于Q
la=la->next;p=p->next;break;
case 0: //多项式la中当前节点指数等于Q
s=la->coef+lb->coef;
if(s!=0.0){
la->coef=s; //此项不为0需要修改la中当前节点的系数值
la=la->next;
p=p->next;
lb=lb->next;
q=q->next;
}
else {
p->next=la->next;
r=la;
la=la->next;
free(r);
lb=lb->next;
q=q->next;
}
break;
case 1:
q->next=lb->next;
p->next=lb;
lb->next=la;
p=p->next;
lb=q->next;
break;
}
}
if(lb){
p->next=lb;
}
return head;
}
void printer(struct linklist *r){
//结果输出函数
while (r){
printf(\"指数:%d 系数:%f\\n\
r=r->next;
}
}
main()
{
void creatpolyn(struct linklist *p,int n); //输入n项的系数,建立一个链表
struct linklist * addpolyn(struct linklist*p,struct linklist*q); //两个多项式相加,返
回结果指针
int compare (int a ,int b); //比较函数当a>b时返回1当avoid outcome(struct linklist *r); //结果输出函数
struct linklist *p=&la,*q=&lb,*r;
int n;
printf(\"请输入第一个多项式的项数:\\n\");
scanf(\"%d\
creatpolyn(p,n);
printf(\"请输入第二个多项式的项数:\\n\");
scanf(\"%d\
creatpolyn(q,n);
r=addpolyn(p,q);
print(r);
}
四.算法分析
多项式由系数和指数组成,建立两个链表分别存储系数和指数。为了方便实验过程,实验在输入的时候按照指数的由低到高输入,避免了排序。在相加过程中,将两个链表从头到尾进行比较,直到比到一个链表没有元素为止,将其中指数相同的系数进行加减运算。最后打印出多项式。
五.实验结果
经验证实验结果正确无误,所以实验程序正确。