数据结构是计算机存储、组织数据的方式。常见的数据结构分类方式如下图:

常用的线性结构有:线性表,栈,队列,循环队列,数组。线性表中包括顺序表、链表等,其中,栈和队列只是属于逻辑上的概念,实际中不存在,仅仅是一种思想,一种理念;线性表则是在内存中数据的一种组织、存储的方式。

  顺序表

顺序表将元素一个接一个的存入一组连续的存储单元中,在内存物理上是连续的。如下图:

顺序表存储密度较大,节省空间;但需要事先确定容量,在时间性能方面,读运算较快,时间复杂度为O(1);查找运算为O(n/2),和链表同样;插入运算和删除运算如果要操作中间一个元素,比如3,那么就需要把3后面的元素全部进行移动,因此时间复杂度相对链表要大一些,插入时间复杂度最好为O(0)或最坏为O(n);删除时间复杂度为O([n-1]/2);

  链表

链表拥有很多结点,每个结点前半部分是数据域,后半部分是指针域,指针域指针指向下一个结点;链表可分为单链表、循环链表和双链表。

单链表:

从上图可以看出,单链表的上一个结点指针指向下一个结点,最后一个结点的指针域为null。

结点的删除:

删除一个结点,如删除上图中q结点,只需将p结点中的指针域指向a3,然后将a2释放掉(free)即可。

结点的插入:

插入一个结点,如插入上图中s结点,首先将s的指针域指向a2(也就是把s的next赋值为p的next),然后将p结点的指针域指向x即可(p的next指向x)。

循环链表


循环链表与单链表唯一不同之处是,循环链表的最后一个结点指针不为空,而是指向头结点。结点的插入和删除和单链表非常相似,就不再示范了。

双链表

双链表拥有一前一后两个指针域,从两个不同的方向把链表连接起来,如此一来,从两个不同的方向形成了两条链,因此成为双链表。因此,双链表的灵活度要大于单链表。

结点的删除:

双链表的操作比单链表要稍显复杂(按照单链表思路来做其实也不难),如上图,要删除p节点,首先需要将a1的后驱指向a3,然后将a3的前驱指向a1,最后将p节点释放掉即可。

结点的插入:

如上图,插入q结点,首先要按照方向,将步骤拆分,首先将q节点的前驱指向p结点后驱,紧接着将x后驱指向a2;然后按照顺序完成图中所示的3、4步即可。(经@llhhyy1989  @voteforvip @wanghuan203 三位童鞋的指正,发现此处有误,正确插入方法可查看评论,为保留错误原文不做改动!不懂具体插入过程可移步:百度知道)

从空间性能来看,链表的存储密度要差一些,但在容量分配上更灵活一些。从时间性能来看,查找运算与顺序存储相同,插入运算和删除运算的时间复杂度为O(1),要更优于顺序存储,但读运算则弱一些,为O([n+1]/2),最好为1,最坏为n。

  栈

上面提到栈属于一个逻辑概念,栈的实现可以用顺序也可以用链式。它遵循先进后出原则,如下图:

Java中测试代码如下:

[java] view plaincopy
  1. package com.snail.test;
  2. import java.util.Stack;
  3. public class TestStack {
  4. public static void main(String[] args) {
  5. Stack<String> stack = new Stack<String>();
  6. stack.push("NO1");
  7. stack.push("NO2");
  8. stack.push("NO3");
  9. System.out.println("初始数量:" + stack.size());
  10. while(!stack.isEmpty()){
  11. System.out.println(stack.pop());
  12. }
  13. System.out.println("取完后的数量:" + stack.size());
  14. }
  15. }

输出结果顺序为:初始数量:3,NO3,NO2,NO1,取完后的数量:0。

   队列

队列遵循先进先出的原则,如下图:

Java中测试代码如下:

[java] view plaincopy
  1. package com.snail.test;
  2. /**
  3. *
  4. * @author Zang XT
  5. */
  6. import java.util.Queue;
  7. import java.util.LinkedList;
  8. public class TestQueue {
  9. public static void main(String[] args) {
  10. Queue<String> queue = new LinkedList<String>();
  11. queue.offer("NO1");
  12. queue.offer("NO2");
  13. queue.offer("NO3");
  14. System.out.println("初始数量" + queue.size());
  15. String str;
  16. while((str=queue.poll())!=null){
  17. System.out.println(str);
  18. }
  19. System.out.println("取出后数量" + queue.size());
  20. }
  21. }

运行结果顺序为:初始数量3,NO1,NO2,NO3,取出后数量0。

队列还有一种形式为循环队列,如下图:

循环队列有两个指针,头指针head和尾指针tail,尾指针一般指向的不是队尾元素实际地址,而是指向实际地址的下一个空地址,因此,循环队列一般牺牲最后一个空间,用来计算该队列是否满了,判断方式是tail+1 = head,既该队列已满。

