7-2 一元多项式的乘法与加法运算 (20 分)

		**7-2 一元多项式的乘法与加法运算 (20 分)**

设计函数分别求两个一元多项式的乘积与和。

输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

开始考虑到多项式加法用链表方便,使用了链表,发现乘法时候麻烦的要死。
没有办法,硬着头皮做吧!
也就出了我的很愚蠢的做法。

#include<stdio.h>
#include<malloc.h>
typedef struct mi *list;
struct mi{
	int c;
	int e;
	list next;
};
list creat(list *l)     //创建链表
{
	list p,r;
	int c,e,n;
	r=(list)malloc(sizeof(struct mi));
	*l=r;
	scanf("%d",&n);
	while(n)
	{
		scanf("%d %d",&c,&e);
		p=(list)malloc(sizeof(struct mi));
		p->c=c;
		p->e=e;
		r->next=p;
		r=r->next;
		n--;
	}
	r->next=NULL;
	return *l;
}
void print(list l)      //各种情况输出
{
	list p;
	p=l;
	int k=0;
	p=p->next;
	if(p==NULL)
		printf("0 0");
	else if(p->c==0)
	{
		while(p){
			if(p->c==0)
			{
				p=p->next;
				continue;
			}			
			else
				{printf("%d %d",p->c,p->e);
				k=1;
				p=p->next;
				break;
				}
			p=p->next;
		}
		if(p==NULL&&k==0)
			printf("0 0");
	}
	else
	{	printf("%d %d",p->c,p->e);
		p=p->next;
	}
	while(p)
	{
		if(p->c==0)
		{
			p=p->next;
			continue;
		}		
		printf(" %d %d",p->c,p->e);
		p=p->next;
	}
}
list sot(list cc)  //链表冒泡排序
{
	list lc,ld,rear,p;
	lc=cc->next;
	if(lc==NULL)
		return cc; 
	int x,y;
	while(lc)
	{
		ld=lc->next;
		while(ld)
		{
			if(ld->e>lc->e)
				{
					x=ld->e;
					ld->e=lc->e;
					lc->e=x;
					y=ld->c;
					ld->c=lc->c;
					lc->c=y;
				}
				ld=ld->next;
		}
		lc=lc->next;
	}
	lc=cc->next;
	ld=lc->next;
	while(ld)
	{
		if(ld->e==lc->e)
		{
			lc->c=lc->c+ld->c;
			p=ld;
			ld=ld->next;
			lc->next=ld;
			free(p); 
			if(ld==NULL)
				break;
		}
		ld=ld->next;
		lc=lc->next;
	}	
	return cc;
}

list complexcheng(list ca,list cb)
{
	list la,lb,lc,rear,p;
	la=ca->next;
	lb=cb->next;
	lc=(list)malloc(sizeof(struct mi));
	rear=lc;
	while(la)
	{
		while(lb)
			{
				p=(list)malloc(sizeof(struct mi));
				p->c=la->c*lb->c;
				p->e=la->e+lb->e;
				if(p->e==rear->e)
				{
					rear->c=rear->c+p->c;
					lb=lb->next;
					continue;
				}
				rear->next=p;
				rear=rear->next;
				lb=lb->next;
			}
		la=la->next;
		lb=cb->next;
	}
	rear->next=NULL;
	lc=sot(lc);
	return lc;
}

list complexjia(list ca,list cb)     //多项式乘法
{
	list lc,temp,rear,r,la,lb;
	int sum;
	la=ca;
	lb=cb;
	lc=(list)malloc(sizeof(struct mi));
	rear=lc;
	la=la->next;
	lb=lb->next;
	while(la&&lb)
	{
		r=(list)malloc(sizeof(struct mi));
		if(complex(la->e,lb->e)==1)
		{
			r->c=la->c;
			r->e=la->e;
			rear->next=r;
			rear=rear->next;
			la=la->next;
		}
		else if(complex(la->e,lb->e)==3)
		{
			r->c=lb->c;
			r->e=lb->e;
			rear->next=r;
			rear=rear->next;
			lb=lb->next;
		}
		else
		{
			sum=la->c+lb->c;
			r->c=sum;
			r->e=la->e;
			rear->next=r;
			rear=rear->next;
			lb=lb->next;
			la=la->next;	
		}
	}
	for(;la;la=la->next)
		{
			r=(list)malloc(sizeof(struct mi));
			r->c=la->c;
			r->e=la->e;
			rear->next=r;
			rear=rear->next;
		}
	for(;lb;lb=lb->next)
		{
			r=(list)malloc(sizeof(struct mi));
			r->c=lb->c;
			r->e=lb->e;
			rear->next=r;
			rear=rear->next;
		}
		rear->next=NULL;
		return lc;
}

int complex(int a,int b)                  //比较大小
{
	if(a>b)
		return 1;
	else if(a==b)
		return 2;
	else 
		return 3;
}

int main()
{
list la,lb,lc,ld;
la=creat(&la);
lb=creat(&lb);
lc=complexjia(la,lb);
ld=complexcheng(la,lb);
print(ld);
printf("\n");
print(lc);
 } 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值