(四)线性结构练习:多项式的加法和乘法运算

多项式的加法运算

多项式相加:相同指数的系数项相加,其余部分进行拷贝。

法一:采用不带头结点的单项链表,按照指数递减的顺序排列各项

链表的定义:

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

struct PolyNode{
	int coef;       //多项式系数
	int expon;      //多项式指数
	struct PolyNode *Link;
};
PolyNode P1, P2;
typedef struct PolyNode *Polynomial;

 多项式加法实现思路:两个指针P1和P2分别指向这两个多项式第一个结点,不断循环,当某一多项式处理完时,将另一个多项式的所有结点一次复制到结果多项式中去。

 

int Compare(int expon1,int expon2)       //判断多项式1和多项式2指数大小
{
	if (expon1 > expon2)
		return 1;
	else if (expon1 < expon2)
		return -1;
	else
		return 0;
}

void Attach(int coef, int expon, Polynomial *pRear)
{
	Polynomial P;
	P = (Polynomial)malloc(sizeof(struct PolyNode));    //申请新结点
	P->coef = coef;                 //对新结点赋值系数
	P->expon = expon;               //对新结点赋值指数
	P->Link = NULL;                 //构成完整的新结点

	(*pRear)->Link = P;             //将P指向的新结点插入到结果多项式的尾部
	*pRear = P;                     //将P新结点的值给到结果多项式中
}

Polynomial PolyAdd(Polynomial P1, Polynomial P2)
{
	Polynomial front, rear, temp;
	int sum;
	rear = (Polynomial)malloc(sizeof(PolyNode));
	front = rear;                           //由front记录结果多项式链表头结点
	while (P1&&P2)         //当两个多项式都有非零项待处理时
	{
		switch (Compare(P1->expon, P2->expon)) 
		{
		case 1:
			Attach(P1->coef, P1->expon, &rear);            //P1多项式中指数项比较大,放到结果多项式中
			P1 = P1->Link;
			break;
		case 2:
			Attach(P2->coef, P2->expon, &rear);            //P2多项式中指数项比较大,放到结果多项式中
			P2 = P2->Link;
			break;
		case 3:
			sum = P1->coef + P2->coef;              //   //P1和P2多项式中指数项一样大
			if (sum)                  //判断系数和是否为零,如果为零,直接跳过
			{
				Attach(sum, P1->expon, &rear);
			}
			P1 = P1->Link;
			P2 = P2->Link;
			break;
		}
	}                                                  //此时,要么P1处理完毕,要么P2处理完毕
	for (; P1; P1 = P1->Link){                         //如果P1未处理完,放入结果多项式中
		Attach(P1->coef, P1->expon, &rear);
	}
	for (; P2; P2->Link){                              //如果P2未处理完,放入结果多项式中
		Attach(P2->coef, P2->expon, &rear);  
	}
	rear->Link = NULL;                         //收尾工作,将尾指针指向NULL
	temp = front; 
	front = front->Link;                       //front指向结果多项式的第一个非零项
	free(temp);                          //释放掉临时空表头结点
	return front;                        //表头结点
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值