郑州轻工业大学2021-2022(2)数据结构习题集 7-1
郑州轻工业大学2021-2022(2)数据结构习题集
6-1 7-1 一元多项式的乘法与加法运算
题目详情
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
思路:
利用存有 系数 指数 两个数据和一个指针的单链表来存储每一项
实现attach
(连接每一项) readPoly
(读入每一个多项式) add
加 mul
乘 函数
具体实现解释如下:
我的答案:
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode* poly;
struct LNode
{
int coef; //系数
int exp; //指数
poly next; //指向下一个节点
};
poly attach(int coef, int exp, poly p) //连接函数 (没有操作p)
{
poly temp = malloc(sizeof(poly)); //申请空间
//读入系数指数
temp->coef = coef;
temp->exp = exp;
//尾元素的next指NULL
temp->next = NULL;
p->next = temp; //新元素temp连接到p后
return p->next; //p->next是新多项式的尾元素也就是temp
}
poly readPoly() //读入多项式(项数 系数 指数)
{
poly p = malloc(sizeof(poly)); //申请空间,p是这个多项式的头
poly temp = p; //先让temp赋为p来从头遍历读入多项式
int num; //读入项数
scanf("%d", &num);
int a, b;
for (int i = 1; i <= num; ++i) //依次读入每项并attach起来
{
scanf("%d %d", &a, &b);
temp = attach(a, b, temp); //新项连接在temp后面
}
return p->next;
//注意:p即头节点没有存东西,所以要返回第一个有效元素p->next
}
poly add(poly a, poly b) //加法
{
poly res, temp; //res 结果 temp临时量
res = malloc(sizeof(poly)); //为结果申请头空间
temp = res; //从temp开始add操作存入res
while (a != NULL && b != NULL) //都不为NULL才能做操作
{
if (a->exp > b->exp) //a的系数大于b,res接上a
{
temp = attach(a->coef, a->exp, temp);
a = a->next;
}
else if (a->exp == b->exp) //系数相等则可以将这项相加
{
int coef = a->coef + b->coef; //系数相加
if (coef != 0) //相加不是0才能接res上
temp = attach(a->coef + b->coef, a->exp, temp);
a = a->next;
b = b->next;
}
else //b的系数大于a的系数,res接上b
{
temp = attach(b->coef, b->exp, temp);
b = b->next;
}
}
//剩余的a链或b链接res上
if (a != NULL)
temp->next = a;
if (b != NULL)
temp->next = b;
return res->next; //注意res头节点也没东西所以返回res->next
}
poly mul(poly a, poly b) //乘法
{
if (a == NULL || b == NULL) return NULL; //NULL
// 答案 临时量 两个多项式
poly res, temp, p1, p2;
p1 = a;
p2 = b;
res = malloc(sizeof(poly)); //给res开辟一个poly空间
temp = res; //temp从此新开辟的空间开始
//让p1的第一项分别乘以p2的每一项得到结果attach到temp上
while (p2 != NULL)
{
temp = attach(p1->coef * p2->coef, p1->exp + p2->exp, temp);
p2 = p2->next;
}
//↑这里是为了先让temp初步形成一个多项式,从而后面计算判断方便
p1 = p1->next; //p1第一项已经运算过了,后移一项
while (p1 != NULL) //p1 * p2 按照我们在纸上演算一样,每挑出一个p1项,与逐个p2项相乘
{
p2 = b; //p2每次都要从首项起点开始
temp = res; //temp每次都要从res起点开始
while (p2 != NULL)
{
int coef, exp;
coef = p1->coef * p2->coef;
exp = p1->exp + p2->exp;
while (temp->next != NULL && temp->next->exp > exp) //系数小于遍历到的temp当前项的指数,则继续往后找小项
temp = temp->next;
if (temp->next != NULL && temp->next->exp == exp) //找到相同系数了
{
temp->next->coef += coef; //系数相加
if (temp->next->coef == 0) //如果系数归零则去除此项
temp->next = temp->next->next;
}
else //这里说明找到最后也没找到,说明这个新得到的指数比已存项最小的还小
{
poly t = malloc(sizeof(poly)); //申请空间
//将这个最小项存入t
t->coef = coef;
t->exp = exp;
//将t连接到temp后面(尾巴)
t->next = temp->next;
temp->next = t;
temp = temp->next;
}
p2 = p2->next;
}
p1 = p1->next;
}
return res->next; //res->next
}
void printPoly(poly p)
{
//输出结尾不能有多余空格所以要用flag处理
int flag = 0;
if (p == NULL) printf("0 0"); //零多项式输出0 0
while (p != NULL)
{
//这里第一次执行时就不会打印空格了
if (flag == 0) flag = 1;
else
printf(" ");
printf("%d %d", p->coef, p->exp);
p = p->next;
}
printf("\n");
}
int main()
{
poly a, b, res_add, res_mul;
a = readPoly();
b = readPoly();
res_mul = mul(a, b);
printPoly(res_mul);
res_add = add(a, b);
printPoly(res_add);
return 0;
}