数据结构(C语言):一元多项式的操作(链表实现)

news2024/12/25 12:55:19

一、题目

一元多项式的操作

设有两个一元多项式:

p(x)=p0+p1x+p2x2+···+pnxn

q(x)=q0+q1x+q2x2+···+qmxm

多项式项的系数为实数,指数为整数,设计实现一元多项式操作的程序:

① 多项式链表建立:以(系数,指数)方式输入项建立多项式,返回所建立的链表的头结点;

② 多项式排序:将所建立的多项式按指数非递减(从小到大)进行排序;

③ 多项式相加:实现两个多项式相加操作。操作生成一个新的多项式,原有的两个多项式不变,返回生成的多项式的头结点;

④  多项式的输出;

⑤ 主函数通过调用多项式链表建立函数,输入两个多项式并分别输出;输出排序后的两个多项式;分别调用多项式相加函数实现多项式相加、相减操作,分别输出操作结果。

二、算法思想

  1. 定义多项式的结构体,包括两个数据域:系数、指数,一个指针域,保存下一个结点的地址。
  2. 尾插法建立多项式链表的函数:定义头指针和尾指针,在内存中开辟n个新结点、连续输入n个多项式的数据域并依次插入链表末尾。将尾结点的指针域赋值为空。
  3. 计算表长的函数:用count储存链表的长度,定义指向首元结点的指针p。若p不为空,则count自增,p后移一位,重复上述操作,直到p为空,返回count。
  4. 排序函数:使用冒泡排序法各个多项式的指数数据域,指数大的往后移。
  5. 多项式相加函数(前提是链表指数数据域已经升序排列):建立新链表储存相加后的多项式,将指数小的一项插入新链表的表尾,若指数相同,则使系数相加。
  6. 多项式相加函数(前提是链表指数数据域已经升序排列):将其中一个链表的各项变为相反数,其余操作和多项式相加函数一样。
  7. 多项式输出的函数:逐个输出链表的各个项。
  8. 主函数:依次调用各个函数实现不同的功能。

三、完整源代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

typedef struct polynomial {
	double coef;//系数
	int index;//指数
	struct polynomial* next;
};

polynomial* CreateList(int n)//多项式链表建立的函数(尾插法)
{
	polynomial* L = (polynomial*)malloc(sizeof(polynomial));
	polynomial* r = L;//定义尾指针
	for (int i = 0; i < n; i++)//连续输入n个项的系数和指数
	{
		polynomial* p = (polynomial*)malloc(sizeof(polynomial));
		printf("请输入第%d项的系数、指数:", i+1);
		scanf("%lf %d", &p->coef, &p->index);
		r->next = p;
		r = r->next;//将尾指针后移一位
	}
	r->next = NULL;
	return L;
}

int LengthList(polynomial* L)//计算表长的函数
{
	polynomial* p = L->next;
	int count = 0;
	while (p)
	{
		count++;
		p = p->next;
	}
	return count;
}

void sort(polynomial* L)//排序函数(冒泡排序法:数大后移)
{
	for (int i = 0; i <LengthList(L)-1; i++)
	{
		polynomial* q = L->next;
		polynomial* p = L->next->next;
		for (int j = 0; j < LengthList(L)-i-1; j++)
		{
			if (q->index > p->index)//指数大的项往后移
			{
				double temp1 = q->coef;//两数交换
				q->coef = p->coef;
				p->coef = temp1;
				int temp2 = q->index;
				q->index = p->index;
				p->index = temp2;
			}
			p = p->next;//指针后移
			q = q->next;
		}
	}
}

