关于多项式的加和、乘积可用链表和数组

一元多项式的乘法与加法运算 一元多项式的乘法与加法运算|线性结构。 阅读详情

关于多项式的加和、乘积

  • Dargon

  • 2020/11/11

  • 所遇到的的重要的问题:

  • 教科书 来自:《数据结构和算法分析》第三章

对于链表操作,自己要去自己实现链表的节本功能,例如基本的created、insert、delete。要写出来,并且运行才知道其中的一些道理,和自己容易出错的地方

1,运用数组运算

  • 运用数组存储对应指数的项的系数
    例如对于数组a[10] 可以存储0 次方~ 9 次方的系数,数组的下标对应的是指数,数组的元素的内容对应的是该位的系数。

  • 缺点
    当遇到不连续的情况,就事倍功半了 如计算a = X^1000 +5X^10, b = X^1050 +X^1 +5

2,运用链表运算

Creat struct:

typedef struct PNODE {
    int Coefficient;
    int Exponent;
    struct PNODE *Next;
}ListNode;

2.1 创建链表 Created_linklist

用两种方式创建链表

  1. 第一种 多申请一个head 浪费一些内存空间
ListNode *creat_list(int n) {
    ListNode *root;
    ListNode *pre, *current;
    int c, e, i;
    root =(ListNode *)malloc(sizeof(ListNode));
    assert(root !=NULL);
    pre =root;

    for( i =0; i <n; i++ ) {        
        printf("请输入第%d项: ", i+1);
        scanf("%d%d", &c, &e);
        current =(ListNode *)malloc(sizeof(ListNode));
        assert( current !=NULL );
        current->Coefficient =c;
        current->Exponent =e;
        current->Next =NULL;

        pre->Next =current;
        pre =current;
    }
    return root;
}
  1. 此方法更合理
ListNode *creat_list_v2(int n) {
    ListNode *root;
    ListNode *newnode, *current;
    int c, e, i;
    root =current =NULL;
    for(i =0; i <n; i++) {
        printf("请输入第%d项: ", i+1);
        scanf("%d%d", &c, &e);
        newnode =(ListNode *)malloc(sizeof(ListNode));
        assert( newnode != NULL );

        newnode->Coefficient =c;
        newnode->Exponent =e;
        newnode->Next =NULL;

        if(root ==NULL) 
            root =newnode;
        else 
            current->Next =newnode;        
        current =newnode;
    }
    return root;
}

2.2 插入节点 insert ListNode

和正常的插入节点一样,将指向链表(根指针root)的指针作为参数传入到函数中,排除previous =NULL 的特殊情况

int insert_onenode_v2(ListNode **rootp) {
    ListNode *current;
    ListNode *newnode;
    int c, e;
    printf("分别输入要插入项的系数指数:");
    scanf("%d%d", &c,&e);
    while( (current =*rootp) !=NULL && current->Exponent >e ) {
        rootp =&(current->Next);
    }
    if(current->Exponent ==e) {
        current->Exponent +=e;
    }
    else {
        newnode =(ListNode *)malloc(sizeof(ListNode));
        assert( newnode !=NULL );

        newnode->Coefficient =c;
        newnode->Exponent =e;

        newnode->Next =current;
        *rootp =newnode;
    }
    return TRUE;
}

2.3 删除节点 delete ListNode

int delete_onenode(ListNode **rootp) {
    ListNode *current;
    int e;
    printf("分别输入要删除项的指数:");
    scanf("%d", &e);
    while( (current =*rootp) !=NULL && current->Exponent !=e ) {
        rootp =&(current->Next);
    }
    if( current ==NULL ) return FALSE;
    else {
        *rootp =current->Next;
        free(current);
    }
    return TRUE;
}

2.4 多项式相加 polynomial add

方法有待于更改,传入的多项式,默认是次幂是从高到低进行排列的,中间重复代码过多!!

