两个链式存储的一元多项式乘法运算算法

#include<iostream>
using namespace std;
typedef struct PolyNode * Polynomial;
struct PolyNode {
	int coef;
	int expon;
	Polynomial link;
};
void Attach(int c, int e, Polynomial * Rear)
{
	Polynomial P = new struct PolyNode;
	P->coef = c;
	P->expon = e;
	P->link = NULL;
	(*Rear)->link = P;
	*Rear = P;
}
Polynomial ReadPoly()
{
	int N, c, e;
	Polynomial P = new struct PolyNode;
	Polynomial Rear,t;
	P->link = NULL;
	Rear = P;
	cin >> N;
	cin.get();
	while (N--)
	{
		cin >> c;
		cin.get();
		cin >> e;
		cin.get();
		Attach(c, e, &Rear);
	}
	t = P;
	P = P->link;
	delete t;
	return P;
}
Polynomial Mult(Polynomial P1, Polynomial P2)
{
	int c, e;
	Polynomial t1, t2, P,Rear,t,m,a;
	t1 = P1;
	t2 = P2;
	P = new struct PolyNode;
	P->link = NULL;
	Rear = P;
	if (!P1 || !P2)return NULL;
	else
	{
		while (t2)
		{
			Attach(t2->coef *t1->coef, t2->expon + t1->expon, &Rear);
			t2 = t2->link;
		}
		t1 = t1->link;

		while (t1)
		{
			t2 = P2;
			Rear = P;
			while (t2)
			{
				c = t1->coef *t2->coef;
				e = t1->expon + t2->expon;

				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
					{
						t = Rear->link;
						Rear->link = t->link;
						delete t;
					}
				}
				else       //expon<e
				{
					a = new struct PolyNode;
					a->coef = c;
					a->expon = e;
					a->link = Rear->link;
					Rear->link=a;
					Rear = Rear->link; //注意这里要更新Rear的值,保证在Rear->link
				}

				t2 = t2->link;
			}
			t1 = t1->link;
		}
	}
	m = P;
	P = P->link;
	delete m;
	return P;
}
void Print(Polynomial P)
{
	if (!P)return; //在函数中间返回就要用return
	else
	{
		while (P)
		{
			cout << P->coef << " " << P->expon << " ";
			P = P->link;
		}
	}
}
int main()
{
	Polynomial P1, P2, PP;
	P1 = ReadPoly();
	P2 = ReadPoly();
	PP = Mult(P1, P2);
	Print(PP);
	cin.get();
	return 0;
}
先写void main(),看看用了什么子函数,写好之后再写其他的函数
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值