数据结构MOOC 02-线性结构2 一元多项式的乘法与加法运算

这篇博客介绍了如何设计算法来处理一元多项式的乘法和加法运算。首先,通过动态数组或单链表来表示多项式,本例使用单链表。内容包括读取多项式、实现加法和乘法运算的函数,以及按照指数递降方式输出结果。在乘法运算中,将问题转换为多个加法运算,逐项插入结果链表。最后,提供了输出函数以符合指定的输出格式。
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值