void product_node(ListNode **rootp, int COE, int e) {
    ListNode *newnode;
    newnode =(ListNode *)malloc(sizeof(ListNode));
    assert(newnode !=NULL);

    newnode->Coefficient =COE;
    newnode->Exponent =e;
    newnode->Next =NULL;

    (*rootp)->Next =newnode;
    (*rootp) =newnode;
}
ListNode *AddPolynomial_v3( ListNode *roota, ListNode *rootb ) {
    ListNode *pa, *pb, *rootc, *pc, *newnode;
    pa =roota->Next;
    pb =rootb->Next;
    rootc =(ListNode *)malloc(sizeof(ListNode));
    rootc->Coefficient =0;
    rootc->Exponent =0;
    rootc->Next =NULL;
    pc =rootc;
    int COE =0, e;

    while( pa !=NULL && pb !=NULL ) {
        if(pa->Exponent ==pb->Exponent) {
            COE =pa->Coefficient +pb->Coefficient;
            e =pa->Exponent;
            pa =pa->Next;
            pb =pb->Next;
        }
        else if( pa->Exponent >pb->Exponent ) {
            COE =pa->Coefficient;
            e =pa->Exponent;
            pa =pa->Next;
        }
        else {
            COE =pb->Coefficient;
            e =pb->Exponent;
            pb =pb->Next;
        }
        if( COE !=0 ) {
            product_node(&pc, COE, e);           
            COE =0;
        }
    }
    while( pa !=NULL ) {
        COE =pa->Coefficient;
        e =pa->Exponent;
        pa =pa->Next;
        if( COE !=0 ) {
            product_node(&pc, COE, e);
            COE =0;
        }
    }
    while( pb !=NULL ) {
        COE =pb->Coefficient;
        e =pb->Exponent;
        pb =pb->Next;
        if( COE !=0 ) {
            product_node(&pc, COE, e);
            COE =0;
        }
    }
    return rootc;   
}

测试结果显示

int DataStruct_02_02(void) {
    ListNode *roota, *rootb;
    roota =creat_list_v2(2);
    print_list_v2(roota);
    rootb =creat_list_v2(2);
    print_list_v2(rootb);
    insert_onenode_v2( &rootb);
    print_list_v2(rootb);
    delete_onenode(&rootb);
    print_list_v2(rootb);
    
    print_list_v2(AddPolynomial_v2(roota, rootb));
    free_list(roota);
    free_list(rootb);
    return RUN_TEST_OK;
}

result


请输入第1项: 1 3
请输入第2项: 2 1
1*X^3+ 2*X^1  
请输入第1项: 1 5
请输入第2项: 1 3
1*X^5+ 1*X^3
分别输入要插入项的系数指数:1 6
1*X^6+ 1*X^5+ 1*X^3
分别输入要删除项的指数:6
1*X^5+ 1*X^3
1*X^5+ 2*X^3+ 2*X^1
1/1 (100.00%) passed

按任意键关闭终端。

2.4 多项式相乘 polynomial multiply

解题思路参照:https://blog.youkuaiyun.com/weixin_43911865/article/details/100544395
整体的思路就是:
利用最高次幂去做循坏,每一次循环将所有相乘为该次幂的项全部找出,将其系数相乘作和,直到找到 0 次幂为止
中间利用一次反转,对于整个链表的反转,不过此方法还是做了很多次没有意义的循环。

void inverse_list(ListNode *root) {
    ListNode *current =root->Next;
    ListNode *next;
    root->Next =NULL;
    while(current) {
        next =current->Next;
        current->Next =root->Next;
        root->Next =current;
        current =next;
    }
}

