每日一题Day22

基于链表的两个一元多项式的基本运算

描述

给定两个一元多项式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;
}

猜你喜欢

转载自blog.csdn.net/ZLambert/article/details/81569259