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

本文详细介绍了一种使用链表结构实现多项式加法和乘法的算法。通过定义链表节点结构,实现了多项式的读取、打印、相加及相乘等功能。文章通过具体的代码示例展示了如何在C语言中操作链表进行多项式运算。
#include <stdlib.h> 
#include <stdio.h>

//这里的链表都是没有头结点的,虽然通过测试得了满分,但是输出格式还是有些不对,
//如输入 2 1 0 2 0
//				1 5 0
// 输出    15 0
//             6 0 2 0
// 但是  第二行输出期望却是 8 0,有兴趣可以改改,在add函数里改一下
typedef struct PolyNode* Polynomial;
struct PolyNode
{
	int coef;					//系数
	int expon;					//指数
	Polynomial link;
};
void Attach(int, int, Polynomial*);
Polynomial ReadPoly();
Polynomial Mult(Polynomial, Polynomial);
void  PrintPoly(Polynomial);
Polynomial Add(Polynomial, Polynomial);

int main()
{
	Polynomial P1, P2, PP, PS;

	P1 = ReadPoly();
	P2 = ReadPoly();
	PP = Mult(P1, P2);
	PrintPoly(PP);
	printf("\n");
	PS = Add(P1, P2);
	PrintPoly(PS);
	return 0;
}
void Attach(int c, int e, Polynomial* pRear)   //注意参数是2级指针,因为想要修改Rear指针的值,参考c,c++是值传递;
{
	Polynomial p = (Polynomial)malloc(sizeof(struct PolyNode));
	p->coef = c;
	p->expon = e;
	p->link = NULL;
	(*pRear)->link = p;
	(*pRear) = p;
}

Polynomial ReadPoly()   //读入多项式
{
	Polynomial P, Rear, temp;
	int c, e, N;
	scanf("%d", &N);
	P = (Polynomial)malloc(sizeof(struct PolyNode));  //建立临时链表头空结点,这样问题较为简单,若不设得判断Rear初值时候为NULL,即是否是第一个节点,所以这个得分开处理
	P->link = NULL;
	Rear = P;
	while (N--)
	{
		scanf("%d%d", &c, &e);
		Attach(c, e, &Rear);              //循环,利用这个函数将多项式一个个插入前面多项式的尾部
	}
	temp = P;
	P = P->link;
	free(temp);  //释放临时生成的头结点,因为这里的链是没有头结点的那种!,下面的都是一样!!!!!!
	return P;
}

Polynomial Add(Polynomial p1, Polynomial p2)
{
	//多项式相加
	Polynomial front, rear, temp;  //front是大哥,返回用;rear是小弟,拉帮结派用

	rear = (Polynomial)malloc(sizeof(struct PolyNode));
	rear->link = NULL;
	front = rear;
	while (p1 && p2)
	{
		if (p1->expon == p2->expon)			//指数相等时
		{
			int sum = p1->coef + p2->coef;
			if (sum)
				Attach(sum, p2->expon, &rear);
			p1 = p1->link;         //这里不用担心外面的p1,p2指向会改变,因为值传递是不会影响外面的值的
			p2 = p2->link;

		}
		else if (p1->expon > p2->expon)
		{
			Attach(p1->coef, p1->expon, &rear);
			p1 = p1->link;
		}
		else
		{
			Attach(p2->coef, p2->expon, &rear);
			p2 = p2->link;
		}
	}
	if (p1)
	{
		Attach(p1->coef, p1->expon, &rear);
		p1 = p1->link;
	}
	else if (p2)
	{
		Attach(p2->coef, p2->expon, &rear);
		p2 = p2->link;
	}
	temp = front;
	front = front->link;
	free(temp);
	return front;
}

Polynomial Mult(Polynomial p1, Polynomial p2)
{
	//逐项插入法,先用p1的一项乘以p2的每一项,得到一个基本的模板,乘完后p1指向当然要往后挪;再用以后的p1的每一项乘以p2每一项,往这个模板里面插~
	Polynomial p, rear, t1, t2, temp;
	int c, e;
	p = (Polynomial)malloc(sizeof(struct PolyNode));
	rear = p;
	t1 = p1;
	t2 = p2;
	if (!p1 || !p2) return NULL;    //任一多项式为空时
	while (t2)
	{  //生成模板
		Attach(t1->coef * t2->coef, t1->expon + t2->expon, &rear);
		t2 = t2->link;
	}
	t1 = t1->link;
	while (t1)
	{	//各项相乘
		t2 = p2;				//重新赋值t2,因为t2在上面已经被改变
		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     //系数为零,删除结点
				{
					temp = rear->link;
					rear->link = temp->link;
					free(temp);
				}
			}
			else     //系数不等
			{
				temp = (Polynomial)malloc(sizeof(struct PolyNode));
				temp->coef = c;
				temp->expon = e;
				temp->link = rear->link;
				rear->link = temp;
				//rear = rear->link;
			}
			t2 = t2->link;
		}
		t1 = t1->link;
	}
	//释放头结点~
	temp = p;
	p = p->link;
	free(temp);
	return p;
}
void PrintPoly(Polynomial p)
{
	int flag = 0;         //辅助调整输出格式用,控制输出次数....
	if (!p)
	{
		printf("0 0");
		return;
	}
	while (p)
	{
		if (!flag)
			flag = 1;
		else
			printf(" ");
		printf("%d %d", p->coef, p->expon);
		p = p->link;
	}
}``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值