polynomial* add(polynomial* L1, polynomial* L2)//多项式相加函数(前提是链表已经升序排列)
{
	polynomial* p = L1->next;
	polynomial* q = L2->next;
	polynomial* L = (polynomial*)malloc(sizeof(polynomial));//建立新链表储存相加后的多项式
	polynomial* r = L;
	while (p && q)//当p和q均不为空
	{
		if (p->index > q->index)//将指数小的一项插入新链表尾部
		{
			r->next = q;
			q = q->next;
			r = r->next;
		}
		else if (p->index < q->index)
		{
			r->next = p;
			p = p->next;
			r = r->next;
		}
		else
		{
			if (p->coef + q->coef == 0)//若两项系数相加为0
			{
				p = p->next;
				q = q->next;
			}
			else
			{
				r->next = p;
				p->coef = p->coef + q->coef;
				q = q->next;
				p = p->next;
				r = r->next;
			}
		}
		r->next = p == NULL ? q : p;//将较长的多项式中未被操作的部分插入新链表的尾部
	}
	return L;
}

polynomial* subtract(polynomial* L1, polynomial* L2)//多项式相减函数(前提是链表已经升序排列)
{
	polynomial* s = L2->next;//将被减数各项系数变为相反数
	while (s)
	{
		s->coef = -s->coef;
		s = s->next;
	}
	polynomial* p = L1->next;//以下操作与多项式相加函数相同
	polynomial* q = L2->next;
	polynomial* L = (polynomial*)malloc(sizeof(polynomial));//建立新链表储存相加后的多项式
	polynomial* r = L;
	while (p && q)//当p和q均不为空
	{
		if (p->index > q->index)//将指数小的一项插入新链表尾部
		{
			r->next = q;
			q = q->next;
			r = r->next;
		}
		else if (p->index < q->index)
		{
			r->next = p;
			p = p->next;
			r = r->next;
		}
		else
		{
			if (p->coef + q->coef == 0)//若两项系数相加为0
			{
				p = p->next;
				q = q->next;
			}
			else
			{
				r->next = p;
				p->coef = p->coef + q->coef;
				q = q->next;
				p = p->next;
				r = r->next;
			}
		}
		r->next = p == NULL ? q : p;//将较长的多项式中未被操作的部分插入新链表的尾部
	}
	return L;
}

void VisitList(polynomial* L)//输出多项式的函数
{
	polynomial* p = L->next;
	while (p)
	{
		printf("%.2lfx^%d ", p->coef, p->index);
		p = p->next;
	}
	printf("\n\n");
}

//建立一个数据域与形参一样的新链表并返回,即将链表赋值一份
//定义该函数的原因是相加及相减函数会改变两个链表指针域的指向,故需要将链表先复制一份便于后续使用
polynomial* copy(polynomial* L)
{
	polynomial*CopyL= (polynomial*)malloc(sizeof(polynomial));
	polynomial* p = CopyL;
	polynomial* q = L->next;
	while (q)
	{
		p->next = (polynomial*)malloc(sizeof(polynomial));
		p = p->next;
		p->coef = q->coef;
		p->index = q->index;
		q = q->next;
	}
	p->next = NULL;
	return CopyL;
}

int main()
{
	int n1;
	printf("请输入第一个多项式的项数:");
	scanf("%d", &n1);
	printf("请输入第一个多项式:\n");
	polynomial* L1 = CreateList(n1);//多项式链表建立的函数
	printf("第一个多项式的各项为:\n");
	VisitList(L1);
	sort(L1);//排序函数
	polynomial* L3 = copy(L1);
	printf("排序后的多项式的各项为:\n");
	VisitList(L1);
	int n2;
	printf("请输入第二个多项式的项数:");
	scanf("%d", &n2);
	printf("请输入第二个多项式:\n");
	polynomial* L2 = CreateList(n2);//多项式链表建立的函数
	printf("第二个多项式的各项为:\n");
	VisitList(L2);
	sort(L2);//排序函数
	polynomial* L4 = copy(L2);
	printf("排序后的多项式的各项为:\n");
	VisitList(L2);
	polynomial* AddL = add(L1, L2);//多项式相加函数
	printf("相加后的多项式的各项为:\n");
	VisitList(AddL);
	polynomial* SubtractL = subtract(L3, L4);//多项式相减函数
	printf("相减后的多项式的各项为:\n");
	VisitList(SubtractL);//输出多项式的函数
	return 0;
}

