线性表题解

多项式相乘的链表实现 算法 数据结构 多项式相乘 类 链表 C++ 程序已运行过,能够实现,还可以 立即下载

NO.6多项式相乘

题目要求

题目说明:

要求采用链表形式,求两个一元多项式的乘积:h3 = h1*h2。函数原型为:void multiplication( NODE * h1, NODE * h2, NODE * h3 )。

输入:

输入数据为两行,分别表示两个一元多项式。每个一元多项式以指数递增的顺序输入多项式各项的系数(整数)、指数(整数)。

例如:1+2x+x2表示为:<1,0>,<2,1>,<1,2>,

输出:

 以指数递增的顺序输出乘积: <系数,指数>,<系数,指数>,<系数,指数>,

 零多项式的输出格式为:<0,0>,

我们看一下输入输出样例:

测试输入期待的输出时间限制内存限制
测试用例 1以文本方式显示
  1. <1,0>,<2,1>,<1,2>,↵
  2. <1,0>,<1,1>,↵
以文本方式显示
  1. <1,0>,<3,1>,<3,2>,<1,3>,↵
1秒1024KB
测试用例 4以文本方式显示
  1. <-1,0>,<1,1>,↵
  2. <1,0>,<1,1>,↵
以文本方式显示
  1. <-1,0>,<1,2>,↵
1秒1024KB
测试用例 5以文本方式显示
  1. <5,0>,<10,1>,↵
  2. <2,0>,<3,1>,<4,2>,<5,3>,↵
以文本方式显示
  1. <10,0>,<35,1>,<50,2>,<65,3>,<50,4>,↵
1秒1024KB

预设代码

#include <stdio.h>  
#include <stdlib.h>  
  
typedef struct node  
{   int    coef, exp;  
    struct node  *next;  
} NODE;  
  
void multiplication( NODE *, NODE * , NODE * );  
void input( NODE * );  
void output( NODE * );  
  
void input( NODE * head )  
{   int flag, sign, sum, x;  
    char c;  
  
    NODE * p = head;  
  
    while ( (c=getchar()) !='\n' )  
    {  
        if ( c == '<' )  
        {    sum = 0;  
             sign = 1;  
             flag = 1;  
        }  
        else if ( c =='-' )  
             sign = -1;  
        else if( c >='0'&& c <='9' )  
        {    sum = sum*10 + c - '0';  
        }  
        else if ( c == ',' )  
        {    if ( flag == 1 )  
             {    x = sign * sum;  
                  sum = 0;  
                  flag = 2;  
          sign = 1;  
             }  
        }  
        else if ( c == '>' )  
        {    p->next = ( NODE * ) malloc( sizeof(NODE) );  
             p->next->coef = x;  
             p->next->exp  = sign * sum;  
             p = p->next;  
             p->next = NULL;  
             flag = 0;  
        }  
    }  
}  
  
void output( NODE * head )  
{  
    while ( head->next != NULL )  
    {   head = head->next;  
        printf("<%d,%d>,", head->coef, head->exp );  
    }  
    printf("\n");  
}  
  
int main()  
{   NODE * head1, * head2, * head3;  
  
    head1 = ( NODE * ) malloc( sizeof(NODE) );  
    input( head1 );  
  
    head2 = ( NODE * ) malloc( sizeof(NODE) );  
    input( head2 );  
  
    head3 = ( NODE * ) malloc( sizeof(NODE) );  
    head3->next = NULL;  
    multiplication( head1, head2, head3 );  
  
    output( head3 );  
    return 0;  
}  

信息梳理

我们先看一下题目的输入:

< a , b > ,

尖括号中间有两个数,然后接一个逗号,这样即使多项式的一项。

然后给出了三个函数:

void multiplication( NODE *, NODE * , NODE * );  
void input( NODE * );  
void output( NODE * );  

其中input、output已经完成,要求我们完成相乘操作multiplication。 

然后我们试着先手推一遍:

操作很常规,将两个表达式中的每一项相乘,然后再相加。此时我们发现,似乎有点小问题,也就是指数相同的项并没有合并,这显然不符合题目的要求,所以我们还需要将指数相同的项合并。 

然后我们注意一下题目已经实现的两个操作,在input中发现用来接收两个表达式的链表都是有头结点的,并且是采用尾插法插入的。所以我们在实现想成操作时要注意一下!!!

