一元n次多项式乘法【数据结构-链表】

一元n次多项式定义如下:

33aca58a8f1f47548743e4a248c96b10.png

其中Ai​为实数,i为不小于0的整数。在完成“一元n次多项式输入输出”题目的基础上实现一元n次多项式的乘法。要求使用链表实现上述运算。

输入格式:

有两个一元n次多项式,格式分别为:
f(X)=3X2+ X+1
g(X)=−2X2−X-1
其中系数为实数,指数为不小于0的整数,则输入分为2行,第1行为第1个一元n次多项式,第1个一元n次多项式按照第1项系数,指数 第2项系数,指数 .... 的格式输入,系数和指数以“,”分割,各项的系数和指数之间以空格分割,输入的一元n次多项式不要求按指数有序排列,最后以 0,0(即系数=0,指数=0)表示结束。第2行为第2个一元n次多项式,输入格式与第1个一元n次多项式相同。对上面的两个一元n次多项式:

输入样例:

3,2 1,1 1,0 0,0
-2,2 -1,1 -1,0 0,0

输出格式:

输出分为以下3行:第1行输出第1个一元n次多项式,第2行输出第2个一元n次多项式,第3行输出两个一元n次多项式的乘积。输出要求一元n次多项式的高次项在前,低次项在后,即按指数由大到小排列,实数保留小数点后面1位数,一元n次多项式为f(X)=0时,输出为f(X)=0.0。对上面两个一元n次多项式的输出为:

输出样例:

