数据结构之多项式相加的链表实现

ops/2025/4/1 15:51:46/

在计算机科学中,多项式的表示和运算经常会用到。使用链表来表示多项式是一种常见且有效的方法,它可以方便地处理多项式的各项,并且在进行多项式相加等运算时具有较好的灵活性。

多项式通常由一系列的项组成,每一项包含一个系数和一个指数。在链表中,我们可以将每一项表示为一个节点,节点包含系数、指数和指向下一个节点的指针。通过这种方式,我们可以将多项式的各项连接起来,形成一个链表。 

代码实现:

#include <stdio.h>
#include <stdlib.h>// 定义多项式节点结构体
typedef struct node {float coef;  // 系数int expn;    // 指数struct node *next;  // 指向下一个节点的指针
} node, *polynomial;// 创建多项式链表,按照指数升序插入节点
polynomial createPolyn(int n) {polynomial L = (polynomial)malloc(sizeof(node));  // 分配头节点内存if (L == NULL) {fprintf(stderr, "内存分配失败\n");  // 检查内存分配是否成功exit(EXIT_FAILURE);}L->next = NULL;  // 初始化头节点的 next 指针为 NULLnode *p = L;  // 用于遍历链表的指针printf("\n请输入多项式的系数和指数(格式:系数,指数):\n");for (int i = 1; i <= n; i++) {node *s = (node *)malloc(sizeof(node));  // 为新节点分配内存if (s == NULL) {fprintf(stderr, "内存分配失败\n");  // 检查内存分配是否成功exit(EXIT_FAILURE);}if (scanf("%f,%d", &s->coef, &s->expn) != 2) {  // 读取用户输入fprintf(stderr, "输入格式错误,请输入正确的格式(系数,指数)\n");exit(EXIT_FAILURE);}node *pre = p;  // 用于记录当前节点的前一个节点node *q = pre->next;  // 用于遍历链表的指针// 找到合适的插入位置,保证链表按指数升序排列while (q && q->expn < s->expn) {pre = q;q = q->next;}s->next = q;  // 插入新节点pre->next = s;}return L;
}// 多项式相加函数
void addPolyn(polynomial L1, polynomial L2) {node *p1 = L1->next;  // 指向第一个多项式的第一个节点node *p2 = L2->next;  // 指向第二个多项式的第一个节点node *p3 = L1;  // 用于构建结果多项式的指针float sum;while (p1 && p2) {if (p1->expn == p2->expn) {sum = p1->coef + p2->coef;  // 系数相加if (sum != 0) {p1->coef = sum;  // 更新系数p3->next = p1;p3 = p1;p1 = p1->next;node *r = p2;p2 = p2->next;free(r);  // 释放 p2 节点的内存} else {node *r = p1;p1 = p1->next;free(r);  // 释放 p1 节点的内存r = p2;p2 = p2->next;free(r);  // 释放 p2 节点的内存}} else if (p1->expn < p2->expn) {p3->next = p1;p3 = p1;p1 = p1->next;} else {p3->next = p2;p3 = p2;p2 = p2->next;}}p3->next = p1 ? p1 : p2;  // 连接剩余的节点// 释放 L2 的头节点free(L2);node *p4 = L1->next;printf("\n两多项式之和: ");while (p4) {printf("%.2f,%d  ", p4->coef, p4->expn);p4 = p4->next;}printf("\n");
}int main() {int n1, n2;printf("请输入第一个多项式的项数: ");scanf("%d", &n1);polynomial L1 = createPolyn(n1);  // 创建第一个多项式printf("请输入第二个多项式的项数: ");scanf("%d", &n2);polynomial L2 = createPolyn(n2);  // 创建第二个多项式addPolyn(L1, L2);  // 多项式相加// 释放 L1 的头节点free(L1);return 0;
}

代码结构分析:

1、结构体定义了多项式节点的基本结构,包含系数、指数和指向下一个节点的指针。使用 typedef 关键字可以方便地定义指向节点的指针类型 polynomial。