ListNode *MultPolynomial_v2( ListNode *roota, ListNode *rootb ) {
    ListNode *rootc, *pa, *pb, *pc, *newnode;
    int exp_max;
    pa =roota;
    pb =rootb;
    
    if(pa->Next !=NULL && pb->Next !=NULL) {
        exp_max =pa->Next->Exponent +pb->Next->Exponent; 
    }
    else {
        return NULL;
    }
    rootc =(ListNode *)malloc(sizeof(ListNode));
    assert(rootc !=NULL);
    rootc->Coefficient =0;
    rootc->Exponent =0;
    rootc->Next =NULL;
    pc =rootc; //As a head of listnode to use

    inverse_list(rootb); //Inverse order of the list
    int COE =0; //系数和
    int k =0; //指数

    for(k =exp_max; k >=0; k--) {
        //Keep pa exponent is largest
        pa =roota->Next;
        while(pa !=NULL && pa->Exponent >k) {
            pa =pa->Next;
        }
        //Search pb in the list
        pb =rootb->Next;
        while(pa !=NULL && pb !=NULL && (pa->Exponent +pb->Exponent) <k) {
            pb =pb->Next;
        }
        // Now (pa +pb)->exp >= k
        while(pa !=NULL && pb !=NULL) {
            if( (pa->Exponent +pb->Exponent) ==k ) {
                COE += (pa->Coefficient *pb->Coefficient);
                pa =pa->Next;
                pb =pb->Next;
            }
            else {
                if( (pa->Exponent +pb->Exponent) <k )
                    pb =pb->Next;
                else 
                    pa =pa->Next;
            }
        }
        //mallco new node insert in c list
        if( COE !=0 ) {
            newnode =(ListNode *)malloc(sizeof(ListNode));
            assert(newnode);

            newnode->Coefficient =COE;
            newnode->Exponent =k;
            newnode->Next =NULL;

            pc->Next =newnode;
            pc =newnode;

            COE =0;
        }
    }
    inverse_list(rootb);
    return rootc;
}

测试结果 result

请输入第1项: 1 2
请输入第2项: 1 1
1*X^2+ 1*X^1
请输入第1项: 1 3
请输入第2项: 1 1
1*X^3+ 1*X^1
1*X^5+ 1*X^4+ 1*X^3+ 1*X^2
1/1 (100.00%) passed

按任意键关闭终端。

2.4 free内存

void free_list(ListNode *root) {
    ListNode *first_node;   
    while(root !=NULL) {
        first_node =root;
        root =root->Next;
        free(first_node);
    }
}

3,总结

方法还有很多,目前只是简单的实现,记录于此!

数组实现多项式相乘 多项式相乘 【问题描述】 编写一个程序实现两个一元多项式相乘。 【输入形式】 首先输入第一个多项式中系数不为0的项的系数和指数,以一个空格分隔。且该多项式中各项的系数均为0或正整数,系数和最高幂次不会超过int类型的表示范围。对于多项式 anxn +a n-1 x n-1 + … + a1x1 + a0x0 的输入方法如下: an n a n-1 n-1 … a1 1 a0 0 即相邻两个整数分别表示表达式中一项的系数和指数。在输入中只出现系数不为0的项。最后一项的指数后没有空格,只有一个. 阅读详情

相关推荐

pta 一元多项式的乘法与加法运算 链表和数组两种解法,c++

02-线性结构2 一元多项式的乘法与加法运算 (20分) 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2 6 1 -2 0 3 5 20 -7 4 3 1 输出样例

m0_46314516的博客 499

uniapp+H5实现条码扫描全攻略:零SDK依赖,手把手教你集成QuaggaJS(含闪光灯控制)

本文详细介绍了如何在uniapp框架下通过H5技术实现零SDK依赖的条码扫描功能,重点解析了QuaggaJS的集成方法和闪光灯控制技巧。该方案具有轻量级、跨平台兼容性强等特点,适用于零售、物流等多个场景,帮助开发者快速构建高效的前端条码扫描解决方案。

cake8的博客 354

7-2 一元多项式的乘法与加法运算 (20分)(附测试点3和4)

文章目录问题解决方法后记 问题 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4...

weixin_43725617的博客 2954

C语言链表实现一元多项式的相加和相乘

