数据结构-多项式的基本操作(链表实现)

2023-11-05

#include<iostream>
#include<malloc.h>
using namespace std;
#define MAX 100

typedef struct 
{
	double coef;	//系数
	int exp;		//指数
}PolyArray;			//存放多项式的数组类型
typedef struct pnode
{
	double coef;	//系数
	int exp;		//指数
	struct pnode* next;
}PolyNode;			//声明多项式单链表结点类型

void DispPoly(PolyNode* L)		//输出多项式单链表
{
	bool first = true;			//first为true表示第一项
	PolyNode* p = L->next;
	while (p != NULL)
	{
		if (first)
			first = false;
		else if (p->coef > 0)
			cout << "+";
		if (p->exp == 0)
			printf("%g", p->coef);
		else if(p->exp==1)
			printf("%gx", p->coef);
		else
			printf("%gx^%d", p->coef, p->exp);
		p = p->next;
	}
	cout << endl;
}

void DestoryPoly(PolyNode* &L)			//销毁多项式单链表
{
	PolyNode* pre = L, * p = pre->next;
	while (p != NULL)
	{
		free(pre);
		pre = p;
		p = pre->next;
	}
	free(pre);
}

void CreataPolyR(PolyNode*& L, PolyArray a[], int n)			//尾插法建表
{
	PolyNode* s, * r;
	int i;
	L = (PolyNode*)malloc(sizeof(PolyNode));			//创建头结点
	L->next = NULL;
	r = L;			//r始终指向尾结点,开始时指向头结点
	for (i = 0; i < n; i++)
	{
		s= (PolyNode*)malloc(sizeof(PolyNode));			//创建新结点
		s->coef = a[i].coef;
		s->exp = a[i].exp;
		r->next = s;								//将结点s插入到结点r之后
		r = s;
	}
	r->next = NULL;									//尾结点next域置为空
}

void Sort(PolyNode*& L)					//将多项式单链表按指数递减排序
{
	PolyNode* p = L->next, * pre, * q;
	if (p != NULL)
	{
		q = p->next;			//q保存p结点的后继结点
		p->next = NULL;			//构造只含一个数据结点的有序表
		p = q;
		while(p != NULL)
		{
			q = p->next;			//q保存p结点的后继结点
			pre = L;
			while (pre->next != NULL && pre->next->exp > p->exp)
				pre = pre->next;		//在有序表中找插入结点p的前驱结点pre
			p->next = pre->next;
			pre->next = p;
			p = q;						//扫描原单链表余下的结点
		}
	}
}

void Add(PolyNode* ha, PolyNode* hb, PolyNode*& hc)		//ha和hb相加得到hc
{
	PolyNode* pa = ha->next, * pb = hb->next, * s, * r;
	double c;
	hc = (PolyNode*)malloc(sizeof(PolyNode));
	r = hc;				//r始终指向尾结点,开始时指向头结点
	while (pa != NULL && pb != NULL)			//pa,pb均没有扫描完
	{//下面开始进行比较,按照指数的大小来比较
		if (pa->exp > pb->exp)				//将指数较大的pa结点复制到hc中
		{
			s = (PolyNode*)malloc(sizeof(PolyNode));
			s->exp = pa->exp; s->coef = pa->coef;
			r->next = s;
			r = s;
			pa = pa->next;
		}
		else if (pa->exp < pb->exp)				//将指数较大的pb结点复制到hc中
		{
			s = (PolyNode*)malloc(sizeof(PolyNode));
			s->exp = pb->exp; s->coef = pb->coef;
			r->next = s;
			r = s;
			pb = pb->next;
		}
		else                                    //pa,pb的指数相等时
		{
			c = pa->coef + pb->coef;			//两个结点的系数和为c
			if (c != 0)                         //若系数和不为0时创建新结点
			{
				s = (PolyNode*)malloc(sizeof(PolyNode));
				s->exp = pa->exp; s->coef = c;
				r->next = s;
				r = s;
			}
			pa = pa->next;				//pa,pb均后移一个结点
			pb = pb->next;
		}
	}
	if (pb != NULL)pa = pb;				//复制余下的结点
	while (pa != NULL)
	{
		s = (PolyNode*)malloc(sizeof(PolyNode));
		s->exp = pa->exp; s->coef =pa->coef;
		r->next = s;
		r = s;
		pa = pa->next;
	}
	r->next = NULL;			//尾结点next置为空
}

