第二讲线性结构
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)
用链表来实现的方法
- 数据结构设计
typedef struct PloyNode *Ploynomial;
struct PloyNode{
int coef; //系数变量
int expon; //指数变量
Ploynomial link;
};
- 程序框架
四个分函数的实现
一、如何读入多项式
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.代码实现
//略