浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算

这篇具有很好参考价值的文章主要介绍了浙大数据结构第二周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

主要思路:

求和的其实课本上讲过了,就是分别遍历L1和L2,

(1)两者如果指数不等则将指数大的节点加入新链表,同时移动新链表与加入节点的指针;

(2)两者如果指数相等则系数相加,同时要判断两者是否为0,不为0时再把合并后接入新链表

(3)如果最后L1或L2有多余直接一次性接入

本题难点在于乘法

我的思路是利用之前实现的多项式加法函数,将多项式乘法转化为多项式加法

(1)用L1的每一项乘整个L2,得到一个多项式

(2)将新得到的多项式与L1前一项与整个L2相乘结果相加

如此便可以得到最终乘法结果

第一次写错误:

(1)每次遍历链表时都会忘记移动指针

(2)题目要求0多项式输出0 0 ,所以首先系数如果是0就不要加入链表,最后如果链表为空打印链表时打印 0 0文章来源地址https://www.toymoban.com/news/detail-536317.html

代码实现:

#include <stdio.h>
#include <stdlib.h>
/*链表表示多项式的数据结构*/
typedef struct ListNode ListNode;
typedef ListNode* List;
struct ListNode {
    int Coefficient, Exponent;
    List Next;
};
/*实现尾插法的函数*/
void Attach(int coef, int expo, List* rear) {   //传rear地址的原因是因为要在函数里修改main函数必须通过地址进行
    List newNode = (List)malloc(sizeof(ListNode));
    newNode->Coefficient = coef;
    newNode->Exponent = expo;
    (*rear)->Next = newNode;
    (*rear) = (*rear)->Next;
    (*rear)->Next = NULL;
}
/*用到尾插法构造链表的函数*/
List CreateList(int degree) {
    List dummyHead = (List)malloc(sizeof(ListNode)); //多项式虚拟头结点
    List rear = dummyHead;
    rear->Next = NULL;
    for(int i = 0; i < degree; i++) {  //创建多项式链表
        int coef, expo;
        scanf("%d %d", &coef, &expo);
        if(coef == 0) continue;
        Attach(coef, expo, &rear);
    }
    return dummyHead;
}


/*打印链表*/
void PrintList(List L) {
    List ptr = L->Next;
    if(ptr == NULL) printf("0 0");
    while(ptr) {
        printf("%d %d", ptr->Coefficient, ptr->Exponent);
        if(ptr->Next) printf(" ");
        ptr = ptr->Next;
    }
    return;
}
/*删除链表*/
void DeleteList(List L) {
    List ptr = L->Next;
    while(ptr) {
        List tmp = ptr;
        ptr = ptr->Next;
        free(tmp);
    }
    free(L);
    return;
}
/*多项式加法,参数是两个链表头指针,不能操作传进来的链表*/
List AddPolynomial(List L1, List L2) {
    List dummyHead = (List)malloc(sizeof(ListNode));
    dummyHead->Next = NULL;
    List rear = dummyHead, ptr1 = L1->Next, ptr2 = L2->Next;
    while(ptr1 && ptr2) {
        int expo1 = ptr1->Exponent, expo2 = ptr2->Exponent;
        int coef1 = ptr1->Coefficient, coef2 = ptr2->Coefficient;
        if(expo1 > expo2) {
            Attach(coef1, expo1, &rear);
            ptr1 = ptr1->Next;
        }
        else if(expo1 < expo2) {
            Attach(coef2, expo2, &rear);
            ptr2 = ptr2->Next;
        }
        else {
            if((coef1 + coef2)) {
                Attach(coef1 + coef2, expo1, &rear);
            }
            ptr1 = ptr1->Next;
            ptr2 = ptr2->Next;
        }
    }
    
    if(ptr1) {
        while(ptr1) {
            Attach(ptr1->Coefficient, ptr1->Exponent, &rear);
            ptr1 = ptr1->Next;
        }
    }
    if(ptr2) {
        while(ptr2) {
            Attach(ptr2->Coefficient, ptr2->Exponent, &rear);
            ptr2 = ptr2->Next;
        }
    }
    return dummyHead;
}
/*多项式乘法,参数是两个链表头指针,不能操作传进来的链表*/
List ProductPolynomial(List L1, List L2) {
    List dummyHead = (List)malloc(sizeof(ListNode));
    List ptr0 = dummyHead, ptr1 = L1->Next, ptr2 = L2->Next;
    ptr0->Next = NULL;
    while(ptr2) {  
        int polyCoef2 = ptr2->Coefficient, polyExpo2 = ptr2->Exponent;
        List dummyHeadTmp = (List)malloc(sizeof(ListNode));
        List ptrTmp = dummyHeadTmp;
        ptrTmp->Next = NULL;
        while(ptr1) {   //将L2的每一项取出来,与L1相乘,得到一条tmp多项式链表
            int polyCoef1 = ptr1->Coefficient, polyExpo1 = ptr1->Exponent;
            int polyCoefTmp = polyCoef1 * polyCoef2;
            int polyExpoTmp = polyExpo1 + polyExpo2;
            if(polyCoefTmp == 0) continue;
            Attach(polyCoefTmp, polyExpoTmp, &ptrTmp);
            ptr1 = ptr1->Next;
        }
        dummyHead = AddPolynomial(dummyHead, dummyHeadTmp); //将这条tmp链表累加到结果链表上即可得到多项式乘法结果
        DeleteList(dummyHeadTmp);   //释放tmp链表
        ptr1 = L1->Next;            //将ptr1重新指向L1
        ptr2 = ptr2->Next;          //ptr2指向L2的下一项
    }
    return dummyHead;
}
int main() {
    int degree1;
    scanf("%d", &degree1);
    List polynomial1 = CreateList(degree1);
    int degree2;
    scanf("%d", &degree2);
    List polynomial2 =  CreateList(degree2);
    List polynomialAdd = AddPolynomial(polynomial1, polynomial2);
    List polynomialPtrduct = ProductPolynomial(polynomial1, polynomial2);
    PrintList(polynomialPtrduct);
    printf("\n");
    PrintList(polynomialAdd);
    DeleteList(polynomial1);
    DeleteList(polynomial2);
    DeleteList(polynomialAdd);
    return 0;
}

