C++使用单链表实现一元多项式的加,乘操作

相邀再次喝酒
待 葡萄成熟透
但是命运入面 每个邂逅
一起走到了 某个路口
是敌与是友 各自也没有自由
位置变了 各有队友

首先,按照惯例,十分欢迎大家边听歌边观看本博客!!

最佳损友 - 陈奕迅 - 单曲 - 网易云音乐 (163.com)

一.具体题目

请用单链表实现一元多项式的加,乘操作。提示:一元多项式中的数据项含有两个数据分别是系数与指数,为了简单起见,系数与指数都为整数。
测试数据必须要含有下面的测试结果,

开始分析我们发现其实这道题和之前的多项式输出十分类似,好吧,几乎一模一样,这就好办了,直接将那道题的思路照搬

这是洛谷专题 中我的解释,但是啊很明显的是,这个解释不能有效帮助读者很快的掌握写代码的思路,没错,即使理解了,这个思路也十分令人难受,毫无逻辑可言,甚至只能进行记忆才能解答,所以,这里我打算使用一种新的思路方便读者理解并好好敲代码

二.Try a new way

新的思路

为了追求逻辑上的连贯,所以这里先一步一步创建

通过观察,一个多项式是由几个小小的单项式组成的,

三.代码展示以及样例测试

//使用单链表实现一元多项式的加,乘操作
#include <iostream>
using namespace std;

//定义一种x的几次方(单项式)的数据类型
typedef struct
{
	int coe;//系数 coefficient
	int index;//指数 index
}ElemType;

//建立单链表用来表示一个多项式
typedef struct LNode
{
	ElemType data; //结点的数据部分,每个data是一个单项式数据类型,是一个结构体噢~
	struct LNode *next;
}LinkList;

//初始化链表
void InitList(LinkList *&L)
{
	L=new LinkList;
	L->next=NULL;
}

//插入一个数据结点e到有序链表中
void InsertList(LinkList *&L,ElemType e)
{
	LinkList *r,*s;//r是循环用的结点指针,s是插入的新结点
	r=L;//每次循环开头指向头节点
	//寻找新插入结点的位置(注意这是循环步骤)
	while(r->next!=NULL&&e.index>r->next->data.index)//以指数的大小寻找位置-ps1
		r=r->next;            
	
	//判断下一个指数是否相等
	if(r->next!=NULL&&r->next->data.index==e.index)//若指数相同
		r->next->data.coe+=e.coe;//则系数相加
	else
	{
	s=new LinkList;
	s->data=e;//s->data.coe=e.coe;	s->data.index=e.index;//将e的值赋给s指针所指结点
	s->next = r->next;
	r->next = s;
	}
} 

//利用链表打印多项式---ps2
void DispList(LinkList *L)
{
	LinkList *p=L->next;
	while(p)
	{
		//特判系数为1,指数为0
		if(p->data.coe==1&&p->data.index==0)
			cout<<"1";
		//除了1和0其他都直接打,0忽略不打//普通系数打印
		if(p->data.coe!=0&&p->data.coe!=1)
			cout<<p->data.coe;
		//普通指数打印
		if(p->data.coe!=0)
		{
			if(p->data.index>1)
				cout<<"X^"<<p->data.index;
			else if(p->data.index<0)
				cout<<"X^("<<p->data.index<<")";
			else if(p->data.index==1)
				cout<<"X";
		}
		if(p->next!=NULL&&p->next->data.coe>0)//判断是否加+
			cout<<"+";
		p=p->next;   
	}
	cout<<endl;
}
//多项式加法
void AddList(LinkList *&L1,LinkList *L2)
{
	LinkList *b = L2->next;
	while(b != NULL)
	{
		InsertList(L1,b->data);//从L1表中取出每一个节点插入到L中
		b = b->next;
	}
}
//多项式乘法
void multiply(LinkList *L1,LinkList *L2,LinkList *&L3)
{
	LinkList *b,*a = L1->next;
	ElemType e;
	while(a != NULL)  //取L1表中的每一个节点
	{
		b = L2->next;  
		while(b != NULL)   //取L2表中的每一个节点
		{
			e.coe = a->data.coe * b->data.coe;    //系数相乘
			e.index = a->data.index + b->data.index;   //指数相加,得到节点相乘的值 
			InsertList(L3,e);  //再将该节点插入到L3中
			b = b->next;
		}
		a = a->next;
	}
	
}
int main()
{
	LinkList *L1;//初始化第一个多项式
	InitList(L1);
	LinkList *L2;//初始化第2个多项式
	InitList(L2);
	int a=0;ElemType F;//初始化一个单项式用于每次的接收
	while(a++<2){
	int i=0;
	do//
	{	
		cout<<"请输入第"<<a<<"个多项式的"<<i+1<<"项的系数:(按0视为该多项式结束项)";  cin>>F.coe;//先输入系数
		cout<<"请输入第"<<a<<"个多项式的"<<i+1<<"项的指数:";  cin>>F.index;//再输入指数
		i++; cout<<endl;
		if(F.coe!=0&&a==1)//coe为0直接忽略
			InsertList(L1,F);
		else if(F.coe!=0&&a==2)
			InsertList(L2,F);
	}while(F.coe!=0);
	}
	cout<<"第一个多项式F(X)=:     ";  DispList(L1);
	cout<<"第二个多项式G(X)=:     ";  DispList(L2);
	LinkList *L3;  InitList(L3);
	cout<<"多项式相乘为:     ";multiply(L1,L2,L3); DispList(L3);
	cout<<"多项式相加为:     ";AddList(L1,L2);DispList(L1);//其实也可以一个一个加
	return 0;
}

