数据结构(链表2)

news2024/11/15 19:56:19

链表图中的“^”符号表示所储存内容为空。 

单循环链表

末结点的next不再指向空,而是指向头结点。

 空单向循环链表,只有头结点。

 优点:从表中任何一个结点出发,都可以顺next指针访问到所有结点。

不带头结点的单循环链表

为了循环方便,不带头结点的单循环链表居多,head直接指向首结点。

 空单向循环链表,head指向空。

 双向链表

每个结点有prior和next两个指针,分别指向直接前驱和直接后继结点

 空双向链表,只有头、尾结点。

 优点:根据待查元素在前或后半段,决定自head向后还是自tail向前。

双向循环链表

不带头、尾结点的双向循环链表

 空双向链表

双向链表

插入:将元素x插入到p指针所指结点之后。

对应代码

node *tmp = new node()  //(1)

tmp->data = x;         // (2)
tmp->prior = p;        
tmp->next =p->next;    

tmp->prior->next =tmp;  // (3)
tmp->next->prior =tmp;  // (4)

 如果新结点插入在首结点位置,操作又有不同

一元多项式

在数学上,一元多项式一般表示为如下形式:

pn(x) = p0 + p1x + p2x^2 + … + pnx^n

在计算机内实现时,可以用线性表来表示:

p = ( p0,p1,p2,…, pi …,pn),其中结点pi(0≤i≤n)表示幂为i项的系数。

一元多项式存储方法

Ø一种方法是:为了表示系数和项的对应关系。

i次幂项的系数pi存放在下标为i的数组结点中,即便pi为0,相应的数组分量也不能挪作它用。

Ø另外一种处理方法是:只存储系数不为0的项,每一项除了存储它的系数,还要存储它的幂。

   两个多项式的加法处理起来比第一种方法复杂。

   用数组时,要预估一个多项式的规模,分配足够的空间。

一元多项式的链式存储

Ø每个结点存放一元多项式中的一项的信息。信息包括该项的系数和幂,零系数项不予存储。
Ø链式存储的好处是多项式的项数可以动态地增长,不存在溢出问题。
Ø用单链表表示一元多项式。在存储实现时,按照幂由小到大的原则进行,这样该单链表便成为幂有序的单链表。
Ø链表中的结点,包含两个部分:数据部分和指针部分。
Ø数据部分又包含了系数coef和幂exp二个字段。

多项式如: 

A=7+3x+9x^8+5x^17

B=8x+22x^7-9x^8

 

两个一元多项式相加

对pa和pb所指结点,反复执行如下操作,直至其中一个单链表中的结点全部读取完毕。

Ø 幂指数相等:如果这二个结点的系数之和为零,和式中不增加项,否则按照相加后的系数、相应幂指数创建一个新结点,作为和式单链表C的末结点,pa、pb后移。
Ø 指针pa幂指数小:按pa指向的结点的系数、幂指数创建一个新结点作为单链表C的末结点,pa后移,pb不变。
Ø 指针pb幂指数小:按pb指向的结点的系数、幂指数创建一个新结点作为单链表C的末结点,pb 后移,pa不变。

 将非空多项式单链表(可能是A的单链表,也可能是B的单链表)中的剩余结点,按序逐个创建新结点插入在单链表 C 的尾部

 多项式Polynomial 及其部分基本操作的声明、定义(polynomial.h)

#ifndef POLYNOMIAL_H_INCLUDED
#define POLYNOMIAL_H_INCLUDED

#include "linklist.h"
using namespace std;
struct Type
{  int coef;  // 系数                    分开定义结点的好处
    int exp;  // 幂指数
}

template <class elemType>
struct Node
{  elemType data;
    Node* next;
};
template <class elemType>
struct Polynomial
{
    private:
        Node<elemType>* head;
        elemType stop_flag; // 用于判断多项式输入结束。
    public:
        //从用户处获取结束标志并初始化多项式
        Polynomial(const elemType &stop);
        void getPoly(); //读入一个多项式。
        void addPoly(const Polynomial &L1, const Polynomial &L2);
          // L3=L1+l2。
        void dispPloy();//显示一个多项式
        void clear();//释放多项式空间
        ~Polynomial(){clear(); delete head;};  //注意此处析构函数~Polynominal()中的写法
};
// getStop为外部函数,即非类成员函数
template <class elemType>
void getStop(elemType &stopFlag)//从用户处获取结束标志
{
    int c,e;
    cout<<"请输入系数、指数对作为结束标志,如(0,0): ";
    cin>>c>>e;
    stopFlag.coef = c;
    stopFlag.exp = e;
}
template <class elemType>
Polynomial<elemType>::Polynomial(const elemType &stop)
                                                          //初始化多项式
{   head = new Node<elemType>();
    stop_flag.coef = stop.coef;
    stop_flag.exp = stop.exp;
}
 
