多项式加法(用 C 语言实现)

news2025/1/10 16:39:56

目录

一、多项式的初始化

二、多项式的创建

三、多项式的加法

四、多项式的输出

五、清除链表

六、主函数



用链表实现多项式时,每个链表节点存储多项式中的一个非零项,包括系数(coef指数(exp)两个数据域以及一个指针域(next。对应的数据结构定义为:

typedef struct Node
{
    int coef;  // 系数
    int exp;  // 指数
    struct Node* next;
}Node, *Link;

一个多项式可以表示成由这些节点链接起来的单链表。

一、多项式的初始化

单向非循环链表可以分为以下两种:

  1. 不设头结点的单向非循环链表

  2. 设头结点的单向非循环链表

本次程序采用第二种

void InitPoyln(Link* phead)
{
    assert(phead);  // phead 是指向头指针的指针,是一个二级指针
    *phead = (Node*)malloc(sizeof(Node));  // 生成新节点作为头节点
    if (NULL == *phead)
    {
        perror("initialization failed!");
        exit(-1);
    }
    (*phead)->next = NULL;  // 将头节点的指针域置为空
}

二、多项式的创建

多项式链表是一个有序表 (P_n, P_{n-1}, ..., P_1, P_0) ​,每项的位置都要经过比较才能确定。

void CreatePoyln(Link head, int n)
{
	assert(head);  // 头指针指向头节点
	for (int i = 0; i < n; ++i)
	{
		// 生成新节点
		Node* newnode = (Node*)malloc(sizeof(Node));  
		assert(newnode);
		scanf("%d %d", &newnode->coef, &newnode->exp);
		if (newnode->coef == 0)  // 只保存系数不为 0 的项
		{
			free(newnode);
			continue;
		}
		newnode->next = NULL;
		// 插入
		Node* prev = head;
		Node* cur = head->next;
		while (cur != NULL)
		{
			if (cur->exp == newnode->exp)
			{
				// 合并 cur 和 newnode
				int sum = cur->coef + newnode->coef;
				if (sum != 0)
				{
					cur->coef = sum;
					free(newnode);
				}
				else
				{
					prev = cur->next;
					Node* tmp = cur;
					cur = cur->next;
					free(tmp);
					free(newnode);
				}
				break;
			}
			else if (cur->exp > newnode->exp)
			{
				prev = cur;
				cur = cur->next;
			}
			else  // cur->exp < newnode->exp
			{
				// 将 newnode 插入到 prev 和 cur 之间
				prev->next = newnode;
				newnode->next = cur;
				break;
			}
		}
		if (cur == NULL)
		{
			prev->next = newnode;
		}
	}
}

三、多项式的加法

void AddPolyn(Link headA, Link headB)
{
	assert(headA != NULL && headB != NULL);
	Node* tail = headA;
	Node* curA = headA->next;
	Node* curB = headB->next;
	while (curA && curB)
	{
		if (curA->exp == curB->exp)
		{
			int sum = curA->coef + curB->coef;
			if (sum != 0)
			{
				curA->coef = sum;
				tail->next = curA;
				tail = curA;
				curA = curA->next;
                
				Node* tmp = curB;
				curB = curB->next;
				free(tmp);
			}
			else
			{
				Node* tmp = curA;
				curA = curA->next;
				free(tmp);
				tmp = curB;
				curB = curB->next;
				free(tmp);
			}
		}
		else if (curA->exp > curB->exp)
		{
			tail->next = curA;
			tail = curA;
			curA = curA->next;
		}
		else  // curA->exp < curB->exp
		{
			tail->next = curB;
			tail = curB;
			curB = curB->next;
		}
	}
	tail->next = curA ? curA : curB;
	free(headB);  // 释放 headB 指向的头节点
}

四、多项式的输出

void PrintPolyn(Link head)
{
	assert(head);
	Node* cur = head->next;
	int first = 1;
	while (cur != NULL)
	{
		// 输出正负号
		if (first)
		{
			if (cur->coef < 0)
				printf("%c", '-');
			first = 0;
		}
		else
		{
			if (cur->coef < 0)
				printf("%c", '-');
			else
				printf("%c", '+');
		}

		// 输出系数的绝对值
		if ((cur->exp > 0 && cur->coef != 1) || cur->exp == 0)
			printf("%d", abs(cur->coef));

		// 输出自变量 x
		if (cur->exp > 0)
			printf("%c", 'x');

		// 输出 ^exp
		if (cur->exp > 1)
			printf("%c%d", '^', cur->exp);

		cur = cur->next;  // 指向多项式的下一项
	}
	printf("\n");
}

五、清除链表

void ClearLink(Link head)
{
	assert(head);
	Node* cur = head->next;
	while (cur != NULL)
	{
		Node* tmp = cur;
		cur = cur->next;
		free(tmp);
	}
	free(head);
}

六、主函数

#include "Polyn.h"

int main()
{
	Link headA;
	Link headB;
	InitPoyln(&headA);
	InitPoyln(&headB);

	int nA = 0;
	int nB = 0;
	scanf("%d", &nA);
	CreatePoyln(headA, nA);
	printf("第一个多项式为:");
	PrintPolyn(headA);

	scanf("%d", &nB);
	CreatePoyln(headB, nB);
	printf("第二个多项式为:");
	PrintPolyn(headB);

	AddPolyn(headA, headB);
	printf("两个多项式的和为:");
	PrintPolyn(headA);

	ClearLink(headA);
	return 0;
}
  1. 样例输入 1

    4
    3 2
    4 5
    1 1
    2 3
    3
    -3 2
    -4 5
    2 4

    样例输出 1

    第一个多项式为:4x^5+2x^3+3x^2+x
    第二个多项式为:-4x^5+2x^4-3x^2
    两个多项式的和为:2x^4+2x^3+x
  2. 样例输入 2

    2
    0 1
    2 3
    3
    2 6
    3 9
    4 3

    样例输出 2

    第一个多项式为:2x^3
    第二个多项式为:3x^9+2x^6+4x^3
    两个多项式的和为:3x^9+2x^6+6x^3
  3. 样例输入 3

    3
    4 2
    -2 2
    -1 2
    2
    0 2
    6 2

    样例输出 3

    第一个多项式为:x^2
    第二个多项式为:6x^2
    两个多项式的和为:7x^2
     

创作不易,可以点点赞,如果能关注一下博主就更好了~

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

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

相关文章

Java8新特性函数式编程 - Lambda、Stream流、Optional

1.Lambda表达式 1.1 概述 ​ Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…

python毕业设计之django+vue公司企业物流信息管理系统

基于 开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 语言设计并实现了速运公司物流信息管理系统。该系统基于B/S即所谓浏览器/服务器模式&…

智慧物流信息系统开发需具备哪些功能?

智慧物流软件开发公司在制作管理系统的时候&#xff0c;需要具备的功能有哪些呢&#xff1f; 一、采集跟踪功能。 &#xff08;1&#xff09;、信息采集&#xff1a;信息采集跟踪系统是智能物流系统的重要组成部分。物流信息采集系统主要由RFID射频识别系统和Savan…

【Hadoop-HDFS】HDFS中Fsimage与Edits详解

【Hadoop-HDFS】HDFS中Fsimage与Edits详解 1&#xff09;概述2&#xff09;NameNode元数据解析3&#xff09;Fsimage3.1.Fsimage 的作用3.2.FSimage 的文件信息查看 4&#xff09;Edits4.1.Edits 的作用4.2.Edits 的文件信息查看 5&#xff09;元数据信息目录的配置 1&#xff…

【2023.04.28】Windows配置MongoDB服务

【2023.04.28】Windows配置MongoDB服务 1、背景2、操作2.1 配置环境变量2.2 配置本地Windows MongoDB服务 环境&#xff1a;Windows11&#xff0c;Mongo 6.0.5【该版本没有mongo.exe】 1、背景 某一天想使用电脑以前安装的 MongoDB&#xff0c;发现用 Navicat 连接不了&#…

4个很多人都不知道的现代JavaScript技巧

JavaScript在不断的进化和升级&#xff0c;越来越多的新特性让我们的代码变得更加简洁。因此&#xff0c;今天这篇文章&#xff0c;我将跟大家分享 4 个不常用的 JavaScript 运算符。让我们一起研究它们。 1.可选的链接运算符 这个功能非常好用&#xff0c;它可以防止我的代码…

pwm调节亮度

文章目录 运行环境&#xff1a;1.1 pwm1)占空比2)A板原理图3)PE11引脚配置4)定时器Timers配置 2.1代码解释1)定时器1初始化函数2)启动定时器中断3)启动PWM/设置占空比4)launch设置5) 编译调试 3.1实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32…

Leetcode202. 快乐数

Every day a leetcode 题目来源&#xff1a;202. 快乐数 解法1&#xff1a;hash 根据几个例子&#xff0c;我们发现只有2种结果&#xff1a; 最终会得到1最终进入一个循环 其实得到1后&#xff0c;继续计算&#xff08;将该数替换为它每个位置上的数字的平方和&#xff09…

美妆“数字员工”来了!丸美:每月节省30人日!提升员工幸福感,企业效益稳增

美妆&#xff0c;因其效果可视觉化呈现的特征&#xff0c;决定了美妆品牌与直播带货的高匹配度。流量&#xff0c;是直播商家深入了解粉丝参与情况和商品销售状况的重要依据。因此&#xff0c;美妆商家需要每天下载直播数据报表&#xff0c;监测流量、成交变化趋势&#xff0c;…

数据可视化 —— 小练习1 KMeans聚类并数据可视化图像像素点

数据可视化Task1 任务描述&#xff1a;对图片RGB点进行Kmeans聚类&#xff0c;并将结果数据可视化于前端浏览器上 实验平台&#xff1a; Visual Studio CodeHTML/CSS/JavascriptEdge/Chorme/Firefox 浏览器Echart.min.js 3.8.5版 &#xff08;过高的版本浏览器无法include&a…

Python采集豆Top250电影数据 , 看看质量及评分

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 本次案例涉及点: 1、动态数据抓包演示 2、csv文件保存 3、requests模块的使用 4、parsel解析数据的使用 环境介绍&#xff1a; 软件安装 python 3.8 pycharm 不会安装的可以文末名片我获取哦 &#x1f60e; 模块使用…

windows安装flutter

在flutter官网下载flutter 在 Windows 操作系统上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 下载文件后&#xff0c;解压文件把文件存放在指定位置 打开flutter_console.bat文件 输入flutter doctor flutter报错提示&#xff08;…

unity-VRTK学习日记1(VRTK4|无头盔开发模拟器SpatialSimulator)

目录 前言 前期准备 1.配置VRTK4&#xff1a; 2.把几个插件给安装好 查看自己安装了哪些VRTK插件 3.添加模拟器 操作方法 操作方法&#xff1a;人话 前言 VRTK的较早版本不适用于Unity的新版本&#xff0c;原因好像是Unity将VR开发功能并入到自家的XR下了。就是之前更新…

即时通讯独立系统源码包含Android 、iOS、PC

demo软件园每日更新资源,请看到最后就能获取你想要的: 1.经典版哇呼星聊即时通讯独立系统源码 包含Android 、iOS、PC 自带教程 哇呼星聊即时通讯系统源码 AndroidiOSPC三端 附教程 服务器最低配置4H4G 这套安装跟shiku一样 1.安装宝塔&#xff0c;只安装Nginx&#xff0c;其他…

力扣,合并石头最低成本算法题

1&#xff1a;这个题有题解&#xff0c;自己可以去看力扣&#xff0c;合并石头 2&#xff1a;网上也有视频自己去看视频讲解 3&#xff1a;下面我自己的一些理解 4&#xff1a;原需求&#xff1a; 5&#xff1a;代码&#xff1a;使用贪心算法和最小堆来求解&#xff1a; im…

FreeRTOS系统学习-内核篇.01-数据结构---列表与列表项定义详解-链表节点插入实验

# 内核篇.01 列表与列表项 为什么要学列表&#xff1f;链表单向链表双向链表 FreeRTOS 中链表的实现节点节点初始化尾节点根节点链表根节点初始化将节点插入到链表的尾部将节点按照升序排列插入到链表将节点从链表删除节点带参宏小函数 链表节点插入实验实验现象 为什么要学列表…

TPM-TPM-Profile-PTP协议-2

TCG_PCClient_Device_Driver_Design_Principles_TPM2p0_v1p1_r4_211104_final.pdf 4 简介 本文档补充了 TCG PC Client Platform TPM Profile for TPM 2.0 Specification [PTP]&#xff1b; 特别是&#xff0c;本文档为有兴趣开发 DD 的 DD 编写者提供指导&#xff0c;以便与旨…

【C++】带你先入门类和对象(上)

作者&#xff1a;小树苗渴望变成参天大树 作者宣言&#xff1a;认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点 点 关 注 吧&#xff01; 文章目录 前言一、面向过程和面向对象初步认识二、类的引入三、类的定义四.类的访问限…

java后端为前端提供接口,将数据以树形结构返回(工具类hutool.core.lang.tree)

用于后端java的实用、简洁、通俗易懂的树形工具类使用笔记 设计需求是做一个类似于部门管理的树形结构&#xff0c;后端设计表写逻辑&#xff0c;为前端提供接口&#xff0c;将数据以树形结构返回 这里直接上代码&#xff0c;基本可以直接拿去用&#xff0c;把父id和名称做对…

Oracle之可视化ETL任务调度设计接口实现方案

背景 以前的项目有这么一个需求,线上的任务需要灵活的可视化配置,而一般的ETL任务调度需要写JOB的SQL脚本(需要对Oracle的dbms_job比较熟悉),而维护成本比较高,虽然可以查看执行的信息,但是权限比较高,不利于项目后台数据的安全。所以通过需求背景,自研设计任务调度平…