PTA-数据结构 编程题02- 一元多项式的乘法与加法运算

PTA-数据结构 编程题02- 一元多项式的乘法与加法运算

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

输入格式:

输入分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

对于加法

首先建立一个空链表rear,然后分类对A,B两个链的指数进行比较

  • A > B的时候,令A的数值入rear
  • A < B的时候,令B的数值入rear
  • A = B的时候,令(A+B)的数值入rear

然后判断 A,B 两个链表哪个为空,将不为空的链表接到rear上,返回rear的地址即可,加法完毕

对于乘法

先从A,B两个链表中选取一个链表(我取了A),建立一个空链表rear

  • 先拿出A的第一个元素,让它分别与B中的元素相乘,将所得到的数值入B
  • 在循环A之后的元素,让他与A相乘,把所得到的结果按相加的原理加到rear上即可

返回rear的地址,乘法完毕

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Equation)

typedef struct Equation{
	int coefficient;   //系数 
	int power;         //指数 
	struct Equation *next;
}*Equ;  

Equ creat(void)  //输入 
{
 	Equ p,L,s;
 	int co,ex,N;
 	
 	scanf("%d",&N);                  //输入有几个 多项式非零项的个数
	
	L = (Equ)malloc(LEN);
	L->next = NULL;
	s = L;
	
	while(N--)
	{
	 	scanf("%d %d",&co,&ex);
	 	p = (Equ)malloc(LEN);
	 	p->coefficient = co;
	 	p->power = ex;
	 	p->next = NULL;
	 	s->next = p;
	 	s = p;
	 }
	 
	 s->next = NULL;
	 
	 return L; 
} 

void print(Equ P)               //输出 
{
	Equ pointer = P;
  	int flag = 0;
  	
  	if(pointer == NULL)
  	{
  		printf("0 0");
	}
	
  	while( pointer != NULL)
  	{
  		if(flag == 0)
		{
		  	printf("%d %d",pointer->coefficient,pointer->power);
		  	pointer = pointer->next;
		  	flag = 1;
		}	
		else
		{
			printf(" %d %d",pointer->coefficient,pointer->power);
		  	pointer = pointer->next;
		}	
	}
}

void Attach(int c,int e,Equ rear)   //将读入的数入链 
{
	Equ p2;
	p2 = (Equ)malloc(LEN);
	p2->coefficient = c;
	p2->power = e;
	p2->next = NULL;
	rear->next = p2;
	rear = p2;
}

Equ multiplication(Equ head_1,Equ head_2)   //相乘 
{
	Equ front, rear, t, t1, t2;
	int c, e;
	
	t1 = head_1->next; t2 = head_2->next;
	
	front = (Equ)malloc(LEN);
	front->next = NULL;
	rear = front;
	
	if(!t1 || !t2)
	{
		return NULL;
	}
	
	
	while(t2)   //用t1的第一项与t2的各项相乘,构成rear
	{
		c = t1->coefficient * t2->coefficient;
		e = t1->power + t2->power;
		Attach(c,e,rear);
		t2 = t2->next;
		rear = rear->next;
	}
	t1 = t1->next;
	
	while(t1)
	{
		t2 = head_2->next;
		rear = front;
		
		while(t2)
		{
			c = t1->coefficient * t2->coefficient;
			e = t1->power + t2->power;
			
			while((rear->next) && (rear->next->power > e))  rear = rear->next;   //循环到  rear所指的指数  =  现在的指数pow  或   p4所指的指数  <  现在的指数pow  或  rear为空 
			
			if((rear->next) && (rear->next->power == e))   //reae所指的指数  =  现在的指数pow 
			{
				if(rear->next->coefficient+c != 0)    //当 rear所指的系数 + 现在的系数  != 0 时 
				{
					rear->next->coefficient += c;    
				}
				else                         //当 rear所指的系数 + 现在的系数  = 0 时   删掉这个节点
				{
					t = rear->next;
					rear->next = t->next;
					free(t);
				}
				
			}
			else
			{
				t = (Equ)malloc(LEN);
				t->coefficient = c;
				t->power = e;
				
				t->next = rear->next;
				rear->next = t;
				rear = rear->next;
			}	
			t2 = t2->next;		
		}
		t1 = t1->next;
	}
	
	t = front; //删除头节点 
	front = front->next;
	free(t);
	
	return front;
 } 


int compare(int a, int b)  //用于比较 
{
	if (a > b)  return 1;
	if (a < b)  return 0;
	if (a == b)  return -1; 
} 


Equ Addition(Equ head_1, Equ head_2)  //相加 
{
	Equ front, rear, t, p1, p2;
	int sum = 0;
	
	p1=head_1->next;  p2=head_2->next; 
	
	front =(Equ)malloc(LEN);
	front->next = NULL;
	rear = front;

	if (!p1 && !p2)
		return NULL;
		
	while (p1&&p2)
	{
		switch (compare(p1->power, p2->power))
		{
			
			case 1: Attach(p1->coefficient, p1->power, rear); rear=rear->next; p1 = p1->next; break;
			
			case 0: Attach(p2->coefficient, p2->power, rear); rear=rear->next; p2 = p2->next; break;
			
			case -1:
				sum = p1->coefficient + p2->coefficient;
				if (sum)
				{
					Attach(sum, p1->power, rear);
					rear=rear->next;
				}
				p1 = p1->next;
				p2 = p2->next;
				break;
		}
	}
	
	for (; p1 != 0;Attach(p1->coefficient, p1->power, rear),	rear=rear->next, p1 = p1->next);
	for (; p2 != 0;Attach(p2->coefficient, p2->power, rear),	rear=rear->next, p2 = p2->next);
	
	t = front;
	front = front->next;
	free(t);
	
	return front;
}
    
  int main()
  {
  	Equ head_1, head_2 ,head_3, head_4;   //  *head_1第一个输入的方程的头节点  *head_2第二个方程的头节点  *head_3加起来的的头节点
  	
	head_1 = creat();
  	head_2 = creat();
  	
	head_3 = multiplication(head_1,head_2); //加法 
  	print(head_3);
  	printf("\n"); 
  	
	head_4 = Addition(head_1,head_2);  //乘法 
  	print(head_4);
  	
  	return 0;
  }
  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值