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

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

输入格式:

输入分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
/*
	Name: 一元多项式的乘法与加法运算 
	Copyright: 
	Author: xuuyann 
	Date: 19/10/18 11:23
	Description: 
*/

#include <stdio.h>
#include <stdlib.h>

struct PolyNode{
	int coef;//系数
	int expon;//指数
	struct PolyNode *link;//指向下一个结点的指针 
};
typedef struct PolyNode *Polynomial;
Polynomial P1, P2;

Polynomial Read();//读入多项式,返回多项式的头结点 
Polynomial PolyAdd(Polynomial P1, Polynomial P2);//多项式相加
Polynomial PolyMultiply(Polynomial P1, Polynomial P2);//多项式相乘
int Compare(int e1, int e2);//比较两多项式各项指数的大小
void Attach(int coef, int expon, Polynomial *PtrRear);
//将系数coef和指数expon构成的新项加入结果多项式的末端,同时改变当前结果多项式末尾指针PtrRear 
void Write(Polynomial P);


int main()
{
	Polynomial P1, P2;
	Polynomial AddResult, MulResult;
	P1 = Read();
	P2 = Read();//P1,P2均指向多项式链表中的第一个非零结点 
	MulResult = PolyMultiply(P1, P2);
	Write(MulResult);
	printf("\n");
	AddResult = PolyAdd(P1, P2);
	Write(AddResult);
	
	return 0;
}

                                                     
Polynomial Read()
//传递进来的是多项式非零项的个数,返回多项式头结点 
{
	Polynomial rear, front, temp;
	int i,N;
	int c,e;
	scanf("%d",&N);
	//建立一个新的空表头 
	rear = (Polynomial)malloc(sizeof(struct PolyNode));
	front = rear;//由front记录多项式链表表头结点 
	for (i=0 ;i<N ;i++){
		scanf("%d %d",&c ,&e );
		if (c != 0) Attach(c ,e ,&rear);
	}
	rear->link = NULL;
	temp = front;
	front = front->link ;//令front指向多项式第一个非零项
	free (temp);
	
	return front; 
}

int Compare(int e1, int e2)
//比较两项指数e1和e2的大小,根据大、小、相等三种情况分别返回1,-1, 0 
{
	if (e1 > e2) return 1;
	else if (e1 == e2) return 0;
	else return -1;
}

Polynomial PolyAdd(Polynomial P1, Polynomial P2)
//将两个多项式相加 
{
	Polynomial front, rear, temp;
	rear = (Polynomial)malloc(sizeof(struct PolyNode));
	front = rear;
	while (!P1 && !P2){  //两多项式为空 
		front->coef = 0;
		front->expon = 0;
		front->link = NULL;
	}
	while (P1 && P2){   //当P1与P2均指向非零项 
		//判断P1所指向的指数与P2所指向的指数大小
		if (Compare(P1->expon ,P2->expon ) == 1){ //e1大于e2 
			Attach(P1->coef ,P1->expon ,&rear);    //将P1放入结果多项式链表中 
			P1 = P1->link;   //P1指向下一个结点 
		}
		else if (Compare(P1->expon ,P2->expon ) == -1){
		 	Attach(P2->coef ,P2->expon ,&rear);  //将P2放入结果多项式链表中 
			P2 = P2->link;	
		}else{
			if (P1->coef + P2->coef ) Attach(P1->coef + P2->coef ,P1->expon ,&rear); //将两项和放入结果多项式链表中
			P1 = P1->link;
			P2 = P2->link; //P1和P2均指向下一个结点 
		}
	}
	//P1为空并且P2不为空,将P2剩余结点插入结果多项式中 
	for ( ;P2 ;P2 = P2->link )
		Attach(P2->coef ,P2->expon ,&rear);
	//P2为空并且P1不为空,将P1剩余结点插入结果多项式中 
	for ( ;P1 ;P1 = P1->link )
		Attach(P1->coef ,P1->expon ,&rear);
	rear->link = NULL;
	temp = front;
	front = front->link ;
	free(temp);
	
	return front;
} 

Polynomial PolyMultiply(Polynomial P1, Polynomial P2)
{
	Polynomial front, rear, temp,temp_1,temp_2, newNode;
	rear = (Polynomial)malloc(sizeof(struct PolyNode));
	front = rear;
	while (!P1 || !P2){
		return NULL;
	} 
	temp_1 = P1;
	temp_2 = P2;
	while (temp_2){
		Attach((temp_1->coef )*(temp_2->coef ),temp_1->expon + temp_2->expon ,&rear); //相乘结果得到的项插入结果多项式中 
		temp_2 = temp_2->link;
	}
	temp_1 = temp_1->link ;   //temp_1指向P1的下一个结点 
	while (temp_1){
		rear = front;
		temp_2 = P2;
		while (temp_2){
			int c = temp_1->coef * temp_2->coef ;  //当前项系数 
			int e = temp_1->expon + temp_2->expon ;  //当前项指数 
			//与当前结果多项式中的每一项的指数进行比较,找到相应位置后插入
			while (rear->link&&rear->link->expon > e){ //当前结果多项式中某一项指数大于当前项指数 
				 rear = rear->link ;
			}
			/************************************************
			下面有种情况:1.当前项指数大于结果中的某一项指数 
						2.当前项指数等于结果中的某一项指数
						3.当前项指数最小 
			**************************************************/
			if ((rear->link && rear->link->expon < e) || !(rear->link)){
				newNode = (Polynomial)malloc(sizeof(struct PolyNode));
				newNode->coef = c;  //插入新结点 
				newNode->expon = e;
				newNode->link = rear->link ;
				rear->link = newNode;   //rear没变
				rear = rear->link ;
			}else if (rear->link && rear->link->expon == e){  //指数相等,系数相加 
				rear->link->coef += c;
				if (!c){     //若系数相加为0 
					Polynomial t;
					t = rear->link ;
					rear->link =t->link ;
					free(t);
				}
			}	
			temp_2 = temp_2->link ;
		}
		temp_1 = temp_1->link ;
	}
	temp = front;
	front = front->link;
	free(temp);	
	
	return front;
}

void Attach(int coef, int expon, Polynomial *PtrRear)
//将即将插入结果多项式中的每一项连接起来 
{
	Polynomial temp;
	temp = (Polynomial)malloc(sizeof(struct PolyNode));
	temp->coef = coef;
	temp->expon = expon;
	temp->link = NULL;
	(*PtrRear)->link = temp;
	*PtrRear = temp;
}

void Write(Polynomial P)
{
	if (!P) printf("0 0");
	while (P){
		if (!(P->link)){
			printf("%d %d",P->coef ,P->expon );
			break;
		}
		printf("%d %d ",P->coef ,P->expon );
		
		P = P->link ;
	}
}

测试点:同类项合并时有抵消 未通过

猜你喜欢

转载自blog.csdn.net/qq_26565435/article/details/83210680