template <class elemType>
void Polynomial<elemType>::getPoly() //读入一个多项式
{   Node<elemType> *p, *tmp;
    elemType e;
    p=head;
    cout<<“请按照指数从小到大输入系数、指数对,” <<最后输入结束标志对结束:\n";
    cin>>e.coef>>e.exp;
 
    while (true)
    {
        if ((e.coef==stop_flag.coef)&&(e.exp==stop_flag.exp)) break;
        tmp = new Node<elemType>();
        tmp->data.coef = e.coef;
        tmp->data.exp = e.exp;
        tmp->next = NULL;
        p->next = tmp;
        p=tmp;

        cin>>e.coef>>e.exp;
    }
}
template <class elemType>
void Polynomial<elemType>::addPoly(const Polynomial &La, const Polynomial &Lb)// La+Lb
{此处省略}

多项式Polynomial相加主程序(main.cpp)

#include <iostream>
#include "polynomial.h"
using namespace std;
int main()
{
	Type stop_flag;
	getStop(stop_flag);  //读入停止标志对
	Polynomial<Type> L1(stop_flag), L2(stop_flag), L3(stop_flag);
    	L1.getPoly(); //读入第一个多项式
    	L2.getPoly(); //读入第二个多项式
    	L3.addPoly(L1,L2); //L1 = L2 +L3
   	L3.dispPloy(); //显示多项式L3的内容
	return 0;
} 

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

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

相关文章

文件操作(五)—— 文件重定向(dup2)

1、什么是文件重定向&#xff1f; 简单来说&#xff0c;文件重定向可以理解为文件描述符重新选定自己的指向。 2号文件描述符和3号文件描述符原本的指向如下。2号文件描述符之所以指向了stderr&#xff0c;是因为数组下标为2的元素填充的是stderr结构体的地址 发生文件重定向…

Spring Cloud 配置中心多环境 bootstrap.yml

常见的配置类型&#xff1a; 服务配置&#xff1a;数据库配置、缓存配置、消息队列配置 开关配置&#xff1a;功能开发、业务开关、服务开关 业务配置&#xff1a;模块A、模块B bootstrap.yml 定义系统级别参数配置; 应用于&#xff1a; Spring Cloud Config 配置中心配置&…

SpringBoot2-5

先解决一个问题【报错1】java: 无效的目标发行版: 17 修改位置&#xff1a;maven的配置需要改为选取本地maven所在目录(这些都是java指定了1.8比较低但是又都用的版本导致) 再解决一个问题【报错2】 java: 无法访问org.springframework.boot.SpringApplication 错误的类文件…

【模型部署】人脸检测模型DBFace C++ ONNXRuntime推理部署(2)

系列文章目录 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;0&#xff09; 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;1&#xff09; 【模型部署】人脸检测模型DBFace C ONNXRuntime推理部署&#xff08;2&#xff09; 文章目录…

Git小本

一、Git 概述 Git 是 Linus Torvalds 为了帮助管理 Linux内核开发的一个开源的版本控制软件。 Linux之父(Linus Torvalds)的代表作&#xff1a;Linux、Git。 1. 为什么要用Git&#xff1f; Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xf…

CRC(Cyclic Redundancy Check) 循环冗余校核

最近准备开始更新一个算法系列&#xff0c;这个系列嘛就是别管有没有用先学为敬系列&#xff08;或者现学现卖系列&#xff09;。那么这个系列的第一篇就用我这两天看的CRC算法当作开篇吧。 1&#xff09;什么是CRC呢&#xff1f; 如百度所诉&#xff0c;好像是一个十分有用的…

pandas学习笔记(1)

学习网址&#xff1a;kaggle 注&#xff1a;本文仅为个人总结&#xff0c;不作为任何学习资料 一、在pandas里有两种Core objects&#xff1a;DataFrame和Series DataFrame的使用方法&#xff1a; DataFrame有两个方向&#xff0c;纵向为index,横向为column 定义一个DataFrame的…

vue3 antd项目实战——Form表单提交和校验【v-model双向绑定input输入框、form表单数据】

vue3 ant design vue项目实战——Form表单【v-model双向绑定数据实现form表单数据的提交】上期文章回顾【UI界面渲染】场景复现&#xff08;源代码附在文章最后&#xff09;实现需求1.表单数据及其类型的定义2.表单及各部分数据的双向绑定3.表单提交功能4.校验输入内容不为空5.…

