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

原创 2015年11月20日 22:38:39
02-线性结构1 一元多项式的乘法与加法运算   (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{
	int coefficient;
	int exponent;
	struct node * next;
} PolyNode, *Polynomial;

Polynomial ReadPoly();
void Attach(int c, int e, Polynomial * Rear);
Polynomial MultPoly(Polynomial P1, Polynomial P2);
Polynomial AddPoly(Polynomial P1, Polynomial P2);
void PrintPoly(Polynomial P);

int main(int argc, char const *argv[])
{
	Polynomial Poly1, Poly2, PolySum, PolyMul;

	Poly1 = ReadPoly();
	Poly2 = ReadPoly();
	PolyMul = MultPoly(Poly1, Poly2);
	PrintPoly(PolyMul);
	PolySum = AddPoly(Poly1, Poly2);
	PrintPoly(PolySum);

	return 0;
}

Polynomial ReadPoly()
{
	Polynomial P, Rear, temp;
	P = (PolyNode*)malloc(sizeof(PolyNode));
	P->next = NULL;
	Rear = P;
	int N, c, e;
	scanf("%d", &N);
	while(N--){
		scanf("%d %d", &c, &e);
		Attach(c, e, &Rear);
	}
	temp = P;
	P = P->next; 
	free(temp);
	return P;
}

void Attach(int c, int e, Polynomial * pRear)
{
	Polynomial P;
	P = (PolyNode*)malloc(sizeof(PolyNode));
	P->coefficient = c;
	P->exponent = e;
	P->next = NULL;
	(*pRear)->next = P;
	*pRear = P;
}

Polynomial MultPoly(Polynomial P1, Polynomial P2)
{
	Polynomial P, temp1, temp2, Rear, temp;
	int c, e;
	if(!P1 || !P2)
		return NULL;
	temp1 = P1;
	temp2 = P2;
	P = (PolyNode*)malloc(sizeof(PolyNode));
	P->next = NULL;
	Rear = P;
	while(temp2){
		c = temp1->coefficient * temp2->coefficient;
		e = temp1->exponent + temp2->exponent;
		if(c != 0){
			Attach(c, e, &Rear);
			temp2 = temp2->next;
		}
	}
	temp1 = temp1->next;
	while(temp1){
		temp2 = P2, Rear = P;
		while(temp2){
			c = temp1->coefficient * temp2->coefficient;
			e = temp1->exponent + temp2->exponent;
			if(c != 0){
				while(Rear->next && Rear->next->exponent > e)
					Rear = Rear->next;
				if(Rear->next && Rear->next->exponent == e){
					if(Rear->next->coefficient + c)
						Rear->next->coefficient += c;
					else{
						temp = Rear->next;
						Rear->next = temp->next;
						free(temp);
					}
				}
				else{
					temp = (PolyNode*)malloc(sizeof(PolyNode));
					temp->coefficient = c;
					temp->exponent = e;
					temp->next = Rear->next;
					Rear->next = temp;
					Rear = Rear->next;
				}
				temp2 = temp2->next;
			}
		}
		temp1 = temp1->next;
	}
	temp = P;
	P = P->next;
	free(temp);
	return P;
}

Polynomial AddPoly(Polynomial P1, Polynomial P2)
{
	Polynomial P, temp1, temp2, Rear, temp;
	if(!P1 && !P2){
		if(!P1)
			return P2;
		else
			return P1;
	}
	P = (PolyNode*)malloc(sizeof(PolyNode));
	P->next = NULL;
	Rear = P;
	temp1 = P1;
	temp2 = P2;
	while(temp1 && temp2){
		if(temp1->exponent > temp2->exponent){
			if(temp1->coefficient){
				Attach(temp1->coefficient, temp1->exponent, &Rear);				
			}
			temp1 = temp1->next;
		}
		else if(temp1->exponent == temp2->exponent){
			if(temp1->coefficient + temp2->coefficient){
				Attach(temp1->coefficient + temp2->coefficient, temp1->exponent, &Rear);
			}
			temp1 = temp1->next;
			temp2 = temp2->next;
		}
		else{
			if(temp2->coefficient){
				Attach(temp2->coefficient, temp2->exponent, &Rear);				
			}
			temp2 = temp2->next;
		}
	}
	while(temp1){
		Attach(temp1->coefficient, temp1->exponent, &Rear);
		temp1 = temp1->next;
	}
	while(temp2){
		Attach(temp2->coefficient, temp2->exponent, &Rear);
		temp2 = temp2->next;
	}
	temp = P;
	P = P->next;
	free(temp);
	return P;
}

void PrintPoly(Polynomial P)
{
	int flag = 0;
	if(!P){
		printf("0 0");
	}
	while(P){
		if (!flag)
			flag = 1;
		else
			printf(" ");
		printf("%d %d", P->coefficient, P->exponent);
		P = P->next;
	}
	printf("\n");
}


版权声明:不要信了我的邪

相关文章推荐

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

#include #include typedef struct node{ int coefficient; int exponent; struct node * next; } P...

02-线性结构1 一元多项式的乘法与加法运算[网易云课堂-数据结构]

这道题从自己写,参考其他的人的代码,调了几天才拿到满分,居然是一对大括号的问题,最大的收获是编程的严谨性. #include #include typedef struct Po...

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

写在前面: 为锻炼编程能力,用单链表实现数据的存储; 乘法的还没实现; 注意点: 1,读入多项式函数:1)申请临时头结点;2)释放临时头结点 ...

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

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

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

使用Java语言和数组实现一元多项式的乘法与加法运算,其中主要内容包括,程序框架,函数分析和原代码。...

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

02-线性结构2 一元多项式的乘法与加法运算   (20分) 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式...

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

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

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

[PAT] 02-线性结构2 一元多项式的乘法与加法运算设计函数分别求两个一元多项式的乘积与和。输入格式说明:输入分2行。每行分别先给出多项式非零项的个数。再以指数递降方式输入一个多项式非零项系数和指...

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

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

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

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:02-线性结构1 一元多项式的乘法与加法运算
举报原因:
原因补充:

(最多只允许输入30个字)