线性表之顺序存储结构与链式存储结构 及 应用

article/2025/9/23 7:18:36

前言

我们常用的线性表是顺序存储结构和链式存储结构表示,是最基本、最简单、也是最常用的一种数据结构;一个线性表是由n个相同特性的数据的有限序列;比如java中的数组 ,链表;所以学习这两种结构表示是非常必要的。

线性表结构特点

  • 均匀性  数据元素是不同的,对于同一线性结构的各种数据元素必定有相同的数据类型和长度
  • 有序性 各数据元素在线性表中的位置只取决于它们的序号,数据元素之前的相对位置是线性的,即存在唯一的“第一个“和“最后一个”的数据元素,除了第一个和最后一个外,其它元素前面均只有一个数据元素(直接前驱)和后面均只有一个数据元素(直接后继)。

顺序存储结构

定义

用一组地址连续的存储单元依次存储线性表的结构,它以“物理位置相邻”来表示线性表中数据元素间的逻辑关系,可随机存取表中任一元素。

  • a1是a2的前驱,ai+1是ai的后继,a1没有前驱,an没有后继,n为线性表的长度,若n==0时,则线性表为空,这个长度n也就是我们平常size的概念,每个线性表,一定会有size的概念‘
  • 这里还有个注意点,比如arraylist中实现,不要只局限于基本数据类型,可以存object类型的 ,这下面的
class ArrayList{
Student[40];
int size;
}

比如上图的结构也是顺序结构

插入与删除

插入某个元素,一定是会 将后面数据进行移动 复制, 就像  arraylist中  下面进行插入

     System.arraycopy(elementData, index, elementData, index + 1,size - index);

 

删除某个元素,也是需要 将后面元素进行复制

 

优缺点

优点:
   尾插效率高,支持随机访问。
缺点:
   中间插入或者删除效率低。
应用:
  数组
   ArrayList  

利用顺序结构的蛮力排序(蛮力法)

针对数据量少的排序方式 ,速度快;但数据量大了过后,时间会降低;

 蛮力法(brute force method,也称为穷举法或枚举法)
是一种简单直接地解决问题的方法,
常常直接基于问题的描述,
所以,蛮力法也是最容易应用的方法。
但是,用蛮力法设计的算法时间特性往往也是最低的,
典型的指数时间算法一般都是通过蛮力搜索而得到的 。(即输入资料的数量依线性成长,所花的时间将会以指数成长)

这种算法,在数据量很少的情况下,速度是最快的;也就是我们常说的冒泡法和快速排序法;

应用:数据量足够小,比如斗牛游戏的牌面排序 ;也就是 n一般小于5的情况

冒泡排序算法

第一轮进行 只要当前点大于(或者小于)下个结点,就进行交换,就能取到一个最大(最小)的结点,这样不断循环

 

