PTA 一元多项式的乘法与加法运算 思路分析及代码解析
一、前导
1. 需要掌握的知识
- 链表
- 一元多项式
2. 题目信息
- 题目来源:PTA / 拼题A
- 题目地址: 一元多项式的乘法与加法运算
二、解题思路分析
1. 题意理解
- 输入数据
4 3 4 -5 2 6 1 -2 0 //第一个一元多项式:首数字4表示多项式非零项的个数,随后以指数递降的方式,输入多项式非零项系数和指数
3 5 20 -7 4 3 1 //第二个一元多项式
- 输出数据
结尾不能有多余空格,另外,如果运算结果为0,输出 0 0
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 //两个多项式加法运算的结果
- 题意
编程进行一元多项式的乘法和加法运算并打印结果
2. 思路分析(重点)
本题锻炼链表的基本使用:创建和插入,插入函数是AC的重点
三、具体实现
1. 弯路和bug
- 通过链表存储数据和操作数据时,需要更细致一些,避免指向错误的位置
2. 代码框架(重点)
2.1 采用的数据结构
链表:解法选择了表头不存储数据
#define Null -1
typedef struct polynomial *PtrPoly;
struct polynomial //一元多项式按指数递降的方式进行存储
{
int coefficient; //系数
int exponent; //指数
PtrPoly next; //多项式的下一个非零项
};
2.2 程序主体框架
程序伪码描述
int main()
{
0.根据录入数据形成两个链表
1.将运算结果看成一个空链表,将数据逐项插入到这个空链表中
2.多项式乘法可以看做两层循环,分别执行系数相乘、指数相加
3.多项式加法较简单,若指数相等则系数相加
4.打印输出
}
2.3 各分支函数
- Insert( ) 核心函数,本题的核心就是考察’将数据插入到链表的合适位置’。对于一元多项式,插入时分为三种情况:
(1)插入数据的指数 相较 当前链表指向数据的指数 小
(2)插入数据的指数 大
(3)插入数据的指数 相等
由于是按指数递降的方式存储,当插入数据的指数较小时,说明还未找到合适位置,链表指向需要向后移动,直到满足插入数据的指数 大于等于 当前链表指向数据的指数。这里需要仔细想一下
PtrPoly Insert(PtrPoly result,PtrPoly Element)
{
PtrPoly head,tmp,a; //a 是 插入数据 Element的拷贝
head = result; //result 是运算结果,head记录链表的头元素
a=(PtrPoly)malloc(sizeof(struct polynomial));
a->coefficient=Element->coefficient;
a->exponent=Element->exponent;
a->next=NULL;
while( result->next && a->exponent < result->next->exponent ) //插入数据的指数小,执行循环。直到result->next为空 或者 插入数据的指数较大或相等
result=result->next;
if(!result->next)
{
a->next=result->next;
result->next=a;
}
else
{
if(a->exponent > result->next->exponent) //插入数据的指数大,找到位置
{
a->next=result->next;
result->next=a;
}
else if(a->exponent==result->next->exponent) //插入数据的指数相等
{
result->next->coefficient=result->next->coefficient + a->coefficient;
if(!result->next->coefficient)
{
tmp=result->next;
result->next=tmp->next;
free(tmp);
}
}
}
return head;
}
- CreatePolynomial( ) 根据录入数据存储一元多项式并形成链表。锻炼创建链表的基本功
#define Null -1
PtrPoly CreateNode() //创建一个结点
{
PtrPoly tmp;
tmp=(PtrPoly)malloc(sizeof(struct polynomial));
tmp->coefficient=Null;
tmp->exponent=Null;
tmp->next=NULL;
return tmp