数据结构MOOC浙大笔记

第二讲线性结构

2.4应用实例

多项式加法运算

实现思路

在这里插入图片描述

实现方法

采用不带头结点的单向链表,按照指数递减的顺序排列各项
在这里插入图片描述

在这里插入图片描述

  1. 具体的数据结构的结构类型的定义
struct PloyNode{
	int coef;	//系数
	int expon;	//指数
	struct PloyNode *link;	//指向下一个结点的指针
};
typedef struct PloyNode *Ploynomial;
Ploynomial P1, P2;
  1. 设计一个函数,函数参数是传入两个多项式
Polynomial PolyAdd(Polynomial P1, Polynomial P2)		//参数为两个指针,分别指向两个多项式 
{
	Polynomial front, rear, temp;			 			//结果多项式的头和尾的指针 
	int sum;
	rear=(Polynomial)malloc(sizeof(struct PolyNode));	//构造一个临时空结点,作为结果多项式的表头 
	front=rear;											//由front记录结果多项式链表头结点 
	
	while(P1&&P2){										//当两个多项式都有非零项待处理时 
		switch(Compare(P1->expon, P2->expon)){			//Compare函数比较P1,P2所指向的当前这个项的指数 
			case 1:										//P1所指向的当前项的指数大 
				Attach(P1->coef, P1->expon, &rear);		//把P1指向的当前项的指数拷贝过去
				P1=P1->link;							//P1往后挪				
				break;
			case -1:									//P2所指向的当前项的指数大 
				Attach(P2->coef, P2->expon, &rear);		//Attach(coef(系数), expon(指数),形成的新的项接到rear后面) 
				P2=P2->link;
				break; 
			case 0:										//P1,P2所指向的当前项的指数一样大  
				sum = P1->coef+P2->coef;				//把两个项相加的系数赋给sum 
				if(sum)Attach(sum, P1->expon, &rear);	//if(sum)判断sum是否为0,if(sum)是不为0 
														//如果不为0,把sum作为系数,跟对应指数凑到一起接到rear后面去 
				P1=P1->link;
				P2=P2->link;							//P1,P2都往后挪	
				}
		}
	//当循环做完代表P1/P2有一个为空了
	//将未处理完的另外一个多项式的所有结点一次复制到结果多项式中去
	
	//第一个for循环,处理P1不空 
	for(; P1; P1=P1->link)Attach(P1->coef, P1->expon, &rear);
	//第二个for循环,处理P2不空 
	for(; P2; P2=P2->link)Attach(P2-<coef, P2->expon, &rear); 
	rear->link=NULL;	//加完了,最后一项没了
	temp=front;			//为了释放临时空结点
	front=front->link; 	//front原来指向临时的表头结点,表头结点的下一项就是真正多项式的第一项
	free(temp);			//释放临时空表头结点
	return front; 
}
  1. Attach函数具体的实现方法
//Attach函数的实现
//三个参数传进来(系数,指数,当前最后一个结点的指针位置) 
//*pRear是指针的指针 
void Attach(int c, int e, Polynomial *pRear)
{
	Ploynomial P;
	P=(Ploynomial)malloc(sizeof(struct PolyNode));	
	//通过malloc申请结点结点类型为struct PolyNode这个类型 
	P->coef=c;	//对新结点赋值 
	P->expon=e;
	P->link=NULL;
	(*pRear)->link=P;
	*pRear=P;	//修改pRear值 
 } 

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值