02-线性结构2 一元多项式的乘法与加法运算

02-线性结构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 <stdlib.h>

typedef struct Node *Poly;
struct Node {
	int coef;
	int expo;
	Poly next;
};

Poly read();
void print(Poly p);
Poly add(Poly p1, Poly p2);
Poly multiply(Poly p1, Poly p2);

int main(){
	Poly p1 = read();
	Poly p2 = read();
	
	Poly multiAnswer = multiply(p1, p2);
	Poly addAnswer = add(p1, p2);
	
	print(multiAnswer);
	printf("\n");
	print(addAnswer);
	return 0;
}

Poly read(){
	int n;
	scanf("%d", &n);
	Poly p = (Poly)malloc(sizeof(struct Node));
	p->next = NULL;
	Poly tmp = p;
	if( n == 0){
		Poly newP = (Poly)malloc(sizeof(struct Node));
		newP->next = NULL;
		newP->coef = 0;
		newP->expo = 0;
		tmp->next = newP;
	}

	while(n--){
		Poly newP = (Poly)malloc(sizeof(struct Node));
		newP->next = NULL;
		scanf("%d %d", &newP->coef, &newP->expo);
			
		tmp->next = newP;
		tmp = tmp->next;
	}
	
	return p;
}

Poly multiply(Poly p1, Poly p2){
	Poly p3 = (Poly)malloc(sizeof(struct Node));
	p3->next = NULL;
	
	Poly p1tmp = p1->next, p2tmp = p2->next, p3tmp = p3 ;
	int coef_2, expo_2;
	
	if(p1tmp->next == NULL && p1tmp->coef == 0){
		Poly p3New = (Poly)malloc(sizeof(struct Node));
		p3New->next = NULL;
		p3New->coef = 0;
		p3New->expo = 0;
		p3tmp->next = p3New;
		p3tmp = p3tmp->next; 
		return p3;
	} 
	if(p2tmp->next == NULL && p2tmp->coef == 0){
		Poly p3New = (Poly)malloc(sizeof(struct Node));
		p3New->next = NULL;
		p3New->coef = 0;
		p3New->expo = 0;
		p3tmp->next = p3New;
		p3tmp = p3tmp->next; 
		return p3;
	}
	
	//将p1中的第一项与p2中所有项相乘 
	while(p2tmp){
		
		Poly p3New = (Poly)malloc(sizeof(struct Node));
		p3New->next = NULL;
	
		p3New->coef = p1tmp->coef * p2tmp->coef;
		p3New->expo = p1tmp->expo + p2tmp->expo;
		p2tmp = p2tmp->next;
		
		p3tmp->next = p3New;
		p3tmp = p3tmp->next;
	}
	p1tmp = p1tmp->next;

	//将p1中的从第二项开始与p2中所有项相乘
	Poly p3Check = p3;
	while(p1tmp){
		
		p2tmp = p2->next;
		while(p2tmp){
			coef_2 = p1tmp->coef * p2tmp->coef;
			expo_2 = p1tmp->expo + p2tmp->expo;
			p3Check = p3;
					 
			while(p3Check->next && p3Check->next->expo > expo_2){
				p3Check = p3Check->next;
			}
			
			if(p3Check->next && expo_2 == p3Check->next->expo){
				p3Check->next->coef += coef_2;
			}
			else if(p3Check->next && expo_2 > p3Check->next->expo){
				Poly p3New = (Poly)malloc(sizeof(struct Node));
				p3New->next = NULL;
				
				p3New->coef = coef_2;
				p3New->expo = expo_2;
				p3New->next = p3Check->next;
				p3Check->next = p3New;
			}
			else{
				Poly p3New = (Poly)malloc(sizeof(struct Node));
				p3New->next = NULL;
				p3New->coef = coef_2;
				p3New->expo = expo_2;
				
				p3Check->next = p3New;
			}
			
			p2tmp = p2tmp->next; 
		}
		p1tmp = p1tmp->next; 
	}
	
	return p3;
}

Poly add(Poly p1, Poly p2){
	Poly p3 = (Poly)malloc(sizeof(struct Node));
	p3->next = NULL;
	Poly p3tmp = p3;
	Poly p1tmp = p1->next, p2tmp = p2->next;
	
	while(p1tmp && p2tmp){
		Poly p3New = (Poly)malloc(sizeof(struct Node));
		p3New->next = NULL; 
		p3tmp->next = p3New;
		p3tmp = p3tmp->next;
		
		if(p1tmp->expo > p2tmp->expo){
			p3New->coef = p1tmp->coef;
			p3New->expo = p1tmp->expo;
			p1tmp = p1tmp->next;
		}
		else if(p1tmp->expo < p2tmp->expo){
			p3New->coef = p2tmp->coef;
			p3New->expo = p2tmp->expo;
			p2tmp = p2tmp->next;
		}
		else{
			p3New->coef = p1tmp->coef + p2tmp->coef;
			p3New->expo = p1tmp->expo;
			p1tmp = p1tmp->next;
			p2tmp = p2tmp->next;
		}
	}
	
	while(p1tmp){
		Poly p3New = (Poly)malloc(sizeof(struct Node));
		p3New->next = NULL;
		p3tmp->next = p3New;
		p3tmp = p3tmp->next;
		
		p3tmp->coef = p1tmp->coef;
		p3tmp->expo = p1tmp->expo;
		p1tmp = p1tmp->next;
	}
	
	while(p2tmp){
		Poly p3New = (Poly)malloc(sizeof(struct Node));
		p3New->next = NULL;
		p3tmp->next = p3New;
		p3tmp = p3tmp->next;
		
		p3tmp->coef = p2tmp->coef;
		p3tmp->expo = p2tmp->expo;
		p2tmp = p2tmp->next;	
	}
	
	return p3;
}

void print(Poly p){
	Poly ptmp = p->next;
	if(ptmp){
		if(ptmp->coef != 0){
			printf("%d %d",ptmp->coef, ptmp->expo);
		}
		else if( ptmp->coef == 0 && ptmp->next != NULL){
			Poly ptmp2 = ptmp;
			while(ptmp2){
				if(ptmp2->coef == 0){
					if(ptmp2->next == NULL){
						printf("0 0");
						return;
					}
					ptmp2 = ptmp2->next;
					continue;
				}
				break;
			}
		}
		else{
		printf("0 0");
		return;
		}
	}
	ptmp = ptmp->next;
	
	while(ptmp){
		if(ptmp->coef == 0){
			ptmp = ptmp->next;
			continue;
		}
		printf(" %d %d",ptmp->coef, ptmp->expo);
		ptmp = ptmp->next;
	}
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值