void Mult1(PolyNode* ha, PolyNode* hb, PolyNode*& hc)		//ha,hb简单相乘得到hc
{
	PolyNode* pa = ha->next, * pb, * s, * tc;
	hc = (PolyNode*)malloc(sizeof(PolyNode));
	tc = hc;
	while (pa != NULL)
	{
		pb = hb->next;
		while (pb != NULL)
		{
			s= (PolyNode*)malloc(sizeof(PolyNode));
			s->coef = pa->coef * pb->coef;
			s->exp = pa->exp + pb->exp;
			tc->next = s;
			tc = s;
			pb = pb->next;
		}
		pa = pa->next;
	}
	tc->next = NULL;
}

void Comb(PolyNode*& L)			//合并指数相同的项
{
	PolyNode* pre = L->next, * p;
	if (pre == NULL)return;
	p = pre->next;
	while (p != NULL)
	{
		while (p->exp == pre->exp)
		{
			pre->coef += p->coef;
			pre->next = p->next;
			free(p);
			p = pre->next;
		}
		pre = p;
		p = p->next;
	}
}

void DelZero(PolyNode*& L)		//删除系数为0的项
{
	PolyNode* pre = L, * p = pre->next;
	while (p != NULL)
	{
		if (p->coef == 0.0)
		{
			pre->next = p->next;
			free(p);
		}
		pre = p;
		p = p->next;
	}
}

void Mult(PolyNode* ha, PolyNode* hb, PolyNode*& hc)		//ha,hb相乘得到最终的hc
{
	Mult1(ha, hb, hc);
	cout << "相乘结果: "; DispPoly(hc);
	Sort(hc);
	cout << "按指数排序后: "; DispPoly(hc);
	Comb(hc);
	cout << "合并重复指数项: "; DispPoly(hc);
	DelZero(hc);
	cout << "删除系数为0的项: "; DispPoly(hc);
}