你可以定义一个函数 `insertNode`,该函数将根据指数的大小将结点插入到适当的位置,并合并具有相同指数的项。这个函数将遍历两个多项式链表,相同指数的项系数相减,然后将结果插入到新的链表中。在 `main` 函数中创建两个多项式,分别插入结点,然后调用相加和相减运算的函数,将结果打印出来,以验证运算的正确性。这个函数将遍历两个多项式链表,相同指数的项系数相加,然后将结果插入到新的链表中。首先,需要定义一个多项式结点的数据结构,包含系数和指数,并且要有指向下一个结点的指针。这将作为链表的结点类型。

m0_73884264的博客 883

29、因子图与和积算法详解

本文详细介绍了因子图与和积算法的基本原理及其在概率图模型中的应用。首先阐述了和积算法的核心概念,包括消息的定义、更新规则、初始化与终止条件,并通过理论证明和具体示例说明其在无环图中精确计算边际分布的能力。随后,结合贝叶斯网络实例,展示了如何利用该算法计算条件概率。最后总结了算法的优势与局限性,并展望了其在复杂图结构和多领域应用中的发展潜力。

2y3u4i5o6p的博客 137

sum-product:使用和积算法的无向图消息传递

和积 使用和积算法的无向图消息传递。 该演示程序输出不同节点之间传递的消息以及最终的边际概率。 这不是一个通用的工具包,而只是一个类作业。 编译程序,运行以下命令: . 编译 运行程序: java SumProduct

数据结构实验——用链表实现简单的多项式乘法

数据结构实验——用链表实现简单的多项式乘法 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录数据结构实验——用链表实现简单的多项式乘法前言一、实验要求二、实验内容和实验步骤:1.需求分析2.概要设计3.代码设计总结 前言 本人计算机小菜鸟,写的程序比较垃圾,仅供参考,也是作为自己成长的一份记录,欢迎大家批评指正! 提示:以下是本篇文章正文内容,下面案例可供参考 一、实验要求 实验目的: 设计一个一元稀疏多项式简单计算器。 一元稀疏多项式简单计算器的基本功能是: (1)输入并建

wokeyia的博客 5561

LDPC译码算法_最小和算法_和积算法_matlab

【达摩老生出品,必属精品,亲测校正,质量保证】 资源名:LDPC译码算法_最小和算法_和积算法_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手及有一定经验的开发人员

数据结构用链表实现多项式乘积

这是数据结构课的一个实验,我们知道,线型表有两种表示方式,一种是顺序表示,比如说你可以用数组来实现一个顺序结构的线性表,还有一种是链式表示,用链表的形式来构造一个线性表。 这次实验要做的内容就是用链式结构来实现两个多项式的相乘,我用的教材是严蔚敏和吴伟民编著,清华大学出版社出版的教材,大家用相同教材的同学可以直接看代码,下面我简单的分析一下这个实验。 想要实现多项式的乘法,我们先来考虑怎样实现多项...

学习记录 1821

CAN总线错误帧全解析:从数据包到硬件层的故障树分析

本文深入解析CAN总线错误帧的故障树分析方法,从数据包到硬件层全面剖析错误机制。通过物理层信号测试、数据链路层错误解码和应用层协议排查,提供系统化的诊断框架。结合CANoe配置和示波器波形分析,帮助工程师快速定位总线故障,提升系统可靠性。

weixin_26742753的博客 488

对比实验系列:Efficientdet环境配置及训练个人数据集

可以通过下方链接下载Efficientdet源码。

Yayisheng的博客 4585

算法探究2--多项式的乘积与和

多项式成绩

qq_43655213的博客 725

基于Xilinx_IBERT的光纤接口眼图测试

基于Xilinx_IBERT的光纤接口眼图测试

Coca_Tian的博客 1万+

【数据结构】——多项式乘法

题目要求 从字符文件输入两个多项式的非零系数及对应的指数,建立多项式的链式存储结构,计算这两个多项式的乘积,输出乘积多项式的全部非零系数及对应的指数到另一字符文件中。 算法原理 两个多项式的乘法,可以借助两个多项式的加法的算法来实现。 设: ...

qq_41932198的博客 7302

Vmware安装windowsServer2022版本

全网最详细的Vmware安装windowsServer2022版本

A乐神的博客 7005

