详解线性结构 —— 一元多项式的乘法与加法运算

本文详细介绍了如何使用链表实现一元多项式的乘法与加法运算,包括逐项相乘法及按指数递降排序。文章通过C语言代码展示了解决方案,涉及多项式链表的创建、加法和乘法函数的实现,并提供了完整的代码示例。
摘要由CSDN通过智能技术生成

原题
设计函数分别求两个一元多项式的乘积与和。

输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1

输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

原题链接

题解
  这道题目不算太难,就是代码比较长。下面会给出这道题最直接简单的解法。

首先,我们是通过链表的形式来存储多项式,每一个链表节点包含有系数,指数,以及指向下一个节点的指针。

1 struct LNode{
2 int coef, exp;
3 LNode *next;
4 };
  我们的main函数如下:

复制代码
1 int main() {
2 LNode *L1 = creatList(); // 创建第1个多项式
3 LNode *L2 = creatList(); // 创建第2个多项式
4
5 printList(polyMult(L1, L2)); // 两个多项式求和,并打印输出
6 printList(polyAdd(L1, L2)); // 两个多项式相乘,并打印输出
7
8 return 0;
9 }
复制代码
  其中,creatList函数是用来创建一个链表,函数代码如下:

creatList
  需要注意的是,我们的链表都带有头指针。

下面来讲解polyAdd函数。

polyAdd
  由于链表带有头节点,所以先让指针后移一个单位,指向第一个存放数据的节点。

然后我们需要创建一个链表,用来存储两个多项式相加后的结果。

之后我们进入循环,来进行多项式的相加,循环的条件是两个多项式都存在,不为空。

由于题目的要求是按指数递降方式输出,所以我们按下面的判断规则来把相加的结果插入到新的链表中。

1.如果L1所指向节点的exp大于L2所指向节点的exp,也就是L1 -> exp > L2 -> exp,则不需要相加,只需要把L1所指向节点的coef和exp拷贝到新的节点中,然后把新节点插入到求和的链表中。同时,还要让L1指针向后移动一个位置。

2.如果L2所指向节点的exp大于L1所指向节点的exp,也就是L2 -> exp > L1 -> exp,则不需要相加,只需要把L2所指向节点的coef和exp拷贝到新的节点中,然后把新节点插入到求和的链表中。同时,还要让L2指针向后移动一个位置。

3.如果L2所指向节点的exp等于L1所指向节点的exp,也就是L2 -> exp == L1 -> exp,我们就需要对两个这节点的coef进行相加,把相加的结果存放到新节点的coef中,同时也要把当前的exp存放到新节点中。再来对相加后的coef进行判断,如果相加后的coef == 0,那么就不需要把它插入到求和的链表中,同时把新节点通过关键字delete删除。如果相加后的coef != 0,我们就把新节点插入到求和的链表中。最后,别忘了让L1和L2向后移动一个位置。

当退出循环后,说明其中一个多项式已经为空了,这个时候我们只需要找到那个还没有空的多项式,然后把该多项式剩余的那部分节点都接到求和链表的后面,就完成了两个多项式求和这个过程了。当然,如果退出时两个多项式都为空了,我们同样可以把其中的一个多项式接到求和链表的后面,只不过这个时候接的是NULL。

下面来是polyMult函数。

polyMult
  我们通过逐项相乘的方法来实现两个多项式的求和。比如说,对于x2 - 1和x + x2 + 1这两个多项式,我们先让第一个多项式中的x2去乘第二个多项式的每一项,得到x3 + x4 + x2,把结果插入到求积的链表中,然后再让第一个多项式中的下一个项-1去乘第二个多项式的每一项,得到多项式-x - x2 - 1。当然,在程序中我们不是先把结果算出来再插入到求积链表中,而是每计算一次,就把该结果插入到求积链表中。所以,真正难的地方就在于,如何把计算结果插入到求积链表中,同时保证我们的结果是按指数递降的方式存放的。