f(X)=3.0X^2+X+1.0
g(X)=-2.0X^2-X-1.0
f(X)*g(X)=-6.0X^4-5.0X^3-6.0X^2-2.0X-1.0
#include <stdio.h>
#include <stdlib.h>typedef struct PolynomialNode   //创建一个结构体
{double coefficient;         //多项式系数int exponent;               //多项式指数struct PolynomialNode *next;//指针
} PolynomialNode;PolynomialNode* createNode(double coefficient, int exponent) 
{                               //为链表分配内存空间 PolynomialNode *newNode = (PolynomialNode*)malloc(sizeof(PolynomialNode));newNode->coefficient = coefficient;newNode->exponent = exponent;newNode->next = NULL;return newNode;
}void insertNode(PolynomialNode** head, double coefficient, int exponent) 
{PolynomialNode* newNode = createNode(coefficient, exponent);if (*head == NULL || exponent > (*head)->exponent)  //链表为空||新的指数>头节点指数{newNode->next = *head;                   //新节点插入链表头部*head = newNode;         //新节点的next指针指向头节点,新节点更新为头节点} else {    //定义一个指向PolynomialNode类型的指针current,并将其初始化为指向链表的第一个节点PolynomialNode* current = *head;while (current->next!= NULL && current->next->exponent > exponent) {current = current->next;            //遍历}if (current->exponent == exponent)      //当前项与某项指数相同{current->coefficient += coefficient;//合并同类项free(newNode);} else {newNode->next = current->next;      //插入到合适的位置current->next = newNode;}}
}void printPolynomial(PolynomialNode* head, const char* name) 
{if (head == NULL) {printf("%s=0.0\n", name);return;}PolynomialNode* current = head;printf("%s=", name);int isFirstTerm = 1;while (current!= NULL) {if (current->coefficient == 0) {current = current->next;continue;}if (!isFirstTerm) {if (current->coefficient > 0) {printf("+");} else {printf("");}}if (current->coefficient == 1 && current->exponent == 1) {printf("X");} else if (current->coefficient == -1 && current->exponent == 1) {printf("-X");} else if (current->coefficient == 1 && current->exponent > 1) {printf("X^%d", current->exponent);} else if (current->coefficient == -1 && current->exponent > 1) {printf("-X^%d", current->exponent);} else {if (current->exponent > 1) {printf("%.1fX^%d", current->coefficient, current->exponent);} else if (current->exponent == 1) {printf("%.1fX", current->coefficient);} else {printf("%.1f", current->coefficient);}}isFirstTerm = 0;current = current->next;}printf("\n");
}void freePolynomial(PolynomialNode* head) 
{PolynomialNode* current = head;  while (current!= NULL) {             //为了在释放当前节点的内存后,能够继续遍历链表PolynomialNode* next = current->next;free(current);current = next; //将current指针更新为指向刚才保存的下一个节点}
}PolynomialNode* multiplyPolynomials(PolynomialNode* p1, PolynomialNode* p2) 
{PolynomialNode* result = NULL;PolynomialNode* current1 = p1;while (current1!= NULL)    //***核心运算逻辑***(双层遍历){          //只要current1不为NULL,就表示还有项需要处理PolynomialNode* current2 = p2;while (current2!= NULL) {      //只要current2不为NULL,就表示还有项需要处理double newCoefficient = current1->coefficient * current2->coefficient;int newExponent = current1->exponent + current2->exponent;insertNode(&result, newCoefficient, newExponent);current2 = current2->next;}current1 = current1->next;}PolynomialNode* temp = result;while (temp!= NULL && temp->next!= NULL) {if (temp->exponent == temp->next->exponent) //结果的合并同类项{temp->coefficient += temp->next->coefficient;PolynomialNode* toFree = temp->next;temp->next = temp->next->next;free(toFree);} else {temp = temp->next;                    //移动指针到下一项,继续检查下一对相邻项}}return result;
}int main() 
{PolynomialNode* poly1 = NULL;PolynomialNode* poly2 = NULL;double coefficient;int exponent;// 输入第一个多项式while (scanf("%lf,%d", &coefficient, &exponent) && (coefficient!= 0 || exponent!= 0)) {if (exponent < 0) {printf("Exponents must be non-negative. Please enter valid input.\n");return 1;}insertNode(&poly1, coefficient, exponent);}// 输入第二个多项式while (scanf("%lf,%d", &coefficient, &exponent) && (coefficient!= 0 || exponent!= 0)) {if (exponent < 0) {printf("Exponents must be non-negative. Please enter valid input.\n");return 1;}insertNode(&poly2, coefficient, exponent);}// 输出第一个多项式printPolynomial(poly1, "f(X)");// 输出第二个多项式printPolynomial(poly2, "g(X)");// 计算并输出乘积PolynomialNode* product = multiplyPolynomials(poly1, poly2);printPolynomial(product, "f(X)*g(X)");// 释放内存freePolynomial(poly1);freePolynomial(poly2);freePolynomial(product);return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 知识点_01

1、DISTINCT select DISTINCT EMPLOYEE_ID ,FIRST_NAME from employees 按照ID去重&#xff0c;DISTINCT的字段要放在前面&#xff0c;不会再继续在FIRST_NAME上去重判断&#xff1b; 如果需要多字段去重&#xff0c;需要用到group by&#xff0c;这个后面讲&#xff1b; …

一次恶意程序分析

首先F12shift查看字符表 字符表发现可疑字符串 双击进入 再tab 进入这里 推测为main函数 可见一些可疑的api FindResourceW推测该木马使用了资源加载 VirtualAlloc申请内存 然后sub_1400796E0 有 dwSize 参数 推测为 拷贝内存 memcpy类似函数 、 然后sub_140078CB0函数 跟进函…

HarmonyOS NEXT 应用开发实战(五、页面的生命周期及使用介绍)

HarmonyOS NEXT是华为推出的最新操作系统&#xff0c;arkUI是其提供的用户界面框架。arkUI的页面生命周期管理对于开发者来说非常重要&#xff0c;因为它涉及到页面的创建、显示、隐藏、销毁等各个阶段。以下是arkUI页面生命周期的介绍及使用举例。 页面的生命周期的作用 页面…

【正点原子K210连载】第四十六章 车牌识别实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第四十六章 车牌识别实验 在上一章节中&#xff0c;介绍了利用maix.KPU模块实现了通过提取图像中人脸的特征进行人脸识别&#xff0c;本章将继续介绍利用maix.KPU模块实现的车牌识别。通过本章的学习&#xff0c;读者将学习到车牌识别应用在CanMV上的实现。 本章分为如下几个小…

视觉识别技术:开启智能视觉新时代

引言 在数字化时代&#xff0c;信息的获取和处理变得前所未有的重要。视觉识别技术&#xff0c;作为人工智能领域的一个重要分支&#xff0c;正在逐渐改变我们与数字世界的互动方式。它通过模拟人类视觉系统&#xff0c;使计算机能够识别和理解图像和视频中的内容&#xff0c;…

Shell案例之一键部署mysql

1.问题 我认为啊学习就是一个思考的过程&#xff0c;思考问题的一个流程应该是&#xff1a;提出问题&#xff0c;分析问题&#xff0c;解决问题 在shell里部署mysql服务时&#xff0c;我出现一些问题&#xff1a; 1.安装mysql-server时&#xff0c;没有密钥&#xff0c;安装…

普通java web项目集成spring-session

之前的老项目&#xff0c;希望使用spring-session管理会话&#xff0c;存储到redis。 项目环境&#xff1a;eclipse、jdk8、jetty嵌入式启动、非spring项目。 实现思路&#xff1a; 1.添加相关依赖jar。 2.配置redis连接。 3.配置启动spring。 4.配置过滤器&#xff0c;拦…

L1练习-鸢尾花数据集处理(分类/聚类)

背景 前文&#xff08;《AI 自学 Lesson1 - Sklearn&#xff08;开源Python机器学习包&#xff09;》&#xff09;以鸢尾花数据集的处理为例&#xff0c;本文将完善其代码&#xff0c;在使用 sklearn 的部分工具包基础上&#xff0c;增加部分数据预处理、数据分析和数据可视化…

QUIC 协议的优势

QUIC 协议的优势包括&#xff1a; 快速建立连接&#xff1a;将传输层和加密层的握手合并&#xff0c;减少了连接建立的延迟。QUIC 建连时间大约为 0~1RTT&#xff0c;相比 HTTPS 的 3RTT 建连&#xff0c;具有极大的优势。客户端第一次建连的握手协商需 1RTT&#xff0c;而已建…

Linux 和Windows创建共享文件夹实现文件共享

直接开整 1.Windows下创建共享文件夹share右击-》属性—》共享-》选择所有人-》点击共享 2.共享创建完成后可以使他的共享网络地址或者Windows ip地址-推荐使用Windows ip地址有时候 不知道什么原因他Linux解析不了网络地址 共享网络地址 —共享文件夹share 右击-》属性—》共…

扫普通链接二维码打开小程序

1. 2.新增规则&#xff08;注意下载文件到跟目录下&#xff0c;需要建个文件夹放下载的校验文件&#xff09; 3.发布 ps&#xff1a;发布后&#xff0c;只能访问正式版本。体验版本如果加了 测试链接http://xxx/xsc/10 那么http://xxx/xsc/aa.....应该都能访问 例如aa101 aa…

CMOS晶体管的串联与并联

CMOS晶体管的串联与并联 前言 对于mos管的串联和并联&#xff0c;一直没有整明白&#xff0c;特别是设计到EDA软件中&#xff0c;关于MOS的M和F参数&#xff0c;就更困惑了&#xff0c;今天看了许多资料以及在EDA软件上验证了电路结构与版图的对应关系&#xff0c;总算有点收…

VScode中CMake无高亮(就是没有补全的提示)

在我学的过程中我发现我的CMake是这样的&#xff0c;如下图 但在教学视频里是这样的&#xff08;如下图&#xff09; 这非常的难受&#xff0c;所以疯狂的找&#xff0c;最后是CMake报错有 原因就是&#xff1a;本地没有配置环境变量&#xff0c;解决方法是下一个cmake然后直接…

STM32-CubeIDE用串口通讯

USART串口通讯 一、轮询模式 1.设置所接引脚为UART异步模式 选择完成CTRLS保存。 2.编写测试代码&#xff08;自动发送hello world&#xff09; 在mian函数里面编写代码 原函数 调用函数&#xff0c;需要数据类型一致&#xff0c;使用函数通过串口发送数组里面的数据 打开串…

延迟队列实现及其原理详解

1.绪论 本文主要讲解常见的几种延迟队列的实现方式&#xff0c;以及其原理。 2.延迟队列的使用场景 延迟队列主要用于解决每个被调度的任务开始执行的时间不一致的场景&#xff0c;主要包含如下场景: 1.比如订单超过15分钟后&#xff0c;关闭未关闭的订单。 2.比如用户可以…

基于springboot+微信小程序校园自助打印管理系统(打印1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于springboot微信小程序校园自助打印管理系统实现了管理员、店长和用户。管理员实现了用户管理、店长管理、打印店管理、打印服务管理、服务类型管理、预约打印管理和系统管理。店长实现…

vue3中报has no default export错误

原因 在同时使用Vetur和Volar插件的Vue2与Vue3项目中&#xff0c;遇到Module has no default export错误。通过在VSCode设置中将vetur.validation.script设为false&#xff0c;可以消除该报错&#xff0c;不影响实际运行。 解决办法 "vetur.validation.script": fa…

【Linux线程】Linux线程编程基础:概念、创建与管理

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux多线程 &#x1f4d2;1. 线程概念&#x1f4dc;2. 进程VS线程&#x1f4da;3. 线程控制…

算法魅力-双指针的实战

目录 1.双指针的介绍 1. 左右指针&#xff08;对撞指针&#xff09; 2. 快慢指针 2.题目练习讲解 2.1 移动零 算法思路 代码展示 画图效果效果 2.2 复写零 算法思路 代码展示 2.3 快乐数 算法思路 代码展示 2.4 盛最多水的容器 算法思路 代码展示 结束语 1.双指针的…

大模型带来新安全机遇

当前网络空间安全面临攻击隐蔽难发现、数据泄露风险高和违法信息审核难等挑战。大模型展现出强大的信息理解、知识抽取、意图和任务编排等能力&#xff0c;为网络空间安全瓶颈问题提供了新的解决思路和方法。与此同时&#xff0c;大模型发展也催生了恶意软件自动生成、深度伪造…