摩擦纳米发电机测试系统全解析:从硬件配置到软件控制

本文全面解析摩擦纳米发电机(TENG)测试系统,涵盖硬件配置、软件控制及系统集成。详细介绍NI USB-6003等采集卡的选择与使用,以及一体化控制软件的功能与优势,帮助研究人员高效评估纳米材料发电性能。系统支持自动测试与数据分析,显著提升测试效率与准确性。

weixin_28720767的博客 460

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

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

Chen 1084

【PCL常用分割器】SACSegmentation

是一种基于采样一致性(Sample Consensus)的点云分割方法。它通过从点云中选取少量样本,拟合参数化几何模型(如平面、圆柱),并评估所有点与模型的误差一致性,最终选择内点集合最优的模型作为分割结果。与其他分割器(Region Growing、EuclideanClusterExtraction)不同,它不依赖空间连通性,而是依赖几何一致性。

yijiujiusan的博客 1309

两个一元多项式相乘,数组与链表实现

<br />/*<br />一元多项式求乘积<br />*/<br />#include<stdio.h><br />#include<time.h><br />#include<stdlib.h><br />void init_num(int x[],int y[])<br />{<br /> /*<br /> int i;<br /> srand( (unsigned)time( NULL ) );<br /> for(i=0;i<65536;i++)<br /> {<br />  srand( (un

yanghangjun的专栏 7076

电磁场仿真软件:Sonnet_(12).Sonnet与其他软件的集成

Sonnet作为电磁场仿真领域的强大工具,不仅能够独立完成复杂的仿真任务,还可以通过与其他软件的集成,实现更高效的工作流程和更广泛的功能扩展。通过与CAD、EDA、数据处理软件、MATLAB、Python以及云计算平台的集成,Sonnet用户可以更好地利用现有设计资源,进行参数优化和结果分析,从而提升设计和仿真效率。希望本节的内容能够帮助你更好地理解和应用Sonnet的集成功能。

kkchenjj的博客 1431

【2005】人工智能⭐

问题的解答来自于过去的经验而不是规则,这些经验是以案例方式存储的。但是当人们遇到一个新的问题的时候,一般先是回忆,从记忆中找到一个与新的问题相似的案例,然后把该案例的有关信息和知识复用到新问题的求解之中。1、若案例(case)不够充足,而有足够的规则(知识),试问如何构建一个包含有基于案例推理和基于规则推理的推理系统,以使推理效率提高而且总能求得问题的解。一般认为,CBR适合缺乏完备和健全的理论,但又可获取丰富经验的领域,而RBR则适合于对领域有充分的认识,能以完备和健全的形式表示领域理论的场合。

super_mochi1 279

7-1 一元多项式的乘法与加法运算 (20 分)【三种解法+满分+详解】

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2 6 1 ...

丁世杰的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【数据结构】多项式加法与乘法

人类对于多项式相加的思维是这样的: P1=3X5+4X4−X3+2X−1P1 = 3X^5+4X^4-X^3\quad\quad\quad +2X-1P1=3X5+4X4−X3+2X−1 P2=2X4+X3−7X2+XP2 = \quad\quad\quad2X^4 +X^3-7X^2+XP2=2X4+X3−7X2+X ----------------------------------------------------------------- P=3X5+6X4−7X2+3X−1P = 3X^5 +

tianty1121的博客 1890

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C++一元多项式的乘法运算(单链表实现)

题目描述:给你两个一元多项式,输出这两个一元多项式的乘积。输入格式:输入包含两行,每行一个一元多项式。每行开头一个数字n,表示该多项式非零项项数,后面有n组数字,每组数字包含两个数字,按顺序分别为该项的系数和指数。

newbie的博客 2700

一元多项式的乘法与加法运算 (20 分)链表数组双解法

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2...

W_Dreamland的博客 747
上一篇: CAndPrimer_17 关于堆栈,队列,树的基础理解(ADT)
下一篇: AVL平衡树的理解(插入、查找、删除)
Dreams0000
博客等级 码龄7年 15粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值