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

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

4af0979a94ad4d9ca1ffde8cf298935d.png

其中Ai​为实数,i为不小于0的整数。在完成“一元n次多项式输入输出”题目的基础上实现一元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位数,一元多项式为f(X)=0时,输出为f(X)=0.0。对上面2个一元n次多项式的输出为:

输出样例:

f(X)=3.0X^2+X+1.0
g(X)=-2.0X^2-X-1.0
f(X)+g(X)=X^2
#include <stdio.h>
#include <stdlib.h>typedef struct PolynomialNode    //定义了一个名为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;        //或者链表为空,则将新项置于链表头部} else {                           //否则,遍历链表找到合适的位置插入新项PolynomialNode* current = *head;while (current->next!= NULL && current->next->exponent > exponent) {              //当前节点的下指针不为空&&当前节点的下指针的指数>当前节点的current = current->next;  //refresh当前与下一个}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;int firstTerm = 1;printf("%s=", name);while (current!= NULL) {if (current->coefficient == 0) //系数为0{current = current->next;   //跳过当前项continue;}if (current->coefficient < 0)  //系数小于0{if (!firstTerm)            //不是第一项{if (current->exponent == 1) {printf("-X");} else if (current->exponent > 1) {if (current->coefficient == -1.0)  //特殊判断{printf("-X^%d", current->exponent);} else {printf("%.1fX^%d", current->coefficient, current->exponent);}} else         //是第一项{printf("%.1f", current->coefficient);}} else {if (current->exponent == 1) {printf("-X");} else if (current->exponent > 1) {if (current->coefficient == -1.0) {printf("-X^%d", current->exponent);} else {printf("%.1fX^%d", current->coefficient, current->exponent);}} else {printf("%.1f", current->coefficient);}firstTerm = 0;}} else         //系数大于0{if (!firstTerm) {if (current->exponent == 1) {printf("+X");} else if (current->exponent > 1) {if (current->coefficient == 1.0) {printf("+X^%d", current->exponent);} else {printf("+%.1fX^%d", current->coefficient, current->exponent);}} else {printf("+%.1f", current->coefficient);}} else {if (current->exponent == 1) {printf("X");} else if (current->exponent > 1) {if (current->coefficient == 1.0) {printf("X^%d", current->exponent);} else {printf("%.1fX^%d", current->coefficient, current->exponent);}} else {printf("%.1f", current->coefficient);}firstTerm = 0;}}current = current->next;}printf("\n");
}void freePolynomial(PolynomialNode* head) 
{PolynomialNode* current = head;while (current!= NULL) {PolynomialNode* next = current->next;free(current);current = next;}
}PolynomialNode* addPolynomials(PolynomialNode* poly1, PolynomialNode* poly2) 
{PolynomialNode* result = NULL;PolynomialNode* current1 = poly1;PolynomialNode* current2 = poly2;while (current1!= NULL || current2!= NULL) {             //循环会一直执行,直到两个输入链表都遍历完double coefficient;int exponent;if (current1 == NULL)      //第一个多项式链表已经遍历完{                         //从第二个多项式链表current2中取当前项的系数和指数coefficient = current2->coefficient;exponent = current2->exponent;current2 = current2->next;} else if (current2 == NULL) //第二个多项式链表已经遍历完{                         //从第一个多项式链表current1中取当前项的系数和指数coefficient = current1->coefficient;exponent = current1->exponent;current1 = current1->next;} else if (current1->exponent > current2->exponent) //第一个多项式链表中的项指数较大{                                                //取第一个多项式链表当前项的系数和指数coefficient = current1->coefficient;exponent = current1->exponent;current1 = current1->next;} else if (current1->exponent < current2->exponent) //第二个多项式链表中的项指数较大{                                                //取第二个多项式链表当前项的系数和指数coefficient = current2->coefficient;exponent = current2->exponent;current2 = current2->next;} else                         //两个多项式链表当前项的指数相同,将它们的系数相加作为新的系数{coefficient = current1->coefficient + current2->coefficient;exponent = current1->exponent;current1 = current1->next;current2 = current2->next;}if (coefficient!= 0) {insertNode(&result, coefficient, exponent);}}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 (coefficient == 0 && exponent == 0) {break;}insertNode(&poly1, coefficient, exponent);}while (scanf("%lf,%d", &coefficient, &exponent) && coefficient!= 0 || exponent!= 0) {if (coefficient == 0 && exponent == 0) {break;}insertNode(&poly2, coefficient, exponent);}// 合并多项式 poly2 中的同类项PolynomialNode* tempPoly2 = poly2;while (tempPoly2!= NULL && tempPoly2->next!= NULL) {if (tempPoly2->exponent == tempPoly2->next->exponent || (tempPoly2->exponent == 1 && tempPoly2->next->exponent == 1)) {tempPoly2->coefficient += tempPoly2->next->coefficient;PolynomialNode* toFree = tempPoly2->next;tempPoly2->next = tempPoly2->next->next;free(toFree);} else {tempPoly2 = tempPoly2->next;}}printPolynomial(poly1, "f(X)");printPolynomial(poly2, "g(X)");PolynomialNode* sum = addPolynomials(poly1, poly2);printf("f(X)+g(X)");if (sum == NULL) {printf("0.0\n");} else {printPolynomial(sum, "");}freePolynomial(poly1);freePolynomial(poly2);freePolynomial(sum);return 0;
}

 

 

 

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

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

相关文章

80.【C语言】数据结构之时间复杂度

目录 1.数据结构的定义 2.算法的定义 3.算法的效率 1.衡量一个算法的好坏的方法 例题:计算以下代码的循环次数 2.大O的渐进表示法 练习1:求下列代码的时间复杂度 练习2:求下列代码的时间复杂度 练习3:求下列代码的时间复杂度 练习4:求下列代码的时间复杂度 4.总结:计…

Leetcode—1115. 交替打印 FooBar【中等】(多线程)

2024每日刷题&#xff08;180&#xff09; Leetcode—1115. 交替打印 FooBar C实现代码 class FooBar { private:int n;sem_t fooSem;sem_t barSem;public:FooBar(int n) {this->n n;sem_init(&fooSem, 0, 1);sem_init(&barSem, 0, 0);}~FooBar() {sem_destroy(&…

mac安装brew时踩坑解决方案

安装包 mac上如果按照git等工具可能会使用brew&#xff0c;例如使用&#xff1a;$ brew install git命令&#xff0c;如果电脑没有按照brew&#xff0c;则会提示&#xff1a;zsh: command not found: brew 解决方案 需要我们打开brew的官网https://brew.sh/&#xff0c;复制…

机器学习|Pytorch实现天气预测

机器学习|Pytorch实现天气预测 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 电脑系统&#xff1a;Windows11 显卡型号&#xff1a;NVIDIA Quadro P620 语言环境&#xff1a;python 3.9.7 编译器&#x…

得物App3D创新应用引关注,世界设计之都大会启幕

近日&#xff0c;2024世界设计之都大会&#xff08;WDCC&#xff09;在上海盛大启幕。此次大会以“设计无界 新质生长”为主题&#xff0c;汇聚了全球设计领域的精英与前沿成果&#xff0c;展现了设计作为新质生产力的巨大潜力。主场展览占据了整整3个楼面&#xff0c;总面积达…

进程间关系与守护进程

一、进程组 1.1、什么是进程组 提到进程的概念&#xff0c; 其实每一个进程除了有一个进程 ID(PID)之外 还属于一 个进程组。进程组是一个或者多个进程的集合&#xff0c; 一个进程组可以包含多个进程。 每一 个进程组也有一个唯一的进程组 ID(PGID)&#xff0c; 并且这个 PG…

SCI英文文献阅读工具【全文翻译】【逐句翻译】

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 SCI英文文献阅读工具【全文翻译】【逐句翻译】 1. 全文翻译【DeepL】 适用于泛读网址&#xff1a;https://www.deepl.com/zh/translator/files 1.1 前提 文档大小&#xff1a;pdf文档不超过5M&#xff08;可先…

设计模式05-创建型模式(建造者/原型/单例模式/Java)

3.4 建造者模式 3.4.1 建造者模式的定义 动机&#xff1a;方便创建复杂对象&#xff08;一个对象中包含多个成员变量&#xff09; 定义&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂…

计算机视觉中的最小二乘法:寻找完美交点和直线拟合

Hello&#xff0c;小伙伴们&#xff01;今天我们要聊的是计算机视觉中的一个小技巧——使用最小二乘法来进行交点计算和直线拟合。你有没有想过&#xff0c;如何从一堆杂乱无章的数据点中找到那条最佳拟合直线&#xff1f;或者&#xff0c;如何确定几条直线相交的确切位置&…

OpenCV物体跟踪:使用CSRT算法实现实时跟踪

目录 简介 CSRT算法简介 实现步骤 1. 初始化摄像头和跟踪器 2. 读取视频帧和初始化跟踪 3. 实时跟踪和显示结果 4. 显示和退出 5、结果展示 总结 简介 在计算机视觉和视频处理领域&#xff0c;物体跟踪是一项核心技术&#xff0c;它在监控、人机交互、运动分析等方面…

CSS布局/简单应用

思考下面四个图片如何布局 test1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

双十一有啥好用的物品可以推荐购买?2024不可错过的必囤好物清单!

双十一购物狂欢节即将拉开帷幕&#xff0c;许多朋友们可能还在犹豫不决&#xff0c;不知道应该选购哪些商品。别担心&#xff0c;今天我特意为大家精心准备了一份包含五款必囤好物的清单&#xff0c;希望能够帮助大家在双十一期间抢购到心仪的商品&#xff0c;享受购物的乐趣&a…

《米小圈动画成语》|在趣味中学习,在快乐中掌握成语知识!

作为一名家长&#xff0c;我一直希望孩子能够在学习的过程中既感受到乐趣&#xff0c;又能获得真正的知识。成语作为中华文化的精华&#xff0c;虽然意义深远、简洁凝练&#xff0c;但对于一个小学生来说&#xff0c;学习和理解这些言简意赅的成语无疑是一个挑战。尤其是有些成…

将本地文件上传到GIT上

上传文件时&#xff0c;先新建一个空文件&#xff0c;进行本地库初始化&#xff0c;再进行远程库克隆&#xff0c;将要上传的文件放到克隆下来的文件夹里边&#xff0c;再进行后续操作 1.在本地创建文件夹&#xff0c;将要上传的文件放在该文件下 2.在该文件页面中打开Git Bas…

ai字幕用什么软件制作?6款视频加字幕工具分享!

在视频制作和后期处理中&#xff0c;字幕的添加是一个重要的环节。随着AI技术的发展&#xff0c;越来越多的软件开始支持AI自动加字幕功能&#xff0c;使得字幕的制作变得更加简单和高效。本文将为大家介绍几款常用的AI字幕制作软件&#xff0c;并详细讲解如何使用AI自动加字幕…

TDD(测试驱动开发)是否已死?

Rails 大神、创始人 David Heinemeier Hansson 曾发文抨击TDD。 TDD is dead. Long live testing. (DHH) 此后, Kent Beck、Martin Fowler、David Hansson 三人就这个观点还举行了系列对话&#xff08;辩论&#xff09; Is TDD Dead? 笔者作为一个多年在软件测试领域摸索的人&…

Linux——动态卷的管理

确保已经设置了对应的动态卷的驱动&#xff08;provisioner 制备器&#xff09;基于动态驱动创建对应的存储类创建PVC &#xff08;PVC 将会自动根据大小、访问模式等创建PV&#xff09;Pod的spec 中通过volumes 和 volumemounts 来完成pvc 的绑定和pvc对应pv的挂载删除pod 不…

Java基于微信小程序的公考学习平台的设计与实现,附源码+文档

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

新魔百和cm311-5 ZG 4+16g 卡刷语音固件教程

新魔百和cm311-5_国科6323_蓝牙版刷 准备工具&#xff1a;U盘、短接工具、 固件包&#xff1a;CM311-5-zg链接 https://pan.baidu.com/s/1f5NxmCGCO0F84RQRBrSMRg 提取码: b7f1 操作步骤&#xff1a; 1、用不大于8G U盘&#xff0c;先做FAT32&#xff0c;2048块单分区格式化后…

Yoga Pro 13s 2021款Intel处理器ITL版(82HJ)原厂Win10系统镜像下载

lenovo联想Yoga-PRO-13S笔记本电脑恢复开箱状态预装OEM系统Windows10安装包 链接&#xff1a;https://pan.baidu.com/s/1YjGCXe_Zxkwcgum3TWZx5g?pwdshqu 提取码&#xff1a;shqu 联想原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、O…