代码实现

NODE *current1 = h1->next;
NODE *current2;
NODE *temp, *tail = NULL;

PS:这里说明一下,相乘顺序是先固定h1中第一项,然后遍历h2中的每一项,以此类推。

为了创建结果链表更加方便,我使用带尾结点的链表*tail,然后相乘过程中肯定是要遍历h1、h2两个链表的,所以用两层循环:

while (current1 != NULL) {
        current2 = h2->next;
        while (current2 != NULL) {
            temp = (NODE*)malloc(sizeof(NODE));
            temp->coef = current1->coef * current2->coef;
            temp->exp = current1->exp + current2->exp;
            temp->next = NULL;
            if (h3->next == NULL) {       //结果链表h3中还没有结点
                h3->next = temp;
                tail=temp;
            } else {
                tail->next = temp;
                tail = temp;
            }
            current2 = current2->next;
        }
        current1 = current1->next;
    }

思路还是比较简单的,先明确循环终止的条件就是两个表达式链表都遍历完了。然后就是结构体结点的两个元素coef(系数)、exp(指数)的处理逻辑:

temp = (NODE*)malloc(sizeof(NODE));
temp->coef = current1->coef * current2->coef;
temp->exp = current1->exp + current2->exp;
temp->next = NULL;

定义一个结构体预存结果,然后系数是两项系数相乘的结果,而指数是两项指数相加的结果。 

然后就是将预存链表加到结果链表h3中去:

if (h3->next == NULL) {
           h3->next = temp;
           tail=temp;
} else {
           tail->next = temp;
           tail = temp;
}

然后更新current2,继续遍历。当遍历完一遍好h2后,我应该更更新current1了,这里就要注意将current2重置为指向第一项!!!

然后我们可以看一下初步的运行结果: 

可以发现运算的结果是没有问题的,只不过是指数相同的项还没有合并,然后接下来我们想办法实现合并操作:

思路也比较简单,就是先固定一个结点*pre,然后用结点*current来遍历后面的结点,然后比较两者的指数。如果相等,就将p->coef=p->coef+current->coef,但是这样做完并没有真正实现,指数相同两项的合并,因为current此时还依旧在那,我们还需要将其从结果链表中删除。

假如这是当前状态 :

下一步就应该是: 

那么此时可以发现,pre->exp==current->exp,那么我就要完成合并操作,如下图:

change记录的是current的上一个,所以只要将current删去再更新即可,只要想到记录好上一个current也就是change就会比较简单。

所以我们可以这样写:

NODE *pre = h3->next;
NODE *current = pre->next;
NODE *change =pre;           //change用来记录已经比较过的结点(也就是上一个current)
int flag=0;
while(pre!=NULL){
        current =pre->next;
        while(current!=NULL){
            if(pre->exp==current->exp){
                pre->coef=pre->coef+current->coef;
                change->next=current->next;   
                current=current->next;
            }
            else{
                change=current;
                current=current->next;
            }
        }
        pre=pre->next;
        change=pre;
 } 

然后应该就没有问题了,我们试着运行一下,你会发现,对于测试用例4,出现了一个很好气又好笑的问题:

因为它居然将系数为0的项,一本正经地保留了下来!!!

所以我们还需要处理一下结果链表h3中,系数为0的项:

NODE *cur = h3->next;
NODE *pre1 = h3;
while(cur!=NULL){
        if(cur->coef==0){
            pre->next=cur->next;
        }
        pre=cur;
        cur=cur->next;
} 

//遍历一遍,将系数为0的项删除即可(当时心里暗爽,就要过了,爽!!!)

然后我们再提交一下:

没有问题!!!

源代码

多项式相乘

