数据结构MOOC浙大笔记

第二讲线性结构

2.5小白专场

一元多项式的加法与乘法运算

题意理解
设计函数分别求两个一元多项式的乘积
已知两个多项式
(1)3x4-5x2+6x-2
(2)5x20-7x4+3x
多项式和:5x20-4x4-5x2+9x-2
多项式乘积:15x24-25x22+30x21-10x20-21x8+35x6-33x5+14x4-15x3+18x2-6x

题意理解

在这里插入图片描述

求解思路

  • 1.多项式的表示
  • 2.程序框架
  • 3.读多项式
  • 4.加法实现
  • 5.乘法实现
  • 6.多项式输出

多项式的表示

  • 数组:
  • 编程简单
  • 需要事先确定数组大小
  • 链表:
  • 动态性强
  • 编程略为复杂,调试比较困难
  • 动态数组(malloc)

用链表来实现的方法

  1. 数据结构设计
typedef  struct PloyNode *Ploynomial;
struct PloyNode{
	int coef;	//系数变量
	int expon;	//指数变量
	Ploynomial link;
};
  1. 程序框架
    在这里插入图片描述

四个分函数的实现

一、如何读入多项式
1.思路
Ploynomial ReadPoly()
{
	scanf("%d", &N);				//读入第一个多项式的项数
	while(N--){
		scanf("%d %d", &c, &e);		//一对一对地读入系数和整数 
		//读入一个新的结点时,应该插在前面一个结点的后面 
		Attach(c, e, &rear);		//指针Rear代表了当前结果多项式的最后一项  
									//使得新读进来的一项能插在最后一项的后面 
	} 
}

在这里插入图片描述

读入新的一对数c e的时候构造一个新的结点,然后把这个结点插在Rear后面,这个过程通过Attach来完成

在这里插入图片描述
在这里插入图片描述
通过指针的方式使得Rear在Attach函数中能够被改变–>新增结点后Rear要往后移动

Rear的初值为多少

  • ①Rear的初值设置为NULL
    在Attach函数中根据Rear是否为NULL做不同处理
  • Rear为NULL时 ,说明为第一个结点,此时需要申请结点,然后把Rear值为NULL改为指向这个结点
  • ②临时构造空结点,让Rear指向空结点
  • 让Rear指向空结点,新插入的结点全插在Rear后面
  • 无需在Attach里面判断是否为NULL,但是需要释放空结点

此处采用第二种(申请空结点)方法读入多项式

void Attach(int c, int e, Ploynomial *pRear)
{
	Ploynomial P;
	p=(Ploynomial)malloc(sizeof(struct PloyNode));//申请结点
	P->coef=c;			//对新结点赋值
	P->expon=e;			//对新结点赋值
	P-link=NULL;
	(*pRear)->link=P;	//把P赋给*pRear->link
	*pRear=P;			//修改pRear值,使它仍指向最后一个元素 
 } 

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

2.代码实现
Ploynomial ReadPoly(){
	Ploynomial P, Rear, t;
	int c, e, N;
	
	scanf("%D", &N);			//读入多项式的项数
	P=(Ploynomial)malloc(sizeof(struct PloyNode));	//链表头空结点
	P->link=NULL;
	Rear=P;
	While(N--){
		scanf("%d %d", &c, &e);
		Attach(c, e, &Rear);	//将当前项插入多项式尾部 
	} 
	t=P;
	P=P->link;
	free(t);					//删除临时生成的头结点
	return P;
}

如何将两个多项式相加
1.思路
Polynomial PolyAdd(Polynomial P1, Polynomial P2)		//参数为两个指针,分别指向两个多项式 
{
	t1=P1;		//t1,t2分别指向这两个多项式 
	t2=P2;
	rear=(Polynomial)malloc(sizeof(struct PolyNode));	//构造一个临时空结点,作为结果多项式的表头 
	rear=P;												//让Rear做结果多项式的尾部 ,方便t1,t2的插入 
	
	while(t1&&t2){										//当两个多项式都有非零项待处理时 
		if(t1->expon==t2->expon){						//比较当前t1,t2的指数 
			
		}else if(t1->expon>t2->expon){
			
		}else{
			
		} 
	}
	//当其中有一个为空的时候跳出循环
	while(t1){
		//把其中一个可能还不为空的全部接到Rear的后面
	}
	while(t2){
		//把其中一个可能还不为空的全部接到Rear的后面
	}
	return P;
}
2.代码实现
//略
如何将两个多项式相乘
1.思路

方法
①将乘法运算转换为加法运算
将P1当前项(ci, ei)乘P2多项式,再加到结果多项式里

  • 变成一系列多项式的累加运算
t1=P1;
t2=P2;
P=(Ploynomial)malloc(struct PloyNode);
P->linl=NULL;
Rear=P;
while(t2){
	Attach(t1->coef*t2->coef, t1->expon+t2->expon, &Rear);//系数相乘,指数相加
	t2=t2->link; 
} 

②逐项插入
将P1当前项(c1i, e1i)乘 (c2i, e2i),并插入到结果多项式中。关键是要找到插入位置
初始结果可有P1第一项乘P2获得

Ploynomial Mult(Ploynomial P1, Ploynomial P2)
{
	t1=P1;
	t2=P2;
	while(t2){			//构造一个初始结果多项式 
		//先用P1第一项乘以P2每一项,得到 P 
	}
	t1=t1->link;
	while(t1){			//对t1每一个循环 
		t2=P2;
		Rear=P;
		while(t2){		//对t2每一个循环 
			e=t1->expon+t2->expon;	//指数相加 
			c=t1->ceof*t2->ceof;	//系数相乘 
			
			t2=t2->link;			//t2指针往后挪 
		}
		t1=t1->link;				//t1指针往后挪 
	} 		
}

问题

  • 1.怎么构造初始多项式
    在这里插入图片描述

  • 2.怎么插入
    在这里插入图片描述

  • 3.结果怎么处理
    在这里插入图片描述

2.代码实现
//略
如何将多项式输出
1.思路

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值