02-线性结构2 一元多项式的乘法与加法运算
题目要求
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
解题思路:
根据输入样例,多项式均是以指数递减的方式输入,可用动态数组和单链表来表示多项式,本题采用单链表来表示。链表结构如下
typedef struct PolyNode *Polynomial; // 多项式
struct PolyNode {
int coef; // 系数
int expon; // 指数
Polynomial link;
}
按照题目要求搭建程序框架:
int main()
{
读取多项式1
读取多项式2
乘法运算并输出
加法运算并输出
return 0;
}
因此,需要设计读取,加法和乘法运算,输出四个功能的函数。
① 读取函数
根据题目的输入样例,设计读取函数,由于链表中结点链接到链表中从操作频繁,增加设计一个链接函数Attach(),方便操作。
// 链接函数
void Attach(int c, int e, Polynomial *pRear)
{
Polynomial t = new Polynomial();
t->coef = c; // 给新节点赋值
t->expon = e;
t->link = NULL;
(*pRear)->link = t;
*pReal = t; // 修改*pRear的值
}
// 读取多项式函数
Polynomial ReadPoly()
{
Polynomial P = new Polynomial(); // 临时生成链表头空节点
Polynomial Rear, t;
P->link = NULL;
Rear = P;
int n, c, e;
cin >> n;
while(n--)
{
cin >> c >> e;
Attach(c,e,&Rear);
}
t = P; // 删除临时生成的头节点
P = P->link;
free(t);
return P;
}
② 多项式相加函数
两个多项式相加,就是逐项比较两个链表每一项,将指数相同的项系数相加得到新的项,指数较大的项链接到结果链表后并将指针向后移,直到其中一个链表遍历完,将另一链表剩余部分全部连接到结果链表后。
// 多项式相加函数
Polynomial AddPoly(Polynomial P1, Polynomial P2)
{
Polynomial Rear, t1, t2, t;
t1 = P1;
t2 = P2;
Polynomial P = new PolyNode;
P->link = NULL;
Rear = P;
while(t1 && t2)
{
if(t1->expon == t2->expon)
{
int sum = t1->coef + t2->coef;
if(sum != 0)
{
Attach(sum,t1->expon,&Rear);
t1 = t1->link;
t2 = t2->link;
}
else
{
t1 = t1->link;
t2 = t2->link;
}
}
else if(t1->expon > t2->expon)
{
Attach