源码放在上面了(^///^)

写这道题的时候,比较有感触,就是做题真的会给人带来成就感,不管这道题是简单还是难!

与君共勉!!!

LVGL iPhone Duo 开合过渡 环境:LVGL 9.x(需要软件模糊),窗口建议 1280×800。界面文案英文(默认 Montserrat 无 CJK)。 阅读详情

相关推荐

数值计算之 插值法(4)切比雪夫零点插值

数值计算之 插值法(4)切比雪夫零点插值前言插值点选取第一类切比雪夫多项式拉格朗日插值多项式的余项切比雪夫零点插值后记 前言 上篇插值法讨论了多项式插值的解,以及龙格现象。本篇将介绍一种在抽取节点时有效降低龙格现象的方法——切比雪夫零点插值。 插值点选取 插值多项式阶数较高时,在取值空间均匀取点,容易出现龙格现象。 即区间边缘的插值结果与原函数差异很大,而区间中央的插值结果相对较好。这表明,高阶多项式插值对区间中央的节点拟合好,而对两端节点拟合效果差。 自然而然会想到,在两端多采样一些节点,在中间少采样一

qq_41035283的博客 1万+

4.一元多项式相乘

要求采用链表形式,求两个一元多项式的乘积:h3 = h1*h2。函数原型为:void multiplication( NODE * h1, NODE * h2, NODE * h3 )。每个一元多项式以指数递增的顺序输入多项式各项的系数(整数)、指数(整数)。以指数递增的顺序输出乘积: <系数,指数>,<系数,指数>,<系数,指数>,例如:1+2x+x2表示为:<1,0>,<2,1>,<1,2>,说明:本题目有预设代码,只要提交你编写的函数即可。零多项式的输出格式为:<0,0>,

记录计算机学习路程 633

EPLAN二次开发实战指南:从API接口到定制化界面

本文为EPLAN二次开发实战指南,详细介绍了从搭建C#开发环境、理解API接口到创建定制化插件的完整流程。通过实战案例,如批量修改设备属性和设计交互式界面,帮助电气工程师利用EPLAN二次开发实现工作流程自动化与深度定制,从而显著提升设计效率。

weixin_29246195的博客 807

七、一元多项式相乘

七、一元多项式相乘 题目描述 要求采用链表形式,求两个一元多项式的乘积:h3 = h1*h2。函数原型为:void multiplication( NODE * h1, NODE * h2, NODE * h3 )。 输入: 输入数据为两行,分别表示两个一元多项式。每个一元多项式以指数递增的顺序输入多项式各项的系数(整数)、指数(整数)。 例如:1+2x+x2表示为:<1,0>,<2,1>,<1,2>, 输出: 以指数递增的顺序输出乘积: <系数,指数>,&l

qq_42582489的博客 3371

对于基本的捕鱼游戏设计思路(五)——鱼

今天讲捕鱼游戏里鱼的部分,也是比较关键的一部分。 一步一步来,先分析游戏,首先鱼是从屏幕外生成,然后它有个移动的动作,而且分为不同的类型。 然后就可以进入代码部分,首先设置一个计时器,控制时间生成鱼,而鱼分种类,所以就用到随机函数,随机输出一个值,传入switch语句,从而生成不同的鱼。 void GameScene::xiaoyuupdate(float dt){ Size visibl

Cineze的博客 1万+

【嵌入式Linux驱动开发】二十四、Linux I2C 驱动上手尝试

  人的前程关于眼界、关乎格局。   志之所趋,无远弗届,穷山复海不能限也;   志之所向,无坚不入,锐兵精甲不能御也。 一、I2C驱动框架简介   Linux内核将 I2C 驱动分为两部分: ①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。 ②、 I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。 1....

悟已往之不谏 知来者之可追 1070

数据结构题——一元多项式相乘

题目描述 要求采用链表形式,求两个一元多项式的乘积:h3 = h1*h2。函数原型为:void multiplication( NODE * h1, NODE * h2, NODE * h3 )。 输入:   输入数据为两行,分别表示两个一元多项式。每个一元多项式以指数递增的顺序输入多项式各项的系数(整数)、指数(整数)。   例如:1+2x+x2表示为:<1,0>,<2,1&g...

qq_36805270的博客 3672

NOC总线架构拓扑介绍

在开篇里,我们对芯片PPA有了初步的认识。下面,让我们从访存这个简单的问题开始展开介绍芯片基础概念。CPU是怎样访问内存的?简单的答案是,CPU执行一条访存指令,把读写请求发往内存管理单元。内存管理单元进行虚实转换,把命令发往总线。总线把命令传递给内存控制器,内存控制器再次翻译地址,对相应内存颗粒进行存取。之后,读取的数据或者写入确认按照原路返回。再复杂些,当中插入多级缓存,在每一层缓存都未命中的情况下,访问才会最终达到内存颗粒。

元直的博客 5297

2.一元多项式相乘

题目说明:   要求采用链表形式,求两个一元多项式的乘积:h3 = h1*h2。函数原型为:void multiplication( NODE * h1, NODE * h2, NODE * h3 )。 输入:   输入数据为两行,分别表示两个一元多项式。每个一元多项式以指数递增的顺序输入多项式各项的系数(整数)、指数(整数)。   例如:1+2x+x2表示为:&lt;1,0&gt;,&l...

该博客暂停使用 1537

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

丨汀、的博客 4万+

太空安全卫士:基于YOLOv5的空间态势感知系统(实现轨道碰撞预警与太空环境保护)

做完这个项目,你会发现自己完整走过了“数据采集→标注→模型训练→功能集成→界面开发”的毕设全流程,这不仅是技术能力的证明,更是对“技术守护宇宙安全”这一理念的实践。答辩时,你可以重点讲这几点:系统解决了航天监测的哪些痛点、YOLOv5在太空目标检测中的性能优势、系统未来能怎么优化(比如对接航天监测网络、实现实时轨道预测)。未来,这个系统还能往“更智能”的方向发展:比如结合轨道计算预测碰撞风险、开发移动端APP让天文爱好者参与太空垃圾上报、在航天任务中实现全自动避障决策……想象空间很大。

m0_71589036的博客 90

icoding题解线性表

设计算法将其调整为左右两部分,左边的元素(即排在前面的)均为奇数,右边所有元素(即排在后面的)均为偶数,并要求算法的时间复杂度为O(n),空间复杂度为O(1)。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度。设计一个高效的算法,从顺序表L中删除所有值介于x和y之间(包括x和y)的所有元素(假设y>=x),要求时间复杂度为O(n),空间复杂度为O(1)。,am),B=(b1, b2,…编写算法,在一非递减的顺序表L中,删除所有值相等的多余元素。

zxlzxl66的博客 673

ANSYS软件二次开发(2):二次开发环境搭建与配置

ADK是ANSYS提供的一个开发工具包,它包含了用于二次开发的API、示例代码和开发指南。ADK支持Python和Tcl,但Python因其易用性和强大的社区支持,成为首选。在ANSYS软件中,自定义菜单与工具栏是实现二次开发的重要途径之一,它允许用户根据自己的需求和工作流程,创建个性化的操作界面。通过自定义菜单与工具栏,可以将常用的功能、自定义的脚本或宏命令整合到一起,提高工作效率。原因:材料参数输入错误,或者模型的物理假设与实际情况不符。解决方案仔细校验材料参数,确保与实验数据一致。

kkchenjj的博客 2206

[题解]CSP-买菜(线性表)

文章目录算法思想结果分析 题目链接. 算法思想 利用线性表存储他们在装车的时间,题目要求计算他们共同在装车的时间,我就只需要求两个线性表的交集即可。同时注意,题目条件里有对于一个时间段[s, t]而言,是从时刻s到时刻t这段时间,时长为t-s,也就是说,是左开右闭区间,长下面这个样。 #include<iostream> #include<math.h> using namespace std; //买菜 int n = 0; int shopping_H[1000005] = {

东皇太一在此的博客 282

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【算法题解】线性表相关

文章目录从尾到头打印链表排序链表的合并反转链表输出单链表倒数第 K 个节点两个链表的第一个公共节点删除链表中节点,要求时间复杂度为O(1) 从尾到头打印链表 来源:剑指offer 牛客网 有三种思路: 第一就是利用栈先入后出的特性完成; 第二就是将链表元素顺序存下来,然后进行数组翻转; 第三是利用递归。 1.栈思路: class Solution { public: vector<i...

qq_43145072的博客 366

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[题解]CSP-火车购票(线性表)

文章目录算法思想结果分析 题目链接. 算法思想 使用线性表,这里用数组,因为第一次要判断同一排的座位,所以另外设置一个数组place来记录每一排剩余的座位数,这样就不需要遍历每一个座位即可得到结果。第二次判断得从头遍历,找到所需要的数量即可。 #include<iostream> using namespace std; //数组 int chair[21][6] = {};//座位编号,0 代表售出 int place[21] = {}; //每一排剩余座位数 int n, p, tic

东皇太一在此的博客 413

WINCC7.3破解文件

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

数据结构线性表选择题习题题解

数据结构线性表选择题题解

qq_64496118的博客 452

求链式线性表的倒数第K项——个人题解与总结

在解决此类问题时,应该注意对于K大于链表长度或者输入为空的边界情况的处理。利用队列数据结构的特性,只需要维护一个大小为K的队列,这种方法提醒我们要突破“必须要存储所有数据”的思维定式,能够想到若要确定倒数第K项元素,只需要知道最后K个元素即可。而队列的FIFO特性完美匹配了这个题目的需求。每当新元素加入时,如果A队列已满(size>K),就自动淘汰最早的元素,这种机制确保了A队列始终包含最新的也就是最后的K个元素。这种思维方式教会我们:有时候不需要掌握全部信息也能解决问题。

Daybreak_OvO的博客 433

opj线性表Placing apples 题解

4:Placing apples 总Time Limit: 1000msMemory Limit: 65536kB Description We are going to place M same apples into N same plates. There could be some empty plates. How many methods do we have? Whe

dreamjay1997的博客 864

数据结构题解:线性表的创建,插入数据,排序,合并。

#include &lt;cstdio&gt; #include &lt;cmath&gt; #include &lt;algorithm&gt; #include &lt;iostream&gt; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OK 1 #define ERROR 0 #define INFEASIBLR...

小宫主的博客 939

数据结构线性表题解

1,大整数加法: 链接:http://xmnd.openjudge.cn/ds201602/1/ 分析:题意很简单,给两个大整数,让你求出他们两的和 其实Java中就有专门用于大整数、大浮点数的运算,有兴趣的了解一下,用起来很方便 import java.math.BigInteger; import java.util.Scanner; public class Main { p...

swunHJ的博客 765

[题解]CSP-最小插值(线性表)

文章目录算法思想代码说明结果分析 题目链接. 算法思想 存储在线性表(数组)中之后,对它使用快排,使得数据按照升序排列,只需要从头遍历,计算相邻两个数之差,再找出所有插值的最小值即可。 代码说明 #include<algorithm>这个库函数里边有快速排序sort(),当第三个参数缺省时,默认按照升序排列,第一个和第二个参数为你需要排序的数组首地址和结束地址。 #include<iostream> #include<algorithm> using namespace

东皇太一在此的博客 395

[题解]CSP-小明种苹果(线性表)

文章目录算法思想结果分析 题目链接. 算法思想 依题意,对从第2行开始的每一行的后边,只需要求得从第2个开始的疏果数总数,把它当作一个整体就好。比较大小计算P和k的时候,就只需要它了。至于T就更简单了,把下面所有数据加起来就好。 其实不需要线性表结构的,每次一读入数据就顺便计算就非常方便 #include<iostream> using namespace std; //小明种苹果 long long int N, M, m; //我就不懂了,只是把这行从 "int" 换成 "long long

东皇太一在此的博客 223

[题解]CSP-分蛋糕(线性表)

文章目录算法思想代码说明结果分析 题目链接. 算法思想 遍历蛋糕,判断一下到底是给这个人还是下一个,判断标准是这个人手中的蛋糕量是否达到了k,若达到了,就让给下一个。 注意对最后一个蛋糕而言,无论是给当前这个人还是让给下一个,都有一个人没有计数,记得算进去。 多审题,多审题。 代码说明 上面的注意点,也可以从我写的while循环里边的 if 的两个分支的角度来考虑: 1、进入到第一个分支,很显然没有改变ans,需要把当前这个人算进去; 2、进入到第二个分支,我们把这个蛋糕让给了下一个人,记得不要把下一个人给

东皇太一在此的博客 362

2020级数据结构荣誉课第一次上机考试题解(线性表)

2020级数据结构荣誉课第一次上机考试题解(线性表) 题目一:7-1 重复计数 (100 分) 输入格式: 第1行,1个整数N,表示整数的个数,(1≤N≤50000)。 第2行,N个正整数,每个整数x 都满足 1 ≤ x ≤2000000000。 输出格式: 若干行,每行两个用一个空格隔开的数,第一个是数列中出现的数,第二个是该数在序列中出现的次数。 输入样例: 在这里给出一组输入。例如: 12 8 2 8 2 2 11 1 1 8 1 13 13 输出样例: 在这里给出相应的.

qq_18375019的博客 723
上一篇: 栈和队列题解
下一篇: 程序设计方法与实践-动态规划
小陈又菜
博客等级 码龄3年 680粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值