计算机组成原理实训报告(附电路图)

实训一&#xff1a;运算器组成实验 目的要求&#xff1a; 掌握FA全加器的工作原理掌握行波进位的补码加法/减法器的工作原理了解ALU运算器的工作原理 掌握FA全加器的工作原理&#xff1a; 实验步骤&#xff1a;创建一个叫做FA的电路&#xff0c;然后开始绘制。 放一个或门&a…

记一次内网渗透过程学习|天磊卫士

一、靶场说明 此靶场共有3台主机 Win7为双网卡&#xff0c;桥接为模拟外网ip&#xff08;192.168.1.220&#xff09;&#xff0c;nat&#xff08;192.168.52.142&#xff09;模拟内网域环境&#xff0c;处于DMZ区域的web服务器 Win2013为内网域控成员&#xff08;nat&#xff…

[综][PDPTW]A survey on pickup and delivery problems

相关数据集的下载:https://www.sintef.no/projectweb/top/pdptw/100-customers/ 由于Li&Lim生成测试实例的方式&#xff0c;这些实例中的任务数量不同&#xff0c;略高于标称值。 在这里&#xff0c;您可以找到Li&Lim的PDPTW基准问题的100个任务实例的实例定义和最著名…

哗啦啦疑似暴雷之后,平台老板们开始迫切寻求二清合规监管办法

&#xff08;图源百度后台&#xff0c;侵删&#xff09; 最近一则“哗啦啦资金链断裂 导致餐饮店无法提现”的帖子在餐饮人中疯传&#xff0c;引起了业内不小的轰动。据很多餐饮商户反馈&#xff0c;近一个多月以来&#xff0c;哗啦啦系统一直延期提现&#xff0c;网上舆论迅速…

微服务门神-Gateway路由

引言 书接上篇微服务门神-网关了解&#xff0c;讲完了解Gateway基本概念之后&#xff0c;本篇来看下Gateway路由实现 项目集成 还是延续之前例子&#xff1a;订单服务与商品服务 步骤1&#xff1a;创建一个 shop-gateway 的模块,导入相关依赖 <?xml version"1.0…

2022年年度总结

目录 一&#xff0c;回望我的2022 二&#xff0c;2023目标 一&#xff0c;回望我的2022 刚刚度过我迷茫的大一生活&#xff0c;我的大二生活也已经过去了一半。说实话&#xff0c;家里就我一个大学生&#xff0c;我实在是不知道怎么去面对我的大学生活&#xff0c;或者说我…

高性能web网关Openresty实践

高性能web网关之openresty一、openresty 简介二、openresty 安装三、openresty开发实践 —— content_by_lua 阶段四、openresty开发实践 —— rewrite_by_lua 阶段五、openresty开发实践 —— body_filter_by_lua 阶段六、openresty开发实践 —— 黑名单6.1、基础版6.2、进阶版…

【面试题】面试官:为什么Promise中的错误不能被try/catch?

大厂面试题分享 面试题库 前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 前言 之前我写过一篇文章&#xff0c;讨论了为什么async await中的错误可以被try catch&#xff0c;而setTimeout等api不能&#xff0c…

【pandas】教程:7-调整表格数据的布局

Pandas 调整表格的布局 本节使用的数据为 data/titanic.csv&#xff0c;链接为 pandas案例和教程所使用的数据-机器学习文档类资源-CSDN文库 导入数据 import pandas as pd titanic pd.read_csv("data/titanic.csv") titanic.head()PassengerId Survived Pclas…

传感器工作原理以及传感器种类详解

随着物联网时代的到来&#xff0c;现代信息技术快速发展&#xff0c;其中包含了计算机技术、通信技术和传感器技术等&#xff0c;计算机相当于人类的大脑&#xff0c;通信技术类似人体的神经&#xff0c;而传感器就等同于人的感觉器官。从广义上说&#xff0c;传感器就是一种能…

存储控制器

存储控制器是按照一定的时序规则对存储器的访问进行必要控制的设备&#xff0c;包括地址信号、数据信号以及各种命令信号的控制&#xff0c;使主设备(访问存储器的设备)能够根据自己的要求使用存储器上的存储资源。 存储控制器的作用主要就是进行接口的转换&#xff0c;将主设…

通信原理 | 一些常用的概念记录

这篇文章只是记录平时了解到的一些概念,并没有针对性,比较杂乱,纯粹就是当做笔记本用的,各位看官请在茶余饭后的休闲时间阅读最为合适了解到新的概念的话,会随时更新世界四大导航系统 世界上有四大卫星导航系统,它们分别是美国的GPS、俄罗斯的格洛纳斯卫星导航系统、欧盟…