七、线性表的链式存储结构

1、问题引入

开发数组类模板的原因在于:在创建基于顺序存储结构的线性表时,发现这样的线性表可能被误用,因为重载了数组访问操作符,使用时跟数组类似,但是线性表和数组有很大的区别,所以激发了新的需求:开发数组类替换C++原生数组类,因为原生数组类也存在着很大缺陷,使用不方便。

基于顺序存储结构的线性表的另一个缺点:插入或删除元素时,涉及到大量数据元素的移动,对于效率的影响非常大

一个新的需求:在插入或删除元素时不需要大量移动数据元素的一种数据结构,即基于链式存储结构的线性表

2、链式结构的定义

为了表示每个数据元素于其直接后继元素之间的逻辑关系;数据元素除了存储本身的信息外,还需要存储其直接后继的信息。

1372866-20180817222745037-1071623465.png

\(a_i\)\(a_{i+1}\)是线性表中的两个相邻数据元素,在物理内存中无相邻关系。

一个数据元素包含了两部分:\(a_i\)是数据元素本身的数据信息,还有一个地址信息,地址是第\(i\)个元素的直接后继,即第\(i+1\)个的元素在内存中的地址信息。换句话说就是如果找到了第\(i\)个元素,不仅可以得到第\(i\)个元素的本身的值之外,还可以得到第\(i+1\)个元素在内存中的位置

3、链式存储逻辑结构

基于链式存储结构的线性表中,每个结点都包含数据域和指针域

  • 数据域:存储数据元素本身
  • 指针域:存储相邻结点的地址

1372866-20180817222801707-1986803877.png

两种线性表名称统一:

  • 顺序表:基于顺序存储结构的线性表
  • 链表:基于链式存储结构的线性表
    • 单链表:每个结点只包含直接后继的地址信息
    • 循环链表:单链表的最后一个结点的直接后继为第一个结点
    • 双向链表:单链表中的结点包含直接前驱和后继的地址信息
    • 双向循环链表......

4、链表中的基本概念

  • 头结点:链表中的辅助结点,包含指向第一个数据元素的指针;不包含任何数据信息,是为了简化代码进行辅助
  • 数据结点:链表中代表数据元素的结点,表现形式为:(数据元素,地址)
  • 尾结点:链表中的最后一个数据结点。单独放出的原因:尾结点包含的地址信息直接决定了链表的性质,地址信息为空,就是单链表;地址为第0个元素的地址信息,就是循环链表;地址信息为随机值,就是一个非法链表

5、单链表

5.1 单链表中的结点定义

// 用struct定义类,默认属性是public
// T是泛指类型,链表可以存储各种类型的数据
struct Node : public Object
{T value;Node* next; // 指向后继结点的指针
}

5.2 单链表的内部结构

1372866-20180817222810908-1837731497.png

头结点在单链表中的意义是:辅助数据元素的定位,方便插入和删除操作,因此,头结点不存储实际的数据元素。

5.3 在目标位置处插入数据元素

  1. 从头结点开始,通过current指针定位到目标位置

  2. 从堆空间申请新的Node结点

  3. 执行操作

    node->value = e;
    node->next = current->next;
    current->next - node;

5.4 在目标位置删除数据元素

  1. 从头结点开始,通过previous指针定位到目标位置的前一个地址

  2. 使用toDel指针指向需要删除的结点

  3. 执行操作:

    toDel = previous->next;
    previous->next = toDel->next;
    delete toDel;

6、小结

链表中的数据元素在物理内存中无相邻关系

链表中的结点都包含数据域和指针域

头结点用于辅助数据元素定位,方便插入和删除操作

插入和删除操作需要保证链表的完整性

转载于:https://www.cnblogs.com/chenke1731/p/9495573.html

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

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

相关文章

工作333:uni-增加添加成功提示

