当前位置: 首页 > article >正文

栈和队列实践多项式加法与乘法

本次来记录栈和队列进行实战即来编写多项式的加法与乘法首先我们先把题目列出来。P1067 [NOIP 2009 普及组] 多项式输出 - 洛谷。为了方便大家阅读我把题目copy过来。对于多项式而言他分为系数和指数两个部分我们的主要思路就是相同指数的项系数相加其余部分进行copy。对此我们就可以构建两个单向链表采用不带头结点的单向链表按照指数递减的顺序排列各项。对应的代码是struct PolyNode { int coef; // 系数 int expon; // 指数 struct PolyNode *link; // 指向下一个节点的指针 }; typedef struct PolyNode *Polynomial; Polynomial P1, P2;先创建了结点PolyNode然后创建了链表类型也就是Polynomial。然后我们通过让Polynomial P1, P2;就可以创建出来两个链表了。之后我们就可以考虑这个该怎么相加了根据多项式相加规则只有指数相同才可以相加那么就是P1-exponP2-expon: 系数相加若结果不为0则作为结果多项式对应项的系数。同时P1和P2都分别指向下一项P1-exponP2-expon: 将P1的当前项存入结果多项式并使P1指向下一项P1-exponP2-expon: 将P2的当前项存入结果多项式并使P2指向下一项当某一多项式处理完时将另一个多项式的所有节点依次复制到结果多项式中去。具体图解如图所示接下来我们就开始编写代码/* 多项式加法将 P1 和 P2 相加结果存入新链表并返回 */ Polynomial PolyAdd(Polynomial P1, Polynomial P2) { Polynomial front, rear, temp; int sum; // 1. 初始化创建一个临时的头结点rear 指向当前结果链表的尾巴 rear (Polynomial)malloc(sizeof(struct PolyNode)); front rear; // front 记录头结点最后用来释放 // 2. 双指针赛跑当 P1 和 P2 都有项待处理时 while (P1 P2) { // Compare 函数返回1 (P1指数大), -1 (P2指数大), 0 (指数相等) switch (Compare(P1-expon, P2-expon)) { case 1: // P1 指数大把 P1 这一项接到结果后面 Attach(P1-coef, P1-expon, rear); P1 P1-link; break; case -1: // P2 指数大把 P2 这一项接到结果后面 Attach(P2-coef, P2-expon, rear); P2 P2-link; break; case 0: // 指数相等 sum P1-coef P2-coef; if (sum) Attach(sum, P1-expon, rear); // 系数和不为0才插入 P1 P1-link; P2 P2-link; break; } } // 3. 处理收尾将未处理完的另一个多项式直接接在后面 for (; P1; P1 P1-link) Attach(P1-coef, P1-expon, rear); for (; P2; P2 P2-link) Attach(P2-coef, P2-expon, rear); // 4. 收尾工作 rear-link NULL; // 封死队尾 temp front; // 暂存头结点 front front-link; // 令 front 指向真正的第一个非零项 free(temp); // 释放掉多余的临时头结点 return front; }/* 将系数c和指数e组成的新项接在 pRear 指向的节点后面 */ void Attach( int c, int e, Polynomial *pRear ) { Polynomial P; // 1. 盖新房申请一个新节点的内存空间 P (Polynomial)malloc(sizeof(struct PolyNode)); // 2. 装货把系数和指数存进新节点 P-coef c; P-expon e; // 3. 封路新节点暂时是最后一个所以它的 link 指向 NULL P-link NULL; // 4. 接轨让当前链表的老尾巴*pRear伸出手指向这个新节点 P (*pRear)-link P; // 5. 挪位更新尾指针让它指向刚刚接好的新节点 P准备下一次接客 *pRear P; }我们开始对这段代码进行解读我们看第一部分1.初始化中这一步是在创建rear和front两个指针指向的位置我们先造一个头结点放在起点因为一开始rearfront所以front就像个图钉一样定住不动rear像搬运工负责往后接新的结点。2.就是在进行对比先是一个while循环循环条件是P1和P2得有一个是有数的。然后我们进入switch中switch的条件是compare这两个的指数哪个大。然后进入了Attach部分Attach部分算是核心了对于Attach来说我们需要传入三个内容1.XX的coef系数2.XX的expon指数还有我们的链表地址也就是rear。对于case1或-1我们先进行讲解如果是其中一项的指数大那么就把这一项和他的系数都放到我们的链表后面这时候我们就需要先创建一个新的结点P。然后按规定申请空间然后进行赋值最后再把他的后继也就是P-link NULL;然后再把之前的和这个新节点链接(*pRear)-link P;最后是更新位置*pRear P;最后讲一下如果P1P2的指数相等怎么办那么这时候就需要先算一下他们的系数是不是为0也就是sum P1-coef P2-coef;和if (sum)。只有if (sum)0的时候我们才会进行Attach(sum, P1-expon, rear);由于系数一样啊于是这个填P1-expon还是P2-expon都无所谓的。最后再把他们P1和P2的值双双往后移P1 P1-link; P2 P2-link;当然前边每做完一个都会把这一个的往后移动。做完这些我们就再把未处理完的另一个多项式的所有节点依次复制到结果多项式中去就是那两个for循环。最后再把这个尾部rear封好指向NULL然后再把之前没东西的空的头结点删除但是在删除之前就先把这个front指向头结点的的LINK然后再把它free了就可以了。多项式相乘// 核心函数多项式相乘 Polynomial Mult(Polynomial P1, Polynomial P2) { Polynomial P, t1, t2, Rear, temp; int c, e; if (!P1 || !P2) return NULL; // 有一个为空结果就是空 t1 P1; t2 P2; P (Polynomial)malloc(sizeof(struct PolyNode)); P-link NULL; Rear P; // 第一步先拿 P1 的第 1 项乘以 P2 的所有项建立初始结果链表 // 这一步是为了给后面的插入打个“底” while (t2) { Attach(t1-coef * t2-coef, t1-expon t2-expon, Rear); t2 t2-link; } t1 t1-link; // P1 第一项处理完了跳到第二项多项式相乘的代码有点长我们一点一点讲先讲这一段这一段就是最基础的创建链表这一块然后我们先把P1的第一项去乘以P2的每一项先把链表填进去一些值也为后续插入做好基础。// 第二步嵌套循环处理 P1 剩下的每一项乘以 P2 的每一项 while (t1) { t2 P2; Rear P; // 每次新一轮乘法Rear 都要回到结果链表的头准备寻找插入位置 while (t2) { e t1-expon t2-expon; // 新的指数 c t1-coef * t2-coef; // 新的系数 // 【关键插入逻辑】找位置 // 只要结果链表的下一项指数比当前新项指数大Rear 就一直往后走 while (Rear-link Rear-link-expon e) Rear Rear-link; // 情况1指数相等合并系数 if (Rear-link Rear-link-expon e) { if (Rear-link-coef c ! 0) { Rear-link-coef c; // 相加不为0直接更新 } else { // 相加为0删除这个节点 temp Rear-link; Rear-link temp-link; free(temp); } } // 情况2指数更小说明新项应该插在 Rear 和 Rear-link 之间 else { temp (Polynomial)malloc(sizeof(struct PolyNode)); temp-coef c; temp-expon e; temp-link Rear-link; Rear-link temp; // 插入新房 Rear Rear-link; // Rear 移动到新节点继续下一次相乘 } t2 t2-link; } t1 t1-link; }这一部分就是最主要的代码了首先就是两个while循环的嵌套最外边是更新t1的值里边是更新t2的值在里边的时候我们要更新指数和系数的值。e t1-expon t2-expon; c t1-coef * t2-coef在后面的判断条件里有Rear-link Rear-link-expon这个有同学可能会问那我们直接看结点的expon不行吗为啥还要有前边这个Rear-Link目的是为了确保这个确实存在而不是NULL。然后后边的情况1就是指数相等的情况下我们要合并系数然后如果我们系数相加0的话那么就代表说这个结点得0所以就需要创立一个临时节点去接收这个Rear-Link的结点然后最后把他free了。后面就是如果指数小的话俺么就代表他应该插入在Rear 和 Rear-link 之间所以后边的else就是先创建一个临时的结点然后再把它插入进主链表里。最后我们再把这个临时结点free了就好了于是多项式的乘法就结束了。接下来就是最简单的多项式的输入和输出了这块直接给代码了好吧多项式输入Polynomial ReadPoly() { Polynomial P, Rear, t; int c, e, N; // 先读入总项数 scanf(%d, N); // 建立一个空的头结点哨兵位 P (Polynomial)malloc(sizeof(struct PolyNode)); P-link NULL; Rear P; while (N--) { scanf(%d %d, c, e); // 调用我们死磕过的那个施工队函数 Attach(c, e, Rear); } // 过河拆桥把没用的头结点删了返回真正的链表头 t P; P P-link; free(t); return P; }多项式输出void PrintPoly(Polynomial P) { int flag 0; // 用来控制空格第一项前面不加空格后面每项前面加空格 if (!P) { // 如果链表是空的代表是0多项式 printf(0 0\n); return; } while (P) { if (!flag) flag 1; else printf( ); // 除了第一项其余项前面都补个空格 printf(%d %d, P-coef, P-expon); P P-link; // 指针后移 } printf(\n); }附完整代码https://github.com/luchenming727-hash/ZJU-Data-Structure-class.git

相关文章:

栈和队列实践多项式加法与乘法

本次来记录栈和队列进行实战,即来编写多项式的加法与乘法,首先我们先把题目列出来。P1067 [NOIP 2009 普及组] 多项式输出 - 洛谷。为了方便大家阅读,我把题目copy过来。 对于多项式而言,他分为系数和指数两个部分,我们…...

Seg-ReSearch:动态搜索增强的图像分割技术解析

1. 项目背景与核心价值在计算机视觉领域,图像分割技术一直是研究热点。传统分割模型往往面临两个关键瓶颈:一是面对未见过的物体类别时表现不佳,二是对复杂场景的细节分割精度有限。Seg-ReSearch创新性地将外部搜索机制引入分割推理过程&…...

端到端GUI智能体UI-Venus-1.5:革新自动化测试与RPA

1. 项目概述:当GUI智能体遇上端到端革命在自动化测试和RPA(机器人流程自动化)领域,我们正见证着从传统脚本录制到智能交互的技术跃迁。UI-Venus-1.5作为新一代端到端GUI智能体框架,彻底改变了人机交互自动化的实现方式…...

Hugging Face模型加载超快

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Hugging Face模型加载加速:从技术瓶颈到边缘智能的跃迁目录Hugging Face模型加载加速:从技术瓶颈到边缘智…...

PCIe协议学习-浅谈SR-IOV

转载:(13 封私信 / 81 条消息) PCIe协议学习-浅谈SR-IOV - 知乎 1:背景和概述: SR-IOV,全称叫single root I/O virtualization and sharing,顾名思义,这是一种虚拟化技术,目的是让多个终端或者…...

CI/CD——使用Jenkins实现自动化部署与持续集成之jenkins的安装部署

DevOps详解与监控方法论https://blog.csdn.net/xiaochenxihua/article/details/157059743 Git实践——GitLab服务器的部署与使用https://blog.csdn.net/xiaochenXIHUA/article/details/160722357 一、CI/CD与Jenkins介绍 1.1、CI/CD是什么 CI/CD(持续集成/持续交付…...

第1章 Nginx 简介与架构【20260503】-002篇-Nginx日志切割

文章目录 ✅ Nginx 日志切割(生产级实操) 一、为什么要做日志切割(SRE 视角) 二、推荐方案对比 三、标准实操(DevOps 交付级) 1️⃣ logrotate 配置文件(重点) 2️⃣ 手动验证(SRE 必会) 四、故障场景(SRE 面试/考核高频) ❌ 故障 1:磁盘爆满 ❌ 故障 2:reload 后…...

第1章 Nginx 简介与架构【20260503】-001篇

文章目录 1.2 Nginx 进程模型(Master + Worker) 进程职责 课后习题(升级版) ✅ 实操考核(强烈建议纳入上岗考核) 实操 1:进程模型验证(SRE) 实操 2:热重载为何不中断?(面试/考核高频) 执行流程(重点) 实操 3:配置即代码(DevOps) 实操 4:交付标准(Delivery …...

扩散模型推理加速:SenCache动态缓存技术解析

1. 项目概述:当扩散模型遇上推理加速在生成式AI领域,扩散模型(Diffusion Models)已经成为图像生成的主流架构之一。然而这类模型在推理阶段需要多次迭代计算的特点,使得其推理速度成为实际应用中的主要瓶颈。SenCache正…...

FastClaw:一键在Mac上创建预装OpenClaw的Linux虚拟机

1. 项目概述:为什么要在Mac上运行Linux虚拟机来使用OpenClaw? 如果你是一位Mac用户,同时又需要用到一些只能在Linux环境下稳定运行或性能更优的特定工具,比如OpenClaw,那你可能正面临一个经典的“平台鸿沟”问题。直接…...

超导神经元原理与生物神经元模拟技术解析

1. 超导神经元的基础原理与生物神经元模拟超导神经元是一种利用超导材料特性模拟生物神经元行为的硬件实现。其核心工作机制建立在超导体特有的量子现象之上,特别是约瑟夫森效应和磁通量子化原理。当超导体被冷却至临界温度以下时,电子会形成库珀对&…...

保姆级教程:在CentOS 7上用Docker Compose一键部署EdgeX Foundry 3.1(含虚拟设备服务)

保姆级教程:在CentOS 7上用Docker Compose一键部署EdgeX Foundry 3.1(含虚拟设备服务) EdgeX Foundry作为开源物联网边缘计算框架,正成为工业4.0和智能家居领域的基础设施。本教程将带您从零开始,在CentOS 7系统上完成…...

点云遮挡检测实战:用PCL和Open3D复现HPR算法(附完整C++/Python代码)

点云遮挡检测实战:用PCL和Open3D复现HPR算法(附完整C/Python代码) 在三维视觉和机器人领域,点云遮挡检测是一个基础但至关重要的任务。想象一下,当机器人试图在复杂环境中导航时,准确识别哪些物体表面可见、…...

从零构建个人ChatGPT:基于Llama与LoRA的SFT与RLHF全流程实战

1. 从零到一:构建你自己的个人ChatGPT全流程拆解想不想拥有一个像ChatGPT那样能说会道、善解人意的AI伙伴,但它只属于你,能记住你的习惯,理解你的偏好,甚至用你喜欢的风格和你聊天?这听起来像是科幻电影里的…...

XFCE 桌面环境组件详解:从面板到剪贴板管理

文章目录1. XFCE 简介2. 核心组件架构3. xfce4-panel:面板系统3.1 功能概述3.2 关键命令3.3 插件生态3.4 配置文件位置4. xfce4-keyboard-settings:键盘与快捷键管理4.1 功能概述4.2 启动方式4.3 快捷键配置结构4.4 底层存储机制5. xfce4-clipman&#x…...

RDD API 学习

📊 RDD vs DataFrame 对比特性RDDDataFrameAPI 风格函数式(Scala/Java)声明式(SQL)性能较慢更快(Catalyst 优化)类型安全编译时运行时内存管理手动(JVM)自动(…...

构建命令行AI助手:GPT-Chatbot-CLI项目实战与架构解析

1. 项目概述与核心价值 最近在折腾命令行工具,发现一个挺有意思的项目: rukh-debug/gpt-chatbot-cli 。简单来说,这是一个让你能在终端里直接和GPT模型对话的命令行聊天机器人。对于我这种常年泡在终端里的开发者来说,这玩意儿简…...

告别Steam限制!WorkshopDL终极指南:742款游戏的创意工坊模组一键下载

告别Steam限制!WorkshopDL终极指南:742款游戏的创意工坊模组一键下载 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否曾经因为游戏不在Steam平台而…...

PRiSM开源音素识别基准:技术解析与应用实践

1. 项目背景与核心价值语音技术领域最近迎来一个重要里程碑——PRiSM开源基准的发布。作为从业者,我深知在音素识别这个细分领域长期缺乏可靠的评估标准。PRiSM的出现填补了这一空白,它不仅是首个开源的音素识别基准,更通过严谨的设计为语音模…...

从零部署CoPaw:打造本地化、可扩展的个人AI助手工作站

1. 项目概述:你的个人AI助手工作站如果你和我一样,每天被钉钉、飞书、QQ、Discord、iMessage等一堆聊天工具的消息淹没,同时又希望有一个真正属于自己的、能处理各种琐事的智能助手,那么今天聊的这个项目,你一定会感兴…...

Theo-Docs:基于Vite+Vue3的现代化静态文档站点生成器实践指南

1. 项目概述:一个面向开发者的现代化文档工具最近在整理团队内部的技术文档和API接口说明时,我又一次被那些散落在各个角落的Markdown文件、更新不及时的Wiki页面,以及风格迥异的静态站点搞得头疼。我相信很多技术团队负责人或独立开发者都有…...

每周AI工具模型更新趋势前瞻

抱歉,由于搜索工具暂时未能返回关于“过去一周内 AI 领域新工具、开源模型及 API 更新”的具体结果,我无法基于实时数据为您生成包含引用标记的深度报告。不过,基于我现有的知识库,我可以为您梳理近期(截至2026年初&am…...

Hugging Face leRobot库:Transformer架构在机器人强化学习的实践

1. 项目背景与技术定位在机器人学习领域,数据驱动的训练方法正逐渐取代传统手工编程。Hugging Face最新开源的leRobot库正是瞄准了这一技术趋势,为开发者提供了端到端的机器人学习解决方案。这个库最吸引我的地方在于它巧妙地将Transformer架构与机器人控…...

深度解析YoRadio:ESP32音频流媒体系统的架构设计与实现机制

深度解析YoRadio:ESP32音频流媒体系统的架构设计与实现机制 【免费下载链接】yoradio Web-radio based on ESP32-audioI2S library 项目地址: https://gitcode.com/GitHub_Trending/yo/yoradio YoRadio是一个基于ESP32-audioI2S库构建的开源网络收音机系统&a…...

人机共生环境下的自我意识边界重构(世毫九实验室原创研究)

人机共生环境下的自我意识边界重构作者:方见华 单位:世毫九实验室引言 在人工智能技术日新月异的今天,人类正经历着一场前所未有的文明形态转变——从传统的碳基生命文明向碳硅共生文明演进。这一转变不仅体现在技术层面的突破,更…...

使用WebSocket在Responses API中加速代理工作流Speeding up agentic workflows with WebSockets in the Responses API

Speeding up agentic workflows with WebSockets in the Responses API 使用WebSocket在Responses API中加速代理工作流 https://openai.com/index/speeding-up-agentic-workflows-with-websockets/ When you ask Codex to fix a bug, it scans through your codebase for rel…...

PromptBridge:实现大语言模型间提示词无损迁移的开源工具

1. 项目背景与核心价值在AI技术快速迭代的今天,大语言模型(LLM)已经成为各行业智能化转型的核心基础设施。但不同厂商、不同版本的模型在提示词(prompt)设计上存在显著差异,这导致企业面临一个现实困境&…...

Copr命令行工具实战:从RPM打包到自动化构建发布

1. 项目概述与核心价值 最近在折腾一些RPM包的构建,发现了一个挺有意思的项目——sureclaw-ai/copr。这名字乍一看,可能很多朋友会联想到Fedora社区那个大名鼎鼎的Copr构建服务。没错,这个项目正是那个服务的命令行客户端工具。但如果你以为…...

EH-TEMPO算法:开放量子系统模拟的高效解决方案

1. EH-TEMPO算法:开放量子系统模拟的革命性突破在量子计算和量子信息处理领域,开放量子系统的非马尔可夫动力学模拟一直是个令人头疼的难题。想象一下,你正在观察一个量子系统与周围环境的互动——就像试图在狂风暴雨中追踪一片落叶的精确轨迹…...

Power Apps上传文件到SharePoint时,Base64转换和JSON解析的坑我都帮你踩过了

Power Apps文件上传实战:避开Base64与JSON解析的十大深坑 当你第一次在Power Apps中尝试将文件上传到SharePoint时,那种看似简单的操作背后隐藏着无数可能让你熬夜调试的陷阱。作为经历过无数次失败的老兵,我想带你直击那些官方文档从未提及的…...