浙大版《数据结构(第2版)》题目集 小白专场:一元多项式的加法与乘法运算

题目要求

实现代码


#include "stdafx.h"
#include<iostream>
#include <string> 
#include <cctype> 
using namespace std;
typedef struct PolyNode* Polynomial;
struct PolyNode
{
	int coef;
	int expon;
	Polynomial Link;
};
void Attach(int c, int e, Polynomial* pRear)
{
	Polynomial P;
	P = (Polynomial)malloc(sizeof(PolyNode));
	P->coef = c;
	P->expon = e;
	P->Link = NULL;     //生成一个新结点 
	(*pRear)->Link = P;
	*pRear = P;//
}
Polynomial ReadPoly()
{
	Polynomial P, Rear, t;
	int c, e, N;
	cin>> N;
	P = (Polynomial)malloc(sizeof(PolyNode));
	P->Link = NULL;
	Rear = P;     //生成一个新的空结点
	while (N--)
	{
		cin >> c >> e;
		Attach(c, e, &Rear);
	}
	t = P;
	P = P->Link; 
	free(t);      //把那个空结点释放掉
	return P;

}
int Compare(int a, int b) {
	if (a > b)
		return 1;
	else if (a < b)
		return -1;
	else if (a == b)
		return 0;
}
Polynomial Add(Polynomial P1, Polynomial P2)
{
	Polynomial P, rear, temp;
	int sum;
	P = (Polynomial)malloc(sizeof(PolyNode));
	/*P->Link = NULL;*/
	rear= P ;//由p记录结果多项式链表头结点
	while(P1&&P2)
	{
		switch (Compare(P1->expon, P2->expon)) 
		{
		case 1:
			Attach(P1->coef, P1->expon, &rear);
			P1 = P1->Link;
			break;
		case -1:
			Attach(P2->coef, P2->expon, &rear);
			P2 = P2->Link;
			break;
		case 0:
			sum = P1->coef + P2->coef;
			if (sum)
			{
				Attach(sum, P1->expon, &rear);
				P1 = P1->Link;
				P2 = P2->Link;
				break;
			}

		}
	}

	for (; P1; P1 = P1->Link)
	{
		Attach(P1->coef, P1->expon, &rear);
	}
	for (; P2; P2 = P2->Link)
	{
		Attach(P2->coef, P2->expon, &rear);
	}
	rear->Link = NULL;
	temp = P;
	P = P->Link;//令P指向结果多项式第一个非零项
	free(temp);//释放临时空表头结点
	return P;

}
Polynomial Muit(Polynomial P1, Polynomial P2)
{
	Polynomial P, Rear, t1, t2;
	int c, e;
	if (!P1 ||!P2)
	{
		return NULL;
	}
	t1 = P1; t2 = P2;
	P = (Polynomial)malloc(sizeof(struct PolyNode));
	P->Link = NULL;                                 //生成一个头结点
	Rear = P;
	while (t2) //先用P1的第一项乘以P2,得到P
	{
		Attach(t1->coef*t2->coef, t1->expon + t2->expon, &Rear);
		t2 = t2->Link;
	}
	t1 = t1->Link;
	while (t1)
	{
		t2 = P2; Rear = P;
		while (t2) {
			e = t1->expon + t2->expon;
			c = t1->coef*t2->coef;
			while (Rear->Link&&Rear->Link->expon > e)
			{
				Rear = Rear->Link;
			}
			if (Rear->Link&&Rear->Link->expon == e)
			{
				if (Rear->Link->coef + c)
				{
					Rear->Link->coef += c;
				}
				else
				{
					Polynomial t = Rear->Link;
					Rear->Link = t->Link;
					free(t);
				}
			}
			else 
			{	
				    Polynomial t = (Polynomial)malloc(sizeof(PolyNode));
					t->coef = c; t->expon = e;
					t->Link	=Rear->Link ;
					Rear->Link = t;
					Rear = Rear->Link;

			}
				t2 = t2->Link;
			
		}
		t1 = t1->Link;
	}
	t2 = P; P = P->Link; free(t2);//删除头部空结点
	return P;
}
void PrintPoly(Polynomial P)
{
	int flag = 0;
	if (!P) 
	{
		cout << 0<<" "<<0 << endl;
		return;
	}
	while(P) 
	{
		if (!flag == 0) 
		{
			flag = 1;
		}
		else {
			cout << " ";
		}
		cout << P->coef<<" " << P->expon;
		P = P->Link;
	}
	cout << endl;
}
int main()
{
	Polynomial P1, P2, PP, PS;
	P1 = ReadPoly();
	P2 = ReadPoly();
	PP = Muit(P1, P2);
	PrintPoly(PP);
	PS = Add(P1, P2);
	PrintPoly(PS);
    return 0;
}



结果验证

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值