基于链表的两个一元多项式的基本运算
描述
给定两个一元多项式A(x)与B(x),利用链表表示A(x)与B(x),实现A(x)与B(x)的加法和减法运算。
输入
输入多组数据,总计n*( a+b+2)+1行。其中,第一行整数n代表总计有n组数据,之后依次输入n组数据。每组数据包括a+b+2行,其中第一行是两个整数a和b,分别代表A(x)与B(x)的项数。之后紧跟a行,每行两个整数a1和a2,分别代表A(x)每项的系数和指数,再之后紧跟b行,每行两个整数b1和b2,分别代表B(x)每项的系数和指数,每组数据最后一行为一个字符(+、-),分别代表多项式的加法和减法运算。A(x)、B(x)内各自的指数互不相同,所有数据的绝对值小于100,指数大于等于0。
输出
对于每组数据输出一行,按照多项式次数从大到小排列,参考格式:5x^17+22x^7+11x^1+7。
样例输入1
4 1 1 1 0 1 1 + 4 3 7 0 3 1 9 8 5 17 8 1 22 7 -9 8 + 1 1 1 1 1 1 - 1 1 1 1 2 1 -
样例输出1
1x^1+1 5x^17+22x^7+11x^1+7 0 -1x^1
解答:按从大到小的顺序分别建立链表La和Lb。遍历La、Lb进行加减法运算,同时修改链表。遍历修改后的链表,输出结果。
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int x;
int y;
struct node *next;
} xp,*XpList;
void creat(XpList &L,int n)
{
L=(xp *)malloc(sizeof(xp));
L->next=NULL;
xp *p,*q;
while(n--)
{
p=(xp *)malloc(sizeof(xp));
scanf("%d %d",&p->x,&p->y);
q=L;
while(q->next)
{
if(q->next->y < p->y)
break;
q=q->next;
}
p->next=q->next;
q->next=p;
}
}
void ADD(XpList &La,XpList &Lb)
{
int sum;
xp *p1,*p2,*p3,*q;
p1=La->next;
p2=Lb->next;
p3=La;
while(p1&&p2)
{
if(p1->y > p2->y)
{
p3->next=p1;
p3=p3->next;
p1=p1->next;
}
else if(p2->y > p1->y)
{
p3->next=p2;
p3=p3->next;
p2=p2->next;
}
else
{
sum=p1->x+p2->x;
if(sum)
{
p1->x=sum;
p3->next=p1;
p3=p3->next;
p1=p1->next;
q=p2;
p2=p2->next;
free(q);
}
else
{
q=p1;
p1=p1->next;
free(q);
q=p2;
p2=p2->next;
free(q);
}
}
}
p3->next=p1?p1:p2;
free(Lb);
}
void SUB(XpList &La,XpList &Lb)
{
int sum;
xp *p1,*p2,*p3,*q;
p1=La->next;
p2=Lb->next;
p3=La;
while(p1&&p2)
{
if(p1->y > p2->y)
{
p3->next=p1;
p3=p3->next;
p1=p1->next;
}
else if(p2->y > p1->y)
{
p2->x=-1*p2->x;
p3->next=p2;
p3=p3->next;
p2=p2->next;
}
else
{
sum=p1->x - p2->x;
if(sum)
{
p1->x=sum;
p3->next=p1;
p3=p3->next;
p1=p1->next;
q=p2;
p2=p2->next;
free(q);
}
else
{
q=p1;
p1=p1->next;
free(q);
q=p2;
p2=p2->next;
free(q);
}
}
}
if(p1)
{
p3->next=p1;
}
else
{
while(p2)
{
p2->x=-1*p2->x;
p3->next=p2;
p3=p3->next;
p2=p2->next;
}
p3->next=NULL;
}
free(Lb);
}
void print(XpList L)
{
xp *p;
p=L->next;
int first=1;
while(p)
{
if(first)
{
first=0;
}
else
{
if(p->x>0)
printf("+");
}
if(p->y==0)
printf("%d",p->x);
else
printf("%dx^%d",p->x,p->y);
p=p->next;
}
if(first)
printf("0\n");
else
printf("\n");
}
int main()
{
int T;
int a,b;
char op;
XpList La,Lb;
xp *p,*q;
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&a,&b);
creat(La,a);
creat(Lb,b);
getchar();
scanf("%c",&op);
switch(op)
{
case '+':
ADD(La,Lb);
print(La);
break;
case '-':
SUB(La,Lb);
print(La);
break;
}
}
return 0;
}