实现代码

 for(int i=array.length-1;i>0;i--) {boolean flag=true;for (int j = 0; j < i; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag=false;}}if(flag){break;}}
  • 上面的代码 分为第一轮,首先 冒泡到 array.length-1
 for(int i=array.length-1;i>0;i--) {
  • 第二轮   需要在剩余的 不断交换
 for (int j = 0; j < i; j++) {
  • 这样的时间复杂度 的就是 n(n-1)/2  ,  具体就是  n ,n-1,n-2.....1  相加
  •  针对小数据量,做了个flag进行优化, 数据已经排列好时,就先退出不走后面逻辑

 

这里做的一个 花色和点数进行比较排序数据 利用对象进行排序

  • 首先做一个 cards 需要排序的 方式 利用comparable ;
public class Cards implements Comparable{public int pokerColors;//花色public int cardPoints;//点数public Cards(int pokerColors, int cardPoints) {this.pokerColors = pokerColors;this.cardPoints = cardPoints;}//提供一个方法,用来比较对象的大小@Overridepublic int compareTo(@NonNull Object o) {Cards c=(Cards)o;if(this.cardPoints>c.cardPoints){return 1;}else if(this.cardPoints<c.cardPoints){return -1;}if(this.pokerColors>c.pokerColors){return 1;}else if(this.pokerColors<c.pokerColors){return -1;}return 0;}@Overridepublic String toString() {return "Cards{" +"pokerColors=" + pokerColors +", cardPoints=" + cardPoints +'}';}}
  • 进行冒泡排序数据
  for(int i=array.length-1;i>0;i--) {boolean flag=true;for (int j = 0; j < i; j++) {if (array[j].compareTo(array[j+1])>0) {Cards temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;flag=false;}}if(flag){break;}}

  冒泡法应用场景,在数据很多已经排序完成,则使用冒泡效率是非常高的

选择排序算法

该算法是快排的基础,理解快排,一定要理解选择排序;

 第一轮进行 选择一个基准结点一般为0结点,遍历数组,一旦遇到比他小(大)进行指针下标交换,第一轮下来,就能找到最小的点的指针,然后与基准点进行交换,基准点就能找到最小的数据

具体的代码

    public static void selectSort(int[] array){for(int i=0;i<array.length-1;i++) {int index = i;for (int j = i+1; j < array.length; j++) {if (array[j] < array[index]) {index = j;}}//{1,2,5,8,3,9,4,6,7};if(index!=i) {//如果已经是最小的,就不需要交换int temp = array[index];array[index] = array[i];array[i] = temp;}}}

针对蛮力法的应用,一般是小于5的数据可以使用,如果数据量大,不使用该种算法

链表式存储结构

线性表下定义链式存储结构

种类

  • 单链表

单链表中基本单位为节点,而每个节点 分为数据域和指针域;而指针域指向的是下个节点的下标;数据域则可以代表很多东西 包括数据,还有其他属性

 针对插入和删除节点的情况

这就是单向链表的删除和添加节点的过程

单链表的应用(链式奇数排序对麻将进行排序)

解决思路

创建 对应的麻将对象

public class Mahjong {public int suit;//筒,万,索public int rank;//点数 一  二  三public Mahjong(int suit, int rank) {this.suit = suit;this.rank = rank;}@Overridepublic String toString() {return "("+this.suit+" "+this.rank+")";}
}

需要分别按花色和大小进行排序

      //先对点数进行分组LinkedList[] rankList=new LinkedList[9];for (int i=0;i<rankList.length;i++){rankList[i]=new LinkedList();}
  • 第一次处理按大小 分成9个点数分为九段链表

 //把数据一个一个的放入到对应的组中while(list.size()>0){//取一个Mahjong m=list.remove();//放到组中rankList[m.rank-1].add(m);}//把9个组合到一起for (int i = 0; i < rankList.length; i++) {list.addAll(rankList[i]);}

 

  • 第二次按花色进行拆分

//先花色数进行分组LinkedList[] suitList=new LinkedList[3];for (int i=0;i<suitList.length;i++){suitList[i]=new LinkedList();}//把数据一个一个的放入到对应的组中while(list.size()>0){//取一个Mahjong m=list.remove();//放到组中suitList[m.suit-1].add(m);}//把3个组合到一起for (int i = 0; i < suitList.length; i++) {list.addAll(suitList[i]);}

先可以按花色在按点数进行分组,都是可以的,主要是按单链表顺序排序的结构

 

  • 双链表

 

这里的查找删除,主要是可以借助于linkedlist的源码,也是双向链表的

 

/*** 在最后添加* @param e*/private void linkLast(E e) {Node<E> newNode = new Node<E>(last, e, null);Node<E> l = last;last = newNode;if (l == null) {first = newNode;}else {l.next = newNode;}size ++;}

 

/*** �在index的位置上添加一个元素* @param index* @param e*/public void add (int index, E e) {if(index < 0 || index >size) {return;}if (index == size) {linkLast(e);} else {Node<E> target = node(index);Node<E> pre = target.prev;Node<E> newNode = new Node<E>(pre, e, target);//			pre.next = newNode;
//			pre = newNode;//要考虑index=0时的情况if(pre == null) {first = newNode;} else {pre.next = newNode;}pre = newNode;size++;}}

主要注意点,在添加 删除节点时,和单链表的区别 ,要考虑 前后节点都要修改

参考分析 可以看看我的linkedlist的源码分析

Java 集合深入理解 (二) :LinkedList链表源码研究,及双向队列如何实现

  • 单向循环链表

    和单向循环链表就是,后指针指向前面个

  • 双向循环链表

而对于双向循环链表,则 指针修改的

 

总结

整个线性表的两种数据结构,各有各的应用场景,各有优缺点,主要在我们java中可以使用到,我们在应用中,各个场景下实现。

 

 


http://chatgpt.dhexx.cn/article/Dy8jcyNj.shtml

相关文章

线性表的顺序存储结构及实现

线性表的顺序存储结构定义 一、线性表的介绍 线性表是最基本、最简单、也是最常用的一种数据结构。 线性表中数据元素之间的关系是一对一的关系&#xff0c;即除了第一个和最后一个数据元素之外&#xff0c;其它数据元素都是首尾相接的(注意&#xff0c;这句话只适用大部分线…

线性表顺序存储结构图书管理

线性表顺序存储结构图书管理 一开始看书里面的线性表的顺序存储结构&#xff0c;感觉简单&#xff0c;觉得动态链表才能做出一点东西&#xff0c;但是顺序存储不仅于此&#xff0c;也能做出来。顺序结构相比链式结构&#xff0c;内容上有较大差异&#xff0c;各有难点 文章目录…

C++实现线性表的顺序存储结构

C实现线性表的顺序存储结构 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的一种&#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 线性表的特点 除第一个元素外&#xff0c;其他每一个元素有且仅有…

顺序表(详解)- C++(线性表顺序存储结构)

问题引入 在数据结构中&#xff0c;线性表是一种很重要的线性结构。线性表分为多种类型&#xff0c;常见的如顺序表、链表等&#xff0c;如果此时此刻你对“顺序表&#xff08;顺序存储&#xff09;”感到困惑&#xff0c;那就继续看下去&#xff0c;我们一步一步去剖析。 如果…

顺序存储结构的线性表

1.0. 什么是线性表&#xff1f; 所谓线性&#xff0c;即一条线&#xff0c;这条线可以是直线&#xff0c;也可以是曲线。 所谓表&#xff0c;肯定都不陌生&#xff0c;生活中有各种各样的表或者表格。我们在表格中填写各种各样的信息&#xff0c;通过表格&#xff0c;能够很好…

数据结构线性表顺序存储结构和主要算法实现

(1) 线性表的定义。 零个或多个数据元素的有限序列 序列线性表中有直接后继元素&#xff0c;有且仅有一个直接后继&#xff0c;有且仅有一个直接前驱&#xff0c;数据元素之间的关系是一对一的关系 常用的List操作&#xff1a; Operation InitList&#xff08;*L&#xf…

线性表顺序存储结构

1.什么是线性表? 线性表可以看作一条链子除了第一个元素和最后一个元素&#xff0c;其他每个元素都有一个前驱 元素和一个后继元素有且只有一个。 若一个元素都没有&#xff0c;则称为空表。 元素之间的关系是一一对应的关系。(就比如a2的前驱元素只有一个并且一定是a1&#…

线性表的顺序存储结构

线性表的基本概念 线性结构习惯称为线性表&#xff0c;线性表是n(n>0)个数据元素构成的有限序列&#xff0c;表中除第一个元素外的每一个元素&#xff0c;有且只有一个一个前件&#xff1b;除最后一个元素外&#xff0c;有且只有一个后件。 非空数据表具有&#xff1a; 只…

【数据结构】线性表的顺序存储结构及实现——C语言版

文章目录 顺序表1. 顺序表的存储结构定义2. 顺序表的实现2.1 初始化顺序表2.2 建立顺序表2.3 销毁顺序表2.4 判空操作2.5 求顺序表的长度2.6 遍历操作2.7 按值查找2.8 按位查找2.9 插入操作2.10 删除操作 3. 顺序表的使用4. 暖暖树洞 顺序表 线性表的顺序存储结构称为顺序表&a…

VUE activated,deactivated使用

项目中keepalive用得不多&#xff0c;记录一下以免遗忘。 页面第一次进入&#xff0c;钩子的触发顺序created-> mounted-> activated&#xff0c;退出时触发deactivated。当再次进入&#xff08;前进或者后退&#xff09;时&#xff0c;只触发activated。 事件挂载的方…

vue activated,deactivated生命周期的使用

1.当组件在 内被切换&#xff0c;它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。 2.activated()&#xff1a;在vue对象存活的情况下&#xff0c;进入当前存在activated()函数的页面时&#xff0c;一进入页面就触发&#xff1b;可用于初始化页面数据等…

vue 中 keep-alive,activated,deactivated

keep-alive 在组件反复切换时&#xff0c;会反复渲染&#xff0c;造成性能问题。用一个 <keep-alive></keep-alive> 标签将他包裹起来&#xff0c;组件会在第一次被创建的时候缓存下来。避免性能问题。 首先准备好组件&#xff0c;配置好路由。准备了Home,Keep,Abo…

【Vue】学习笔记-Vue Router activated deactivated 路由守卫

Vue Router activated deactivated 路由守卫 activated deactivated路由守卫1.全局守卫2.独享守卫3.组件内守卫全局路由守卫路由器的两种工作模式 activated deactivated activated 和 deactivated 是路由组件所独有的两个钩子&#xff0c;用于捕获路由组件的激活状态 具体使用…

vue 生命周期图 + activated + deactivated

一、vue 生命周期图 From the network 二、activated deactivated 除此之外&#xff0c;简单介绍一下在被keep-alive包含的组件/路由中&#xff0c;会多出两个生命周期的钩子:activated 与 deactivated。在 2.2.0 及其更高版本中&#xff0c;activated 和 deactivated 将会…

[Vue]缓存路由组件 activated()与deactivated()

前言 系列文章目录&#xff1a; [Vue]目录 老师的课件笔记&#xff0c;不含视频 https://www.aliyundrive.com/s/B8sDe5u56BU 笔记在线版&#xff1a; https://note.youdao.com/s/5vP46EPC 视频&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 文章目录 前言1. 缓存…

Vue 钩子函数activated未触发

activated()和deactivated()只有在<keep-alive></keep-alive>包裹的时候才有效&#xff1b;

搞明白activated和deactivated

文章目录 写到前面什么是activatedactivated解决了一个什么问题Demomain.vueassembly1(组件1)assembly2(组件2) 执行结果要点速记个人建议写到最后 写到前面 今天简单的将activated讲一下&#xff0c;前面有人问了&#xff0c;既然有问的&#xff0c;说明还有人不是很明白的&am…

vue中activated

keep-alive <keep-alive>包裹动态组件的时候&#xff0c;会缓存不活动的组件实例&#xff0c;而不是摧毁他们。其是一个抽象的组件&#xff0c;自身不会渲染一个DOM元素&#xff0c;也不会出现在父组件链中。 说白了被<keep-alive>包裹的组件其会被缓存。 没有被…

Vue学习之---动态组件中的activated与deactivated钩子函数

Vue学习之—动态组件中的activated与deactivated钩子函数 在学习这两个钩子函数之前呢&#xff0c;怎么需要先了解下Vue内置的动态组件< component >以及与之相配套的< keep-alive > 组件&#xff1a; 动态组件指的是动态切换组件的显示与隐藏&#xff1b; < …

vue中keep-alive、activated的探讨和使用

在修改公司的一个项目的时候发现了activated这个东西&#xff0c;一直觉得很疑惑&#xff0c;之前也没怎么用过啊&#xff01;官网的生命周期那也没说过这东西啊&#xff01;生命周期不就create mount update 和destory这几个东东么&#xff0c;怎么多了个activate出来。 百思不…