//浅浅的分析一下
//第一二个多项式需要不断输入各系数,而且由指数由小到大打印
//ps1:直到找到比自己大的停下,此时的位置即为自己的位置如果遇到相等也会停下
//ps2:打印的思路特判一下思路
//打印系数
//index=0,coe=1的情况,直接打印系数
//系数为1的情况,不打印1
//
//第三是加号的特判+

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode295. 数据流的中位数

class MedianFinder {//A为小根堆&#xff0c;B为大根堆List<Integer> A,B;public MedianFinder() {A new ArrayList<Integer>();B new ArrayList<Integer>();}public void addNum(int num) {int m A.size(),n B.size();if(m n){insert(B,num);int top …

开源模型 Prometheus 2 能够评估其他语言模型,其效果几乎与 GPT-4 相当

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

springboot使用研究

map-underscore-to-camel-case: true 开启驼峰命名 GetMapping("/userInfo")public Result<Users> userInfo(RequestHeader(name "Authorization") String token,HttpServletResponse response) {Map<String, Object> map JwtUtil.parseT…

Java | Spring框架|Bean的装配之注解配置

Spring | Bean的装配之 注解配置&#xff1a;简化配置的新标准 Spring框架的注解配置是近年来流行的配置方式&#xff0c;它通过在Java代码中使用注解来简化Bean的配置。这种方式减少了XML配置文件的使用&#xff0c;使得Bean的定义更加直观和简洁。 一、 使用注解定义Bean …

Problem 5: Whack-A-Mole打地鼠

实战题&#xff1a;打地鼠 内容如附件所示&#xff1a; 测试数据为:1,2,4,8,9,10,11,14 答案为&#xff1a;10,2,4 原始分布&#xff1a; 击打10号 击打2号 击打4号 要求&#xff0c;所示实例解以图示的方式给出&#xff0c;并且5组测试数据都需要测试&#xff0c;…

软件工程案例学习-图书管理系统-面向对象方法

文档编号&#xff1a;LMS_1 版 本 号&#xff1a;V1.0 ** ** ** ** ** ** 文档名称&#xff1a;需求分析规格说明书 项目名称&#xff1a;图书管理系统 项目负责人&#xff1a;计敏 胡杰 ** ** …

开式双比例泵控制放大器

比例泵PQ控制放大器的主要作用是通过接收来自控制器的信号&#xff0c;并将其转换为适当的电流信号&#xff0c;以驱动变量泵。这种控制方式可以实现对泵输出流量和压力的精确控制&#xff0c;从而实现节能和提高效率的目的。比例泵PQ控制放大器通常用于节能型泵控制系统中&…

【Linux系列】tail查询使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【6D位姿估计】ZebraPose 层次化分组策略 由粗到细的表面编码

前言 本文介绍6D位姿估计的方法ZebraPose&#xff0c;也可以称为六自由度物体姿态估计&#xff0c;输入单张图片&#xff0c;输出物体的三维位置和三维方向。 它来自CVPR2022的论文&#xff0c;通过层次化分组策略&#xff0c;高效地编码物体表面的信息。 ZebraPose提出了一…

运维自动化之 ansible

目录 一 常见的自动化运维工具 &#xff08;一&#xff09;有哪些常见的 自动化运维工具 &#xff08;二&#xff09;为什么后面都变成用 ansible 二 ansible 基本介绍 1&#xff0c; ansible 是什么 2&#xff0c;ansible能干什么 3&#xff0c;ansible 工作原…

Linux网络—PXE高效批量网络装机

目录 一、部署PXE远程安装服务 1、搭建PXE远程安装服务器 1&#xff09;安装并启用 TFTP 服务 2&#xff09;安装并启用 DHCP 服务 3&#xff09;准备 Linux 内核、初始化镜像文件 4&#xff09;准备 PXE 引导程序 5&#xff09;安装FTP服务&#xff0c;准备CentOS 7 安…

OpenCV 入门(一) —— OpenCV 基础

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

Springboot框架web开发实用功能-02

在些模块中汇总了一些web开发常用的配置和功能。 涉及的模块 springboot-common-config&#xff0c; 端口号&#xff1a;17000 Springboot框架web开发常用功能 Restful接口定义 查询参数 Data public class QueryParam {private String key;private String value; }Control…

MATLAB实现杜拉德公式和凯夫公式的计算固液混合料浆临界流速

MATLAB实现杜拉德公式和凯夫公式的计算固液混合料浆临界流速: 杜拉德公式是用来计算非均质固液混合料浆在输送管中的临界速度的公式&#xff0c;具体形式为&#xff1a; uL FL (2gD / (ρ0 - ρ1))^(1/2) 其中&#xff1a; uL&#xff1a;表示料浆的临界速度&#xff0c;…

Hbase 常用shell操作

目录 1、创建表 1.1、启动HBase Shell 1.2、创建表 1.3、查看表 1.4、删除表 2、插入数据 2.1、put命令 3、查看数据 3.1、get命令 3.2、查询数据中文显示 4、更新数据 4.1、使用put来更新数据 5、删除数据 5.1、delete命令 5.2、删除指定列的数据 5.3、delete…

Pycharm debug 运行报错 (RuntimeError: cannot release un-acquired lock)

问题描述&#xff1a; 最近再跑一个 flask应用&#xff0c;Pycharm 运行没问题&#xff0c;debug断点启动时报错 如下&#xff1a; 解决方案&#xff1a; 在环境变量中增加 GEVENT_SUPPORTTrue 启动成功&#xff01;

libcity笔记:添加新模型(以RNN.py为例)

创建的新模型应该继承AbstractModel或AbstractTrafficStateModel 交通状态预测任务——>继承 AbstractTrafficStateModel类轨迹位置预测任务——>继承AbstractModel类 1 AbstractTrafficStateModel 2 RNN 2.1 构造函数 2.2 predict 2.3 calculate_loss

博客系统项目测试报告

文章目录 一.报告概要二.测试环境三.手工测试用例四.编写测试用例五.自动化测试Selenium测试项目主要特点 一.报告概要 项目概要 本项目是一个全功能的个人博客系统&#xff0c;旨在提供一个用户友好、功能全面的平台&#xff0c;允许用户注册、登录、浏览博客、查看详细内容、…

Mac跑llama.cpp过程中遇到的问题

原repo 在华为手机上安装termux、下载库&#xff1a;顺利在电脑上安装Android NDK&#xff1a;先下载Android Studio&#xff0c;再在里面下载Android SDK 安装Android Studio时&#xff0c;SDK的某些组件总是下载不成功。后来关了梯子、改了hosts&#xff0c;重新安装就成功了…

Golang | Leetcode Golang题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; func setZeroes(matrix [][]int) {n, m : len(matrix), len(matrix[0])col0 : falsefor _, r : range matrix {if r[0] 0 {col0 true}for j : 1; j < m; j {if r[j] 0 {r[0] 0matrix[0][j] 0}}}for i : n - 1; i > 0; i-- {for …