为了尽可能的说清楚,插了大量图片,希望理解。以后有时间将继续分析树、图等数据结构。

常用数据结构--线性结构相关推荐

  1. 数据结构:线性结构和非线性结构的理解

    我们知道数据结构是计算机存储.组织数据的方式.常见的数据结构分类方式如下图: 我们这里主要说一下线性结构和非线性结构 1. 线性结构 线性结构是什么? 数据结构中线性结构指的是数据元素之间存在着&qu ...

  2. 数据结构——线性结构总结

    数据结构--线性结构总结 数据结构--线性结构总结 写在前面 线性结构的特点 线性表 栈 队列 相关的STL容器的基本操作 vector list stack queue deque 习题 线性表相关 ...

  3. 数据结构——线性结构

    简单地说,线性结构就是表中各个结点具有线性关系.如果从数据结构的语言来描述,线性结构应该包括如下几点: 1.线性结构是非空集. 2.线性结构有且仅有一个开始结点和一个终端结点. 3.线性结构所有结点都 ...

  4. java中线性结构的例子_java数据结构--线性结构

    一.数据结构 数据结构由数据和结构两部分组成,就是将数据按照一定的结构组合起来,这样不同的组合方式有不同的效率,可根据需求选择不同的结构应用在相应在场景.数据结构大致 分为两类:线性结构(如数组,链表 ...

  5. 数据结构——线性结构(线性表)

    文章目录 一. 线性结构概述 1. 线性结构(线性表的逻辑结构)的定义 2. 线性表的特点 二. 线性结构分类 1. 连续存储[顺序表] (1). 什么叫数组 (2). 顺序表算法的基本操作 (3). ...

  6. 数据结构线性结构和非线性结构

    1.线性结构 特点:1)数据元素之间存在一对一的线性关系 2)线性存储结构分为顺序存储结构和链式结构. 3)顺序表中存储元素(地址)是连续的 4)链表中存储的元素不一定是连续的 5)线性结构常见的有: ...

  7. 基本数据结构——线性结构(列表/无序表)

    1.什么是列表(List)? 一个数据项按照相对位置存放的数据集.特别的,被称为"无序表(unordered list)",其中数据项只按照存放位置来索引,如第1个.第2个-.最后 ...

  8. 基本数据结构——线性结构(有序表)

    1. 什么是有序表(OrderedList) 有序表是一种数据项依照其某可比性质(如整数大小.字母表先后)来决定在列表中的位置.越"小"的数据项越靠近列表的头,越靠"前& ...

  9. 常用数据结构:线性结构

    目录 2022最新为初学者而著! 顺序表 链表 单链表: 结点的删除: 结点的插入: 循环链表 双链表 结点的删除: 结点的插入: 栈 队列 2022最新为初学者而著! Java基础是初学者的起点,是 ...

最新文章

  1. 044_CSS33D转换
  2. asp.net C# 时间格式大全
  3. 以核心体验设计为引,深入剖析“打铁”游戏《只狼》的精妙之处
  4. Hive中JOIN的使用入门
  5. Pow(x, n)Python解法
  6. c语言字符常量和字符串常量_C语言中的字符常量
  7. windows下关于Objective-C开发环境的配置
  8. vim打开出现的文档^M什么
  9. (day06 dfs+剪枝)剑指 Offer 12. 矩阵中的路径
  10. linux中重要文件夹介绍
  11. linux修改BCD文件,关于BCDEdit 命令的使用
  12. 中国制冷剂市场供需调研与投资竞争力分析报告2022-2028年
  13. php做引流脚本,引流脚本效果极速引流脚本分享
  14. ...weights already exists, disallowed. Did you mean to set reuse=True...(解决办法)
  15. 《操作系统之哲学原理(第2版)》——— 操作系统的发展历史
  16. catalog 与 category 的区别
  17. 信号间隔是什么意思_地铁信号里的行车闭塞是啥意思?
  18. 【自然语言处理NLP】中文语料整理【情感分析、文本分类、摘要、实体分析】
  19. python如何获取一个视频的帧率_python-使用OpenCV计算视频文件中的帧数?
  20. 2022年团体程序设计天梯赛-总决赛

热门文章

  1. 第七节:框架搭建之页面静态化的剖析
  2. TUN/TAP设备浅析(一) -- 原理浅析
  3. MySQL5安装配置笔记【超详细】
  4. 【Python学习】win10+Anaconda3环境,安装phthon第三方库Jieba
  5. 【蓝桥杯官网试题 - 历届试题】发现环(dfs+并查集,或无向图tarjan判环,无向环,或拓扑排序)
  6. Coursera自动驾驶课程第18讲:The Planning Problem
  7. 计算机专业需要汇编语言,重点大学计算机专业系列教材·汇编语言程序设计
  8. html div分钟刷新一次啊代码_接口测试平台代码实现57首页重构5
  9. php ip 合法,什么是合法ip地址
  10. 使用枚举完成学生类,性别的设置。