题目描述
编程实现一元多项式的加法运算。(要求用链表实现)
输入
第一行为一元多项式A, 以 0,0 作为输入结束;
第二行为一元多项式B, 以 0,0 作为输入结束。
输出
多项式A和多项式B的和。
样例输入
5,3 7,8 9,15 0,0
2,0 6,3 -7,8 0,0
样例输出
2x0+11x3+9x^15
#include<stdio.h>
#include<malloc.h>
typedef struct L
{
int cof;
int exp;
struct L *next;
}Lnode;
void init(Lnode*&L)
{
L=(Lnode*)malloc(sizeof(Lnode));
Lnode *p=L,*s;
int x,y;
char dot;
while(scanf("%d%c%d",&x,&dot,&y))//尾插法建链表
{
if(x==0&&y==0)
{
break;
}
s=(Lnode*)malloc(sizeof(Lnode));
s->cof=x;
s->exp=y;
p->next=s;
p=s;
}
p->next=NULL;
}
void Add(Lnode*&L1,Lnode*&L2)
{
Lnode *s,*p=L1->next,*q=L2->next,*r;
while(p!=NULL)//遍历L1
{
while(q!=NULL)//遍历L2
{
r=q->next;
if(q->exp==p->exp)//如果指数相等,则系数相加
{
q->cof+=p->cof;
break;
}else
if(r!=NULL && (p->exp>q->exp) && (p->exp<r->exp) )
{//若不到尾结点,p结点指数比q之前的大,比之后的小,故插在中间位置
s=(Lnode*)malloc(sizeof(Lnode));
s->cof=p->cof;
s->exp=p->exp;
q->next=s;
s->next=r;
break;
}else
if(r==NULL)//若到达L2的尾部,则把q(L1的结点)插在L2的尾部
{
s=(Lnode*)malloc(sizeof(Lnode));
s->cof=p->cof;
s->exp=p->exp;
q->next=s;
s->next=NULL;
break;
}else
if(q==L2->next&&p->exp<q->exp)
{//若q结点的指数比L2的初始结点的大,则插在L2的开头
//头插法
s=(Lnode*)malloc(sizeof(Lnode));
s->cof=p->cof;
s->exp=p->exp;
L2->next=s;
s->next=q;
break;
}else
q=q->next;//q向后移,遍历L2
}
p=p->next;//p向后移,遍历L1
q=L2->next;//q初始化,指向L2的首结点
}
}
void display(Lnode*L2)
{
Lnode*p=L2->next;
while(p!=NULL)
{
if(p->cof!=0)
printf("%dx^%d",p->cof,p->exp);
p=p->next;
if(p!=NULL&&p->cof!=0)
{
printf("+");
}
}
}
void dis(Lnode*L)
{
Lnode*p=L->next;
while(p!=NULL)
{
printf("%d %d",p->cof,p->exp);
p=p->next;
}
printf("\n");
}
int main()
{
Lnode *L1,*L2;
init(L1);
init(L2);//初始化两个表达式
Add(L1,L2);//相加,相加结果放在L2上
display(L2);//打表
}