题02-线性结构2 一元多项式的乘法与加法运算(C语言)

这篇具有很好参考价值的文章主要介绍了题02-线性结构2 一元多项式的乘法与加法运算(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

设计函数分别求两个一元多项式的乘积与和。

输入格式:
输入分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

思路

大致如下,这里我是最后才添加判断别的细节的代码(如某一条链没有项的情况和刚好两条多项式抵消的情况 ):

CreateList():一个函数用来将输入的内容创建两条链表。
Multiplication():将两条链表相乘后的结果放到一个新的链表。
Add():将两条链表相加后的结果放到一个新的链表里。

两条链的相乘

先相乘,再将子多项式相加。
通过给出的例子,由第一条的每一项各自与第二条的所有项相乘发现,相乘后第一条每项给自相乘生成的子链数目,由第一条有多少项决定;而每条子链给自有多少项由第二条链有多少项决定。
设计函数分别求两个一元多项式的乘积与和。输入格式:输入分2行,每行分别先给出多,C语言学习笔记,c语言,链表
通过相乘后生成子链,再将所有子链相加,就最终得到真正相乘后两条合并的链。先将第一条子链添加到最终结果的链中,然后再后面的几条子链与最终结果链里的项相比,子项系数相等,则相加;系数大于结果链里的某一项的系数,则添加到该项前;如果子项系数既不相等也不大于,也就是都小于结果链的的所有项的系数,则添加到结果链最后。

两条链相加

思路大致同两条链相加,就是没有刚开始相乘形成子多项式(子链)的步骤,只有后面将子链相加的步骤。文章来源地址https://www.toymoban.com/news/detail-724257.html

代码

#include <stdio.h>
#include <stdlib.h>
typedef int coefficient;//系数
typedef int exponent;//指数
typedef struct Node *LinkList;
typedef LinkList List;
typedef struct Node{
    coefficient coe;
    exponent exp;
    struct Node * next;
}node;
List CreatList(List list,int num);
List Multiplication(List l1,List l2,int num1,int num2);
List Add(List l1,List l2,int num2);
int main(void)
{
    //用带头链表
    int m,n;//代表每一多项项式有多少项
    //输入第一个多项式
    scanf("%d",&m);
    getchar();
    List list1 = (node*)malloc(sizeof(node));//创建list1并指向头结点
    list1->next = NULL;
    CreatList(list1,m);

    //输入第二个多项式
    scanf("%d",&n);
    getchar();
    List list2 = (node*)malloc(sizeof(node));//创建list2并指向头结点
    list2->next = NULL;
    CreatList(list2,n);

    if(m==0&&n!=0){
        List p = list2->next;
        printf("0 0\n");
        for(int i=0;i<n;i++){
            printf("%d %d",p->coe,p->exp);
            if(p->next!=NULL){
                printf(" ");
            }
            p = p->next;
        }
    }else if(m!=0&&n==0){
        List p = list1->next;
        printf("0 0\n");
        for(int i=0;i<n;i++){
            printf("%d %d",p->coe,p->exp);
            if(p->next!=NULL){
                printf(" ");
            }
            p = p->next;
        }
    }else{
            //算相乘
        List mullist,mul;
        mullist = Multiplication(list1,list2,m,n);
        mul = mullist->next;

        //算相加
        List addlist,add;
        addlist = Add(list1,list2,n);
        add = addlist->next;

        while(mul!=NULL){//相乘的没有系数为0的情况
            if(mul->coe!=0){
                printf("%d %d",mul->coe,mul->exp);
                if(mul->next!=NULL)
                    printf(" ");            
            }
            mul = mul->next;
        }
        printf("\n");
        int flag=1;
        while(add!=NULL){
            if(add->coe!=0){
                printf("%d %d",add->coe,add->exp);
                List b = add->next;
                flag = 0;
                if(add->next!=NULL&&b->coe!=0)
                    printf(" "); 
            }
            add = add->next;
        }
        if(flag){
            printf("0 0");
        }
    }

    return 0;
}
//创建两个链表的函数
List CreatList(List list,int num)//指针函数
{
    List temp = list;
    for(int i=0;i<num;i++){
        temp->next = (node*)malloc(sizeof(node));
        temp = temp->next;
        scanf("%d %d",&(temp->coe),&(temp->exp));
        getchar();
        temp->next = NULL;
    }
    return list;//返回链表的首地址
}

//创建连接相乘的函数
List Multiplication(List l1,List l2,int num1,int num2)
{
    //用第一条连接乘第二条连接
    //第一条链有m项,与第二条链相乘形成m个子链;
    //每个子链里的项的数量由第二条链有n项决定。
    //用指针数组来指向所有子项
    List temp1,temp2,Child[num1];
    temp1 = l1->next;
    temp2 = l2->next;
    //每个子项创建头结点
    for(int i=0;i<num1;i++){
        Child[i] = (node*)malloc(sizeof(node));
        Child[i]->next = NULL;
    }
    //开始第一条链的每项分别与第二条链所有项相乘
    for(int i=0;i<num1;i++){
        List tempSon = Child[i];
        temp2 = l2->next;
        for(int j=0;j<num2;j++){
            tempSon->next = (node*)malloc(sizeof(node));
            tempSon = tempSon->next;
            tempSon->coe = temp1->coe*temp2->coe;
            tempSon->exp = temp1->exp+temp2->exp;
            tempSon->next = NULL;
            temp2 = temp2->next;
        }
        temp1 = temp1->next;
    }

    //将所有子项相加组成新的链
    //创建合并后的链的头指针并指向头结点
    List temp,multemp;
    int flag;
    List mulLink = (node*)malloc(sizeof(node));
    mulLink->next = Child[0]->next;//将合并链的头结点指向第一个子链
    //将存有第一条子链的合并链与剩下的子链合并
    for(int i=1;i<num1;i++){
        temp = Child[i]->next;
        for(int j=0;j<num2;j++){
            multemp = mulLink->next;
            List last = multemp;
            flag = 1;
            while(multemp!=NULL){
                if(temp->exp==multemp->exp){
                    multemp->coe = multemp->coe+temp->coe;
                    //Child[i]->next = temp->next;
                    //free(temp);
                    temp = temp->next;
                    last = multemp;
                    multemp = multemp->next;
                    flag = 0;
                    break;
                }else if(temp->exp>multemp->exp){
                    Child[i]->next = temp->next;
                    temp->next = multemp;
                    last->next = temp;
                    temp = Child[i]->next;
                    last = multemp;
                    multemp = multemp->next;
                    flag = 0;
                    break;
                }else{
                    last = multemp;
                    multemp = multemp->next;
                }               
            }
            if(flag){
                Child[i]->next = temp;
                last->next = temp;
                temp->next = NULL;
                temp = Child[i]->next;
            }
        }
    }
    return mulLink;
}

//相加函数
List Add(List l1,List l2,int num2)
{
    List addList = (node*)malloc(sizeof(node));//创建相加后的链表的头指针并指向头结点
    addList->next = l1->next;//将第一条链添加到新链中

    List temp2,addtemp,last;    
    //第二条链每项分别与新链的所有项比较,指数相等则相加,并对比大小,由大到小排
    for(int i=0;i<num2;i++){
        temp2 = l2->next;//让链2的临时指针指向头结点后的第一个
        addtemp = addList->next;//让新链接的临时指针指向头结点后的第一个结点
        last = addList;
        int flag = 1;
        while(addtemp!=NULL){
            if(temp2->exp==addtemp->exp){
                addtemp->coe += temp2->coe;
                l2->next = temp2->next;
                //temp2 = l2->next;
                //last = addtemp;
                //addtemp = addtemp->next;
                flag = 0;
                break;
            }else if(temp2->exp>addtemp->exp){
                l2->next = temp2->next;
                temp2->next = addtemp;
                last->next = temp2;
                //temp2 = l2->next;
                //last = addtemp;
                //addtemp = addtemp->next;
                flag = 0;
                break;
            }else{
                last = addtemp;
                addtemp = addtemp->next;
            }
        }
        if(flag){
            l2->next = temp2->next;
            last->next = temp2;
            temp2->next = NULL;
        }
    }
    return addList;
}

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

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

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

相关文章

  • 【数据结构】一元多项式的表示及相加

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

    2024年02月11日
    浏览(47)
  • 数据结构(严蔚敏)【一元多项式的运算】【C语言】

    1、一元多项式的运算:实现两个多项式加、减乘运算 设计内容: 用顺序存储结构实现一元多项式的加法、减法和乘法。具体要求为:用五个函数分别实现一元多项式的创建、输出、加法、减法和乘法; 设计思路: 将顺序表数组下标作为多项式的指数项,数组内的数据元素

    2023年04月15日
    浏览(47)
  • 【数据结构】15 队列应用实例:多项式加法运算

    我们准备采用不带头节点的单向链表结构表示一元多项式,并按照指数递减的顺序排列各项。 对列表存放的两个多项式进行加法运算时,可以使用两个指针p1和p2。初始时的p1和p2分别指向这两个多项式第1个节点(指数的最高项)。通过循环不断比较p1和p2所指的节点,比较结

    2024年02月21日
    浏览(62)
  • 数据结构:链表应用:第1关:基于链表的两个一元多项式的基本运算

    任务描述 本关任务:给定两个一元多项式A(x)与B(x),利用链表表示A(x)与B(x),实现A(x)与B(x)的加法、减法、乘法和求导运算。 编程要求 输入 输入多组数据,总计n*( a+b+2)+1行。其中,第一行整数n代表总计有n组数据,之后依次输入n组数据。每组数据包括a+b+2行,其中第一行是两

    2024年04月12日
    浏览(60)
  • 一元多项式相加问题(两种方法)

    一元多项式的相加问题,主要运用了线性结构的合并,在合并线性结构的基础上,增加判断,所以我们可以将这个问题理解为一个复杂的线性表合并问题  目录 问题描述 一、顺序表法 1.1 初始化并创建顺序表 1.2 一元多项式相加算法 1.3 完整代码 二、单链表法 1.1 初始化并创

    2024年02月06日
    浏览(52)
  • 【链表应用】| 一元多项式的操作

    专栏推荐:写文章刚刚起步,各个专栏的知识点后续会补充完善,不断更新好文,希望大 家支持一下。 专栏 名字 Elasticsearch专栏 es spring专栏 spring开发 redis专栏 redis学习笔记 项目专栏 项目集锦 修bug专栏 bug修理厂 设有两个一元多项式: p(x)=p0+p1x+p2x2+···+pnxn q(x)=q0+q1x+q2x2+··

    2024年02月06日
    浏览(67)
  • 用链表表示多项式,并实现多项式的加法运算

    输入格式: 输入在第一行给出第一个多项式POLYA的系数和指数,并以0,0 结束第一个多项式的输入;在第二行出第一个多项式POLYB的系数和指数,并以0,0 结束第一个多项式的输入。 输出格式: 对每一组输入,在一行中输出POLYA+POLYB和多项式的系数和指数。 输入样例: 输出样例: 本

    2024年02月07日
    浏览(71)
  • 多项式加法(用 C 语言实现)

    目录 一、多项式的初始化 二、多项式的创建 三、多项式的加法 四、多项式的输出 五、清除链表 六、主函数 用链表实现多项式时,每个链表节点存储多项式中的一个非零项,包括 系数( coef ) 和 指数( exp )两个数据域 以及 一个指针域( next ) 。对应的数据结构定义为

    2024年02月01日
    浏览(30)
  • Python做曲线拟合(一元多项式拟合及任意函数拟合)

    目录 1. 一元多项式拟合 使用方法 np.polyfit(x, y, deg) 2. 任意函数拟合 使用 curve_fit() 方法 实例: (1)初始化 x 和 y 数据集 (2)建立自定义函数 (3)使用自定义的函数生成拟合函数绘图  polyfig 使用的是最小二乘法,用于拟合一元多项式函数。 参数说明: x 就是x坐标,

    2024年02月02日
    浏览(54)
  • 一元稀疏多项式简单计算器(C语言)含注释

    问题描述 设计一个一元稀疏多项式简单计算器 基本要求 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; (

    2024年02月08日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包