四、运行结果

 

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

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

相关文章

国内最佳的客服系统Tidio替代品是什么?

许多做跨境电商的企业都知道&#xff0c;Tidio是一款不错的为电子商务量身定制的全渠道客服系统支持工具&#xff0c;但还有其他同样不错的选择。 当前许多同类型产品以迎合欧美客户居多&#xff0c;中国用户使用不惯&#xff1b;免费版体验门槛高&#xff1b;只支持海外支付方…

【链路追踪】「Go语言」OpenTelemetry实现[gin, gRPC, log, gorm, redis]的集成

文章目录 一、OpenTelemetry的前世今生OpenTracingOpenCensus大一统 二、OpenTelemetry快速体验go快速体验OpenTelemetry系统架构尾部采样 三、通过http完成span传输函数中传递span的context 四、自定义inject和extract源码五、gRPC集成自用框架集成&#xff08;无视即可&#…

最强chrome、edge的广告拦截插件

最强chrome、edge的广告拦截插件 对于浏览器的广告是非常烦人的&#xff0c;尤其是使用百度搜索引擎时&#xff0c;总会在右侧出现百度热搜这样的东西&#xff0c;有时不经意间就会被某些热搜吸引。本来想搜索一些内容&#xff0c;结果被热搜等耗费了大量时间。 有很多人推荐…

pytorch基础语法学习:数据预处理transforms模块

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 建议搭配视频食用 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5df0ad9a09d37_qYqVmt85/6 系列其他文章传送门&#xff1a; pytorch基础语法学习&#xff1a;数据读取机制Dataloader与Datase…

3D点云数据转为俯瞰图Python实现代码

我主要是参考了英文博客来撰写本篇文章&#xff0c;仅作为个人学习笔记参考使用。 文章目录 一、点云数据二、图像与点云坐标三、创建点云数据的鸟瞰视图3.1 鸟瞰图的相关坐标轴3.2 限制点云数据范围3.3 将点位置映射到像素位置3.4 切换到新的零点3.5 像素值3.6 创建图像矩阵3.…

IOS最新版开通GPT-PLUS方法

前提&#xff0c;美国IP魔法 不多说了 1.拥有一个美区apple id账号 可以买&#xff0c;也可以自己申请 自己申请就打开魔法到apple官网注册&#xff0c;用gmail邮箱&#xff0c;然后地址用美国地址生成器&#xff0c;记得选免税州 2.充值礼品卡 支付宝可以充值礼品卡&…

大模型总是「胡说八道」怎么办?手把手教你如何应对!

随着 ChatGPT 的出现&#xff0c;「AI 幻觉」一词被频繁提及。那么&#xff0c;什么是 AI 幻觉&#xff1f;简单来说&#xff0c;就是大模型在一本正经地胡说八道。 不止 ChatGPT&#xff0c;其他大语言模型也经常如此&#xff0c;究其根本是大语言模型在训练的过程中存在数据偏…

驱动开发-----io模型总结(2023-5-23)

1.非阻塞模型 在我们使用open函数时&#xff0c;将打开的驱动设置为O_NONBLOCK时&#xff0c;当我们用read函数去读取硬件数据时&#xff0c;无论硬件是否有数据&#xff0c;都会往下执行&#xff0c;不会被阻塞在这里 2.阻塞模型 在我们使用open函数时&#xff0c;没有设置…

C++学习之路-变量和基本内置类型

变量和基本内置类型 一、基本内置类型1.1 算数类型1.2 带符号类型和无符号类型1.3 类型转换含有无符号类型的表达式 1.4 字面值常量整形和浮点型字面值字符和字符串字面值转义序列指定字面值的类型 二、变量2.1 变量的定义初始化列表初始化默认初始化 2.2 变量声明和定义的关系…