2、在创建多项式链表时,我们首先分配一个头节点,并将其 next 指针初始化为 NULL。然后,通过循环读取用户输入的系数和指数,为每一项创建一个新节点,并将其插入到链表中合适的位置,保证链表按指数升序排列。在插入节点时,我们使用两个指针 pre 和 q 来找到合适的插入位置。

3、在多项式相加的过程中,我们使用三个指针 p1、p2 和 p3 分别指向第一个多项式、第二个多项式和结果多项式。通过比较 p1 和 p2 所指向节点的指数,我们可以将它们合并到结果多项式中。如果指数相等,则将系数相加;如果相加结果不为零,则更新系数;如果相加结果为零,则删除这两个节点。最后,将剩余的节点连接到结果多项式中,并释放 L2 的头节点。

4、主函数中,我们首先读取用户输入的两个多项式的项数,然后分别创建这两个多项式。接着调用 addPolyn 函数进行多项式相加,并输出结果。最后,释放 L1 的头节点,避免内存泄漏。

总结:通过使用链表来表示多项式,并实现多项式相加的功能,我们可以更好地理解链表的操作和应用。

 运行:

 


http://www.ppmy.cn/ops/170983.html

相关文章

复现文献中的三维重建图像生成,包括训练、推理和可视化

要复现《One - 2 - 3 - 45 Fast Single Image to 3D Objects with Consistent Multi - View Generation and 3D Diffusion (CVPR)2024》文献中的三维重建图像生成&#xff0c;包括训练、推理和可视化&#xff0c;并且确保代码能正常运行&#xff0c;下面是基本的实现步骤和示例…

协作机械臂需要加安全墙吗? 安全墙 光栅 干涉区

安全墙是什么 文章目录 安全墙是什么简介1. 物理安全墙1.1 定义&#xff1a;1.2 作用机制&#xff1a;1.3 应用场景&#xff1a; 2. 虚拟安全墙2.2 定义&#xff1a;2.3 作用机制&#xff1a;2.3 应用场景&#xff1a; 3. 安全毛毯3.1 工作原理&#xff1a;3.2 特点3.3 应用场景…

26考研——查找_树形查找_二叉排序树(BST)(7)

408答疑 文章目录 三、树形查找二叉排序树&#xff08;BST&#xff09;二叉排序树中结点值之间的关系二叉树形查找二叉排序树的查找过程示例 向二叉排序树中插入结点插入过程示例 构造二叉排序树的过程构造示例 二叉排序树中删除结点的操作情况一&#xff1a;被删除结点是叶结点…

Java 开发中的 AI 黑科技:如何用 AI 工具自动生成 Spring Boot 项目脚手架?

在 Java 开发领域&#xff0c;搭建 Spring Boot 项目脚手架是一项耗时且繁琐的工作。传统方式下&#xff0c;开发者需要手动配置各种依赖、编写基础代码&#xff0c;过程中稍有疏忽就可能导致配置错误&#xff0c;影响开发进度。如今&#xff0c;随着 AI 技术的迅猛发展&#x…

map3 base64格式解析+保存

转码 首先需要引入依赖 <!-- base64 mp3 识别 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.5</version></dependency>相关代码 import com.race…

MySQL数据库和表的操作之SQL语句

MySQL数据库和表的操作 关系型数据库&#xff0c;都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL&#xff1a;结构化查询语言(Structured Query Language)&#xff0c;在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。使用SQL语句&#xff…

网络安全 - SQL Injection

1.1.1 摘要 日前&#xff0c;国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布&#xff0c;600万用户的登录名及密码被公开泄露&#xff0c;随后又有多家网站的用户密码被流传于网络&#xff0c;连日来引发众多网民对自己账号、密码等互联网信息被盗取的普遍担忧。 网络…

【大前端系列02】HTML5 Canvas绘图技术全解析:从入门到精通

HTML5 Canvas绘图技术全解析 系列: 「全栈进化&#xff1a;大前端开发完全指南」系列第2篇&#xff08;共5篇&#xff09; 核心: Canvas绘图技术的基本原理与高级应用技巧 &#x1f4cc; 引言 Canvas是HTML5引入的绘图API&#xff0c;提供可编程的矩形绘图区域&#xff0c;使用…