this.$u.api.getPartyAdd(this.form).then(res > {console.log(res)if(res.data.code200){/* uni.showLoading({title: 添加中}); */this.$refs.uToast.show({title: res.data.message,type: success,})setTimeout(function () {uni.navigateTo({url: "../notice_notic…

HDU 6064 RXD and numbers

传送门 有向图生成树计数 (度数 ->入度->外向树) BEST定理 (不定起点的欧拉回路个数某点为根的外向树个数(存在欧拉回路->每个点为根的外向树个数相等)*(每个点的度数(存在欧拉回路-&g…

vue.js框架的生命周期:常用钩子函数

//组件实例化之前执行的函数 beforeCreate:function () { alert("组件实例化之前执行的函数") }, //组件实例化完毕执行的函数 created:function () { alert("组件实例化完毕执行的函数") }, //组件挂载前,页面仍未展示,但虚拟Dom已…

工作334:uni-控制整个label区域可选

<navigator url"../LevineHua-editor/LevineHua-editor" class"single"><u-form-item label"内容" label-width"100%" prop"content" class"label-left"><u-input placeholder"请输入公告内容…

零基础Python知识点回顾(一)

如果你是小白&#xff0c;建议只要安装官网的python-3.7.0-amd64.exe 然后在电脑cmd命令提示符 输入检查是否已经安装pip,一般安装了python都会有的。 >pip (有的话会提示一大串说明&#xff0c;没有的话会提示没有) 假设有了pip&#xff0c;下面来用pip 来安装…

工作335:uni-增加表单验证

<u-form-item prop"account"><u-input v-model"form.account" placeholder"请输入账号"></u-input></u-form-item><u-form-item prop"password"><u-input class"inp" v-model"form.p…

使用IDEA 创建SpringBoot项目

首先File ->New -> project ->Spring Initializr ->next 如果没有Spring Initializr 选择右下角config ->setting 搜索Springboot 勾选 然后apply ok 第二步&#xff1a; 在项目中写上自己需要的名称 type 选择 maven project ->next 第三步&#xff1a;…

工作335:uni-ele-el-date-picker限制选择时间

<el-form-item :label"index 1 .发布时间"><el-date-picker v-model"task.start_time" :picker-options"pickerOptions" :disabled"viewMode"/></el-form-item>pickerOptions: {disabledDate(time) {return time…

PhantomJS 一个隐形的浏览器

下载地址: http://phantomjs.org/download.html 使用方法: 下载压缩包解压出来找到phantomjs.exe 放到python的根目录下 转载于:https://www.cnblogs.com/kaibindirver/p/9509684.html

线段树、树状数组

A 树状数组:1 #include<iostream>2 #include<cstdio>3 #include<algorithm>4 #include <string.h>5 using namespace std;6 // 1h / 10min7 const int maxn 32001;8 int c[maxn],ans[maxn]; // c[i] : 以i为横坐标的星星左侧和下侧星星的个数&#xf…

json-server的使用

这里跳过node安装以及npm安装 先全局安装&#xff1a;npm install json-server -g在桌面创建一个空的文件夹JSONSERVERcd 进入到这个文件夹执行npm init --yes&#xff0c;这时候文件夹会多出一个package.json的文件项目再安装一次&#xff1a;npm install json-server --sav…

Eclipse 使用 CodeMix 插件 开发 Vue.js

前言&#xff1a;对比vscode&#xff0c; codemix集成在eclipse插件里面&#xff0c;符合使用习惯 1、下载并安装node.js 官网地址&#xff1a; https://nodejs.org/en/ &#xff0c; 当前版本是 node-v8.11.4-x64.msi&#xff0c; 安装过程直接默认选项即可。 安装完成后&…

开发模式下浏览器不支持ES6

在工程项目下安装babel: cnpm install babel-preset-stage-2 --sava-dev 然后在工程项目下找到.babelrc文件打开并在这个位置添加这个参数&#xff0c;如下图 最后&#xff0c;cnpm run dev重启一下项目即可

vue项目打包成APP

点击查看转载源 事先准备&#xff0c;开发完成的web app项目&#xff08;也可以利用vue-cli脚手架构建vue模板项目&#xff09;&#xff0c;npm run dev可以正常预览的项目 1&#xff0c;将项目目录下config文件内index.js中assetsPublicPath修改为 assetsPublicPath: ./ 2&…

vue开发小程序Demo

1-准备 电脑安装好node.js环境&#xff0c;安装好npm&#xff0c;安装好微信web开发者工具&#xff0c;选择一款你喜欢的编辑器&#xff0c;我用的是WebStorm 2-打开webStorm&#xff0c;新建一个项目空间然后在终端执行以下命令&#xff0c;我这里是Windows下的WebStorm自带…

认识 react 的钩子函数

钩子函数运行总览&#xff1a; react基本的钩子函数&#xff08;蓝色为持续运行的钩子函数&#xff09; 执行顺序 和组件相关的几个重要钩子函数

小程序自带git方法提交时文件冲突的解决

此方式适合不太懂操作git的朋友。 小程序自带的git版本管理如图 git提交代码的正常流程&#xff1a; 先 commit&#xff08;提交&#xff09; 再pull&#xff08;拉取&#xff09;最后push&#xff08;推送&#xff09; 冲突一定是出现在pull&#xff08;拉取&#xff09;后…

appium学习记录1

xpath定位: 语法 driver.find_element_by_xpath("//android.widget.EditText[index"登陆"/../preceding-sibling::*[index4]") 语法解释 //android.widget.EditText 表示匹配在文档流匹配android.widget.EditText 其中向服务器发送index"登陆的属性 …

油田 (Oil Deposits UVA - 572)

题目描述&#xff1a; 原题&#xff1a;https://vjudge.net/problem/UVA-572 题目思路&#xff1a; 1.图的DFS遍历 2.二重循环找到相邻的八个格子 AC代码&#xff1a; 1 #include <iostream>2 #include <cstring> 3 using namespace std;4 5 const int maxn 105 ;…

hadoop 常用hdfs命令

转载于:https://www.cnblogs.com/mahailuo/p/9542654.html