int main()
{
	PolyNode* Poly1, * Poly2, * Poly3;
	int  n;
	//----创建第1个多项式单链表并排序----
	PolyArray a[] = { {2,3},{1,0},{3,1} };
	n = 3;
	cout << "第1个多项式: " << endl;
	CreataPolyR(Poly1, a, n);
	cout << "排序前多项式1: "; DispPoly(Poly1);
	Sort(Poly1);
	cout << "排序后多项式1: "; DispPoly(Poly1);
	cout << endl;
	//----创建第2个多项式单链表并排序----
	PolyArray b[] = { {2,3},{-3,2},{5,4},{-3,0 } };
	n = 4;
	cout << "第2个多项式: " << endl;
	CreataPolyR(Poly2, b, n);
	cout << "排序前多项式2: "; DispPoly(Poly2);
	Sort(Poly2);
	cout << "排序后多项式2: "; DispPoly(Poly2);
	cout << endl;
	Mult(Poly1, Poly2, Poly3);
	cout << "相乘后多项式3: "; DispPoly(Poly3);
	cout << endl;
	cout << "最后的A: "; DispPoly(Poly1);
	cout << "最后的B: "; DispPoly(Poly2);
	cout << "最后的C: "; DispPoly(Poly3);
	cout << endl;
	cout << "20213002624李季鸿代码";
	system("pause");
	return 1;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构-多项式的基本操作(链表实现) 的相关文章

  • Pycharm连接Mysql8.0的坑

    Pycharm连接Mysql8 0 1 错误 S1009 The connection property zeroDateTimeBehavior acceptable values are CONVERT TO NULL EXCEPTIO
  • 数据数仓的三种建模方式

    所谓水无定势 兵无常法 不同的行业 有不同行业的特点 因此 从业务角度看 其相应的数据模型是千差万别的 目前业界较为主流的是数据仓库厂商主要是 IBM 和 NCR 这两家公司的除了能够提供较为强大的数据仓库平台之外 也有各自的针对某个行业的

随机推荐

  • 新基建时期助力打造数字化智慧交通体系

    在没多久之前公布的政府工作报告中 明晰了将重点扶持 两新一重 基础建设的战略方针 并且对 两新一重 体系的实际价值给出了 既促消费惠民生又调结构增后劲 的评价 两新一重 体系包含三个基础建设方向 即增强新型基础设施建设 发展新一代的信息网络
  • Struts2 标签详解(学习深入)

    Struts2 标签详解 详细的说明了struts2所有标签 a a标签创建一个HTML超链接 等价于HTML 的
  • 软件测试 - 自动化测试工具 selenium1

    1 什么是自动化测试 2 自动化测试金字塔 2 1 单元测试 2 2 接口测试 2 3 UI 自动化测试 3 为什么要使用 selenium 自动化框架 4 什么样的项目适合自动化测试 5 Selenium IDE 6 Webdriver
  • 手写一个服务器代码将 《vue电商后台管理系统》部署上去 上线、打包

    我将在博文中全程以cnpm作为代码格式 为了好复制 它快啊 你要知道node安装包自带npm npm下载cnpm才可以使用cnpm 今日目标 1 上线vue电商后台管理项目 2 手写搭建服务器并挂载 node 3 打包优化 完成上线 前期回
  • MySQL的数据查询详解

    MySQL查询数据 一 基本查询语句 二 单表查询 三 常用函数查询 四 连接查询 五 子查询 六 合并查询结果 七 为表和字段取别名 八 使用正则表达式查询 一 基本查询语句 数据库管理系统的一个最重要的功能就是数据查询 数据查询不只是简
  • 【AI实战营第二期】第三次作业——基于 RTMDet 的气球检测(包含数据集)

    作业 基于 RTMDet 的气球检测 背景 熟悉目标检测和 MMDetection 常用自定义流程 任务 基于提供的 notebook 将 cat 数据集换成气球数据集 按照视频中 notebook 步骤 可视化数据集和标签 使用MMDet
  • three.js---一个基础的demo

    在学习three js过程中 不难发现 每新开发一个3D场景都会从创建场景 scene 创建物体 创建相机这三个基础的方法开始 从而在其身上衍生出其他的一些API 为了方便日后的开发 特此记录一个简单基础的demo 在之后的开发中可直接使用
  • python测试网络连通性_PYTHON 测试服务器连通性

    coding utf 8 import os import sys import urllib2 import pygame import re import socket import subprocess 输入要测试的site值 pri
  • 基于Jenkins CICD的代码发布与回滚

    案例知识点 1 Jenkins 介绍 Jenkins 原名 Hudson 2011 年改为现在的名字 它是一个开源的实现持续集成的软件工具 官方网站 https jenkins io Jenkins 能实施监控持续集成过程中所存在的问题 提
  • UI自动化测试-第一个测试脚本

    前提 我们在进行UI自动化测试时 一般采用java selenium或者python selenium的方式 由于python比较简单 上手快 因此建议大家采用python selenium的方式来进行UI自动化 1 安装pycharm P
  • 浏览器控制器进行request(ajax)请求

    浏览器控制器进行request ajax 请求 问题 代码 问题 前后分离开发时 经常出现跨域问题 用postman开发的时候不会出现 所以用以下代码在浏览器的控制器里面进行模拟请求 做个记录 代码 var url http XXX XXX
  • Unable to cast object of type ‘System.Byte[]‘ to type ‘System.System.String‘

    环境 C MySQL数据库 asp net core 3 1 问题 调试 确实有问题 异常还原与异常信息一致 初步分析为数据库数据表实体类映射字段没对起来 检查数据库数据表与实体类映射 发现 某字段类型为longblob 映射类型为Stri
  • Qt开发记录18——授权校验

    授权校验 Windows系统 获取cpu序列号 BIOS序列号 网卡mac地址 代码 Linux系统 获取硬盘序列号 网卡MAC地址 代码 生成的授权码 代码 读取授权文件中的授权码 代码 校验 代码 Windows系统 获取cpu序列号
  • Java Stream流操作

    Stream目录 一 概述 二 分类 三 具体用法 1 流的常用创建方法 1 1 使用Collection下的 stream 和 parallelStream 方法 1 2 使用Arrays 中的 stream 方法 将数组转成流 1 3
  • 使用PlayerPrefs的数据存储

    LasText text 上次 长度 PlayerPrefs GetInt lastl 0 上次 分数 PlayerPrefs GetInt lasts 0 如果上次长度没有 则设置上次长度为零 PlayerPrefs SetInt las
  • VLC media player 官方下载

    http www videolan org vlc index zh html
  • HTML5制作个人简历模板

    利用表格标签制作一个个人简历的模板 代码片段如下 table cellspacing 1 width 700px align center caption 个人简历 caption tr height 45 th 姓名 th td td t
  • 弱网测试及工具对比(Fiddler/Charles/NEWT/Clumsy/ATC/WANem/QNET)

    1 什么是弱网测试 弱网测试主要就是对带宽 丢包 延时等进行模拟弱网环境 衡量网络性能好坏的几个指标 带宽 吞吐量 单位时间内传输的数据量 单位通常是 每秒比特数 bps 带宽反映了网络的传输能力 越大越好 丢包 数据丢包个数 发送的数据包
  • MySQL中concat

    MySQL中使用concat拼接字符集 用mysql统计数据总和 需要拼接中文 发现是乱码 一直以为自己写的sql有问题 最后一查原来是因为使用concat函数时 需要转换参数类型 1 乱码sql 直接使用concat拼接中文和统计结果 s
  • 数据结构-多项式的基本操作(链表实现)

    include