当前位置: 首页 > news >正文

数据结构之线性结构

数据结构是指数据元素的集合及元素间的相互关系和构造方法。元素之间的相互关系是数据的逻辑结构,数据元素及元素之间关系的存储称为存储结构(或物理结构)。

基本的数据结构:

1. 线性表

I. 顺序存储结构

线性表的顺序存储是指用一组地址连续的存储单元一次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻,如下图所示。在这种存储方式下,元素间的逻辑关系无须占用额外的空间来存储。

 

II. 链式存储结构

线性表的链式存储是用结点来存储数据元素,基本的结点结构如下所示:

其中,数据域用于存储数据元素的值,指针域则存储当前元素的直接前驱或直接后继的位置信息,指针域中的信息称为指针(或链)。

a. 单链表

    

    单链表的结点删除

    步骤:

      (1) q = p ->link;  令临时指针q指向带删除的结点

      (2) p->link = p->link->link;  修改p所指结点的指针域为指向p所指结点的后继的后继结点,从而将元素b所在的结点从链表中删除

      (3) free(q);  释放q所指结点的空间

 

    单链表结点的插入

    步骤:

      (1)s->link= p->link;  将s所指结点的指针域指向p的后继结点

      (2)p->link = s;   将p所指结点的指针域修改为指向s所指结点

 b. 双链表(有两个指针域)

    双链表结点的删除

    步骤: 

      (1)p->front->next = p->next;

      (2)p->next->front = p->front;

      (3)free(p);

    双链表结点的插入

    步骤: 

      (1)q->front = p;

      (2)q->next = p->next;

      (3)p->next = q; 

      (4)p->next->front = q;      

 

 

顺序表与链表的比较:

 

2. 栈

  栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。栈又称为后进先出(Last In First Out, LIFO)的线性表。在栈中进行查如何删除操作的一端称为栈顶(top),另一端成为栈底(bottom)。

3. 队列

  队列市一中先进先出(First In First Out, FIFO)的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入元素的一端成为队尾(rear),允许删除元素的一端称为队头(front)。

  在顺序队列中,为了降低运算的复杂度,元素入队时至修改队尾指针,元素出队时只修改队头指针。由于顺序队列的存储空间容量是提前设定的,所以队尾指针会有一个上限值,当队尾指针达到该上限值时,就不能只通过修改队尾指针来实现新元素的入队操作了。此时,可通过整除取余运算将顺序队列假想成一个环状结构,如下图所示,称之为循环队列。

设循环队列Q的容量为M,初始时队列为空,且Q.rear和Q.front都等于0,如下图(a)所示。

  元素入队时,修改队尾指针Q.rear = (Q.rear + 1) mod M, 如下图(b)所示;

  元素出队时,修改队头指针Q.front = (Q.front + 1) mod M, 如下图(c)所示;

根据队列操作的定义,当初对操作导致队列变为空时,则有Q.rear==Q.front,如下图(d)所示;若入队队列操作导致队列满时,则Q.rear==Q.front,如下图(e)所示;

转载于:https://www.cnblogs.com/ImaY/p/4274334.html

相关文章:

  • lucene查询排序结果原理总结
  • Azure 中的多个 VM NIC 和网络虚拟设备
  • poj 1236 scc强连通分量
  • Javascript模块化编程(一):模块的写法
  • leetcode[44]Wildcard Matching
  • scanf,sscanf利用format跳过干扰的空格
  • 无线路由器之间桥接组网
  • busybox中的tftp使用
  • 庙庙湖
  • AOJ 0009 Prime Number(求素数)
  • PAT 1025 反转链表
  • Android -- 滑式抽屉SlidingDrawer(非原创)
  • 前端不为人知的一面--前端冷知识集锦
  • javascript组件——轮播图
  • hdu 5178 pairs(BC第一题,,方法不止一种,,我用lower_bound那种。。。)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Android开源项目规范总结
  • Android组件 - 收藏集 - 掘金
  • Angular 响应式表单 基础例子
  • Apache Pulsar 2.1 重磅发布
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iOS | NSProxy
  • isset在php5.6-和php7.0+的一些差异
  • java8 Stream Pipelines 浅析
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript学习总结——原型
  • js如何打印object对象
  • react-native 安卓真机环境搭建
  • SpiderData 2019年2月13日 DApp数据排行榜
  • Vue 重置组件到初始状态
  • 阿里云购买磁盘后挂载
  • 电商搜索引擎的架构设计和性能优化
  • 分布式事物理论与实践
  • 关于springcloud Gateway中的限流
  • 面试遇到的一些题
  • 目录与文件属性:编写ls
  • 批量截取pdf文件
  • 三分钟教你同步 Visual Studio Code 设置
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 自定义函数
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (42)STM32——LCD显示屏实验笔记
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (论文阅读30/100)Convolutional Pose Machines
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (算法设计与分析)第一章算法概述-习题
  • (转)项目管理杂谈-我所期望的新人
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选