目录
(一)线性表的介绍
(二)顺序表

(一)线性表的介绍

  • 线性表:线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
  • 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
    (1)逻辑上是线性结构,物理结构连续——顺序表;
    (2)逻辑上是线性结构,物理结构不连续——链表。

(二)顺序表

将表中元素一个接一个的存入一组连续的存储单元中,这种存储结构是顺序结构。

  • 顺序表是线性表,逻辑结构与存储位置吻合。

  • 一般采用数组存储。

  • 顺序表的分类:

静态顺序表 使用定长数组存储
动态顺序表 使用动态开辟的数组存储

注:使用动态顺序表可以自由控制内存大小,避免开辟内存不够或者开辟内存过大的问题。

  • 将表中元素依此存入数组
    i: int[] array————存在实际数据(可以理解为一座可以容纳n各人的房子)
    ii: int size————存在数据个数(可以理解为方子中实际住了多少人)

1. 头插

  • 头插:即在顺序表的第一个元素之前插入一个新的元素。
  • 思想:
    图2:

    (1)若要在第一个元素的位置插入一个新的元素,则原来所有的元素都必须后移一个位置。需后移size个元素。
    (2)为了使后移的元素不被覆盖,后移的顺序用改为:从后往前移。
    (3)确定空间下标 与 数据下标
    数据下标:可以理解为移动前元素的下标;
    空间下标:可以理解为移动以后元素的下标。

空间下标:[size,1]
数据下标:[size-1,0]

(4)array[空间下标] = array[数据下标];
数据下标=空间下标-1
(5)array[0] = 新元素;
(6)size++;

2. 尾插

  • 尾插:在顺序表得最后一个元素后面添加一个元素
  • 思想:
    图3:

    (1)顺序表中所有得元素都不需要移动,直接在最后插入一个新的元素
    (2)array[size] = 新元素;
    (3)size++

3. 从中间任何位置插入

  • 思想:
    图4:

    (1)从中间任何位置插入,也包括从头插和尾插。
    (2)明确要插入新元素的位置index,不能越界。(index>=0 && index <= size);
    (3)将index及其之后的元素全部后移一个位置;
    (4)先后移,再插入,且从后往前移动;
    (5)确定空间下标[size,index+1];
    (6)确定数据下标[size-1,index];
    (7)array[空间下标] = array[数据下标];
    数据下标=空间下标-1
    (8)array[index] = 新元素;
    (9)size++

4. 头删

  • 头删:即把顺序表中得第一个元素删除
  • 思想:
    图5:

    (1)删除第一个元素,则其后的元素就必须前移一个位置,需要移动的元素个数为size-1;
    (2)移动顺序:从前往后;
    (3)确定空间下标[0,size-2];
    (4)确定数据下标[1,size-1];
    (5)array[空间下标] = array[数据下标];
    数据下标=空间下标+1
    (6)移动完之后: this.array[–this.size] = 0。

5. 尾删

  • 尾删:即删除顺序表中的最后一个元素。
  • 思想:
    (1)其他元素都不用移动,只需要删除最后一个元素即可
    (2)this.array[–this.size] = 0;

6. 从中间任何位置删除

  • 思想:
    图6:

    (1)确定index得位置;
    (2)将该位置及之后的所有元素前移一个位置;
    (3)移动顺序:从前往后移动;
    (4)确定数据下标:[index+1,size-1];
    (5)确定空间下标:[index,size-2];
    (6)array[空间下标] = array[数据下标];
    (7)移动完之后,this.array[–this.size] = 0;

7,顺序表增删的具体代码:

(1)定义接口,接口中定义要实现的方法


/*** author:kelly_fanfan*/
interface IArrayList {//顺序表的增删查改//头插//把item插入到线性表的前面void pushFront(int item);//尾插void pushBack(int item);//从中间插入//把item插入到index下标位置处,index后的数后移void add(int item,int index);//头删//删除前面的而数据void popFront();//尾删void popBack();//删除index处的数据,index后的数据前移void remove(int index);
}

(2)用一个子类实现接口,覆写接口中的方法


/*** author:kelly_fanfan*/
public class MyArrayList implements IArrayList{private int[] array; //保存数据的空间private int size; //保存有效数据个数、MyArrayList(int capacity){this.array = new int[capacity];this.size = 0;}@Overridepublic void pushFront(int item) {ensureCapacity();for(int i = size; i >= 1;i--){this.array[i] = this.array[i-1];}this.array[0] = item;this.size++;}@Overridepublic void pushBack(int item) {ensureCapacity();this.array[this.size] = item;this.size++;}@Overridepublic void add(int item, int index) {ensureCapacity();if(index < 0  || index > this.size){throw new Error();}//i 表示空间下标for(int i = this.size; i>= index+1;i++){this.array[i] = this.array[i-1];}this.array[index] = item;this.size++;}@Overridepublic void popFront() {for(int i = 0;i <= this.size-2;i++){this.array[i] = this.array[i+1];}this.array[--this.size] = 0;}@Overridepublic void popBack() {if(this.size == 0){throw new Error();}this.array[--this.size] = 0;// this.size--;}@Overridepublic void remove(int index) {for(int i = index; i <= this.size-2;i++){this.array[i] = this.array[i+1];}this.array[--this.size] = 0;}//为了防止出现数组空间不足的情况,定义此方法用来扩容
//this.array  _——住的老房子
//this.size——房子里住的人
//什么时候应该搬家——this.size==this.array.length
//(1)先找新房子
//(2)搬家
//(3)通知新房子所在位置:this.array = 新房子的地址
//(4)退掉老房子public void ensureCapacity() {if(this.size < this.array.length){return;}//(1)找新房子,一般找原来的两倍大int capacity = this.array.length*2;int[] newArray = new int[capacity];//(2)搬家for(int i = 0;i < newArray.length;i++){newArray[i] = this.array[i];}//(3)去学校登记新房子的位置,退掉老房子this.array = newArray;}}

(3)定义测试类

package www.bit.java;/*** author:kelly_fanfan*/
public class Main {public static void main(String[] args) {MyArrayList arrayList = new MyArrayList(10);arrayList.pushBack(1);arrayList.pushBack(2);arrayList.pushBack(3);arrayList.popBack();arrayList.popBack();arrayList.popBack();arrayList.add(2,200);arrayList.add(3,30);arrayList.add(4,40);arrayList.popFront();arrayList.popBack();arrayList.remove(3);}
}

数据结构—顺序表详解相关推荐