来看我们的程序,为了实现上面说的逐项相乘,首先我们需要一个嵌套循环。外层循环的条件是第一个多项式不为空,内层循环的条件是第二个多项式不为空。这样我们就实现了用第一个多项式的每一项去乘以第个多项式的每一项。

我们是在内层的循环中进行多项式相乘计算,以及插入操作。

先把多项式相乘后的coef和exp存放到新节点中,然后把它插入到求积链表中。

什么时候插入呢?就是在求积链表中找到那个指数exp比新节点的指数exp小的那个节点,然后我们把新节点的插入到那个指数exp比它小的节点之前就可以了。

https://read.douban.com/reader/column/38848914/chapter/221053796/


https://read.douban.com/reader/column/38848914/chapter/221064154/


https://read.douban.com/reader/column/38848914/chapter/221079474/


https://read.douban.com/reader/column/38848914/chapter/221105054/


https://read.douban.com/reader/column/38848914/chapter/221117462/


https://read.douban.com/reader/column/38848914/chapter/221122697/


https://read.douban.com/reader/column/38848914/chapter/221127809/


https://read.douban.com/reader/column/38848914/chapter/221136440/


https://read.douban.com/reader/column/38848914/chapter/221140066/


https://read.douban.com/reader/column/38848914/chapter/221148382/


https://read.douban.com/reader/column/38848914/chapter/221151755/


https://read.douban.com/reader/column/38848914/chapter/221157122/


https://read.douban.com/reader/column/38848914/chapter/221168578/


https://read.douban.com/reader/column/38848914/chapter/221172697/


https://read.douban.com/reader/column/38848914/chapter/221175486/


https://read.douban.com/reader/column/38848914/chapter/221178376/


https://read.douban.com/reader/column/38848914/chapter/221182572/


https://read.douban.com/reader/column/38848914/chapter/221187825/


https://read.douban.com/reader/column/38849095/chapter/221200485/


https://read.douban.com/reader/column/38849095/chapter/221206422/


https://read.douban.com/reader/column/38849095/chapter/221210348/


https://read.douban.com/reader/column/38849095/chapter/221212530/


https://read.douban.com/reader/column/38849095/chapter/221214564/


https://read.douban.com/reader/column/38849095/chapter/221218080/


https://read.douban.com/reader/column/38849095/chapter/221221518/


https://read.douban.com/reader/column/38849095/chapter/221225398/


https://read.douban.com/reader/column/38849095/chapter/221232915/


https://read.douban.com/reader/column/38849095/chapter/221235899/


https://read.douban.com/reader/column/38849095/chapter/221239076/


https://read.douban.com/reader/column/38849095/chapter/221242196/


https://read.douban.com/reader/column/38849095/chapter/221246147/


https://read.douban.com/reader/column/38849095/chapter/221251565/


https://read.douban.com/reader/column/38849095/chapter/221254425/


https://read.douban.com/reader/column/38849095/chapter/221260102/


https://read.douban.com/reader/column/38849095/chapter/221263404/


https://read.douban.com/reader/column/38849095/chapter/221267861/


https://read.douban.com/reader/column/38849095/chapter/221271688/


https://read.douban.com/reader/column/38849117/chapter/221285038/


https://read.douban.com/reader/column/38849117/chapter/221288779/


https://read.douban.com/reader/column/38849117/chapter/221292298/


https://read.douban.com/reader/column/38849117/chapter/221301018/


https://read.douban.com/reader/column/38849117/chapter/221303573/


https://read.douban.com/reader/column/38849117/chapter/221306061/


https://read.douban.com/reader/column/38849117/chapter/221309229/


https://read.douban.com/reader/column/38849117/chapter/221313969/


https://read.douban.com/reader/column/38849117/chapter/221320099/


https://read.douban.com/reader/column/38849117/chapter/221330612/


https://read.douban.com/read

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值