到了这里,关于浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】第二章课后练习题——线性结构

    1、线性表是 一个有限序列,可以为空 2、链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用 单循环链表 存储方式最节省运算时间 3、若某线性表中最常用的操作实在最后一个元素之后插入一个元素和删除第一个元素,则采用 仅有尾结点的

    2024年02月07日
    浏览(40)
  • 【数据结构】第二章——线性表(1)

    大家好,很高兴又和大家见面啦!!!从今天开始,我们将进入线性表的学习。 线性表是算法题命题的重点。这类算法题实现起来比较容易且代码量较少,但是要求具有最优的性能(时间复杂度、空间复杂度),因此,我们应该牢固掌握线性表的各种基本操作(基于两种存储

    2024年02月03日
    浏览(25)
  • 【数据结构】第二章——线性表(3)

    大家好,很高兴又和大家见面了!!! 在上一篇中,咱们介绍了顺序表的基本概念,以及通过C语言实现顺序表的创建和对表长的修改。今天咱们将详细介绍一下使用C语言实现顺序表的增删改查。接下来,跟我一起来看看今天的内容吧!!! 我们先来回顾一下上一篇的内容,

    2024年02月04日
    浏览(28)
  • 【数据结构】第二章——线性表(4)

    大家好,很高兴又和大家见面啦!!! 在前面的内容中我们介绍了线性表的第一种存储方式——顺序存储,相信大家经过前面的学习应该已经掌握了对顺序表的一些基本操作了。今天,我们将开始介绍线性表的第二种存储方式——链式存储。 线性表中的数据元素在存储时,

    2024年02月04日
    浏览(20)
  • 【数据结构】第二章——线性表(2)

    大家好,很高兴又和各位见面啦!!!在上一个篇章中,我们简单了解了一下线性表的基础知识以及一下重要的术语。在今天的篇章中我们将来开始正式介绍线性表的顺序存储——又称顺序表。我们将会在本章介绍什么是顺序表,对于顺序表的操作我们又应该如何实现。接下

    2024年02月03日
    浏览(21)
  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之004 week01 02-04 使用泛型实现线性查找法

    在数组中逐个查找元素,即遍历。 在 扎实打牢数据结构算法根基,从此不怕算法面试系列之003 week01 02-03 代码实现线性查找法中,我们实现了如下代码: 之前实现的局限: 只支持int型。 需求: 支持所有的Java基本数据类型以及自定义的类类型。 很简单,很多语言都有这个处

    2023年04月16日
    浏览(23)
  • 浙大数据结构之09-排序1 排序

    给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:只有1个元素; 数据2:11个不相同的整数,测试基本正确性; 数据3:103个随机整数; 数据4:104个随机整数;

    2024年02月11日
    浏览(17)
  • 浙大数据结构第六周之初识图

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。 输入格式: 输入第1行给出2个整数N(0N≤10)和E,分别是图的顶点数和边数。随后E行,每行给

    2024年02月05日
    浏览(15)
  • 【数据结构】一元多项式的表示及相加

    📒博客主页: 程序员好冰 🎉欢迎 【点赞👍 关注🔎 收藏⭐️ 留言📝】 📌本文由 程序员好冰 原创,CSDN 首发! 📆入站时间: 🌴2022 年 07 月 13 日🌴 ✉️ 是非不入松风耳,花落花开只读书。 💭推荐书籍:📚《Java编程思想》,📚《Java 核心技术卷》 💬参考在线编程网

    2024年02月11日
    浏览(24)
  • 浙大数据结构第一周01-复杂度3 二分查找

    本题要求实现二分查找算法。 函数接口定义: 其中 List 结构定义如下: L 是用户传入的一个线性表,其中 ElementType 元素可以通过、==、进行比较,并且题目保证传入的数据是递增有序的。函数 BinarySearch 要查找 X 在 Data 中的位置,即数组下标(注意:元素从下标1开始存储)

    2024年02月12日
    浏览(19)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包