  1. 【数据结构】顺序表详解 | 从零开始步步解读 | 画图理解并调试分析

    前言: 本章节将对顺序表的概念进行介绍,着重讲解动态顺序表.对常用的接口函数进行一个个讲解,并进行解析.顺序表讲解部分将从零实现顺序表接口函数,遇到问题我会进行一步步地调试说明,通过对本章的学习不仅能 ...

  2. 数据结构基础之动态顺序表详解

    文章目录 前言 一.动态顺序表的概念 二.顺序表的结构体 三.基本接口 1.SeqListInit(初始化数组) 2.SeqListDestory(销毁数组) 3. SeqListCheckCapac ...

  3. 【C/C++】静态顺序表详解(附完整源码)

    本章内容 1.什么是线性表 2.什么是顺序表 3.静态顺序表结构的定义 4.静态顺序表的函数接口实现 5.静态顺序表的问题及思考 1.什么是线性表 线性表(linear list)是n个具有相同特性的 ...

  4. 数据结构-广义表详解(类C语言版)

    目录 广义表的概念 定义 表头 表尾 例 广义表的性质 广义表与线性表的区别 广义表的存储结构 头尾链表的存储结构 扩展线性链表的存储结构 ​ 广义表的基本运算 例 广义表的概念 定义 广义表通常记作 ...

  5. 数据结构-链栈详解(很朴实的那种)

    链栈的设计与运行 1.链栈 提起链栈,很容易就想到单链表,不过链栈确实可以看做是受限的单链表,因为只能在链表头部进行操作,所以在链栈中也不再附加头结点,栈顶指针就是链表的头指针. 老话一句,实践一遍, ...

  6. 判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 其实这些 ...

  7. 数据结构与算法详解目录

    数据结构与算法详解是一本以实例和实践为主的图书,主要是经典的数据结构与常见算法案例,来自历年考研.软考等考题,有算法思路和完整的代码,最后提供了C语言调试技术的方法. 后续配套微课视频. 第0章  基 ...

  8. 数据结构--图(Graph)详解(四)

    数据结构–图(Graph)详解(四) 文章目录 数据结构--图(Graph)详解(四) 一.图中几个NB的算法 1.普里姆算法(Prim算法)求最小生成树 2.克鲁斯卡尔算法(Kruskal算法)求最 ...

  9. 数据结构--图(Graph)详解(二)

    数据结构–图(Graph)详解(二) 文章目录 数据结构--图(Graph)详解(二) 一.图的存储结构 1.图的顺序存储法 2.图的邻接表存储法 3.图的十字链表存储法 4.图的邻接多重表存储法 二 ...

  10. 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解

    二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解 1.二叉查找树(BST) 1.1 二叉查找树概念 1.2 二叉查找树特点 2. 平衡二叉树(AVL) 2.1 平衡二叉树概念 2.2 平衡二叉 ...

最新文章

  1. kwargs.pop是什么意思
  2. 孤儿进程与僵尸进程[总结]
  3. [转]linux awk命令详解
  4. kafka监控工具kafkaOffsetMoniter的使用
  5. baidu patchrom项目开发详细教程(Being updated)
  6. webpack配置:css文件打包、JS压缩打包和HTML文件发布
  7. java swing jdk_javax.swing
  8. 计算机文字录入培训大纲,《计算机文字录入》课程教学大纲
  9. PyTorch实战福利从入门到精通之二——Tensor
  10. 实战 | 使用Slack、Docker来打造你的运维机器人
  11. linux底层内存管理--内核空间的伙伴系统
  12. Atitit  发帖机实现(1)-----UsrQBm2008 页面上下文规范
  13. 软件测试方法和技术知识点有哪些?
  14. 试手 破解多开限制
  15. 大数据杀熟已被明令禁止!
  16. Java调用的高德api,通过经纬度查询地址信息 - 记录
  17. 计算机傅里叶什么知识美颜,傅里叶变换是用来做什么的,具体举例一下应用?...
  18. 陷阱技术探秘──动态汉化Windows技术的分析
  19. 通过Dig来学DNS
  20. javaSE探赜索隐四<数组>

热门文章

  1. 仿淘宝网站基于html网页模板设计静态网页模板参考.rar(项目源码)
  2. 什么是驻点和拐点_拐点和驻点的区别有哪些
  3. 【PANet】《Path Aggregation Network for Instance Segmentation》
  4. 求生之路CN服务器无限火力,[04.26 for DLC]教你架设更加高级的对战服务器(高级难度+BOTs)...
  5. cocos2dx 基础
  6. 小型局域网环境下搭建的文件中转系统
  7. java字符串时间去掉秒_Java:当秒和毫秒均为0时,DateTimeFormatter无法解析时间字符串吗?...
  8. 三国杀服务器维护中进不去,三国杀网页版打不开该怎么解决?
  9. android 开发按键精灵,安卓按键精灵实现后台
  10. java计算机毕业设计疫情期间医院挂号管理系统源码+数据库+lw文档+系统+部署