斐波那契数列数列相关简化1

斐波那契数列问题介绍&#xff1a; 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xf…

包管理工具详解npm、yarn、cnpm、npx、pnpm

目录&#xff1a; 1 npm包管理工具 2 package配置文件 3 npm install原理 4 yarn、cnpm、npx 5 发布自己的开发包 6 pnpm使用和原理 当我们使用npm install xxxx 的时候会添加一个node_module和2个json文件&#xff1a; package.json是配置信息文件&#xff0c;  这个配…

Go完整即时通讯项目及Go的生态介绍

Go完整即时通讯项目 项目架构&#xff1a; 1 编写基本服务端-Server server.go package mainimport ("fmt""net" )// 定义服务端 type Server struct {ip stringport int }// 创建一个Server func NewServer(ip string, port int) *Server {return …

Jenkins + docker-compose 在 Centos 上搭建部署

一、前期准备 1. 检查 CentOS上 是否安装 docker 可以使用以下命令&#xff1a; sudo docker version 如果已经安装了Docker&#xff0c;它将显示有关Docker版本和构建信息的输出。如果未安装Docker&#xff0c;将收到有关命令未找到的错误消息。 2. 检查是否安装 docker-…

cookie-机制

目录 一、基础概念 二、cookie的处理方式 一、基础概念 1、cookie是存储在客户端的一组键值对 2、web中cookie的典型应用&#xff1a;免密登陆 3、cookie和爬虫之间的关联 有时&#xff0c;对一张页面进行请求的时候&#xff0c;如果请求的过程中不携带cookie的话&#xf…

Openai+Coursera: ChatGPT Prompt Engineering(四)

想和大家分享一下最近学习的Coursera和openai联合打造ChatGPT Prompt Engineering在线课程.以下是我写的关于该课程的前两篇博客&#xff1a; ChatGPT Prompt Engineering(一)ChatGPT Prompt Engineering(二)ChatGPT Prompt Engineering(三) 今天我们来学习第三部分内容&…

Java on Azure Tooling 4月更新|路线图更新及 Azure Toolkit for IntelliJ 增强

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Java on Azure 工具产品的4月更新。让我们首先来谈谈我们对未来几个月的 Java on Azure 开发工具的投资。在这次更新中&#xff0c;我们…

js - 闭包

1、闭包的概念 闭包&#xff1a;函数嵌套函数&#xff0c;内层函数访问了外层函数的局部变量。 // 闭包 function func1() {let a 9;let b 8;function func2() {console.log("a", a); // a 9}func2(); } func1(); 分析&#xff1a; 需要访问的变量会被放到闭包…

【云原生|Kubernetes】05-Pod的存储卷(Volume)

【云原生Kubernetes】05-Pod的存储卷&#xff08;Volume) 文章目录 【云原生Kubernetes】05-Pod的存储卷&#xff08;Volume)简介Volume类型解析emptyDirHostPathgcePersistentDiskNFSiscsiglusterfsceph其他volume 简介 Volume 是Pod 中能够被多个容器访问的共享目录。 Kubern…

ChatGPT可以帮助开发人员的8种方式...

“适应或灭亡”是科技界的口头禅&#xff0c;如果您是开发人员&#xff0c;则尤其如此。 由于技术的动态发展&#xff0c;开发人员面临着比大多数人更大的压力&#xff0c;他们要领先于适应和精通最好的工具。ChatGPT 是最新的此类工具。 虽然有人说 ChatGPT 是“工作杀手”&…

比Figma更丝滑的“Figma网页版“

随着互联网的全面普及和全球化&#xff0c;设计协作工具逐渐成为团队协作中不可或缺的一部分。设计师们常需要通过在线设计协作工具来完成设计任务&#xff0c;而 Figma 作为协作工具的佼佼者&#xff0c;成为了许多设计师心中的首选。但是&#xff0c;对于国内设计师来说&…