什么是线性表?

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(大家可以脑补一个画面,小朋友在玩“老鹰捉小鸡”的时候,后面一个人的手抓住前一个人背部的衣角,这个时候“小鸡”们的排序就像一个线性表)

注:以上,只适用于大部分的线性表,不能适用全部的线性表;

顺序存储结构的插入与删除

1.获取元素

对于线性表的顺序存储结构来说,如果我们要实现GetElem操作,即将线性表L中的第i个 位置元素值返回,其实是非常简单的。就程序而言,只要i的数值在数组下标范围内,就 是把数组第i-1下标的值返回即可。

来看代码:

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0 typedef int Status;
/* Status是函数的类型,其值是函数结果状态代 码,如OK等 */
/* 初始条件:顺序线性表L已存在,1≤i≤ ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(SqList L, int i, ElemType *e)
{ if (L.length == 0 || i < 1 || i > L.length) return ERROR; *e = L.data[i - 1]; return OK;
}//注意这里返回值类型Status是一个整型,返回OK代表1,ERROR代表0

2.插入操作:

如果我们要实现ListIn- sert(*L,i,e),即在线性表L中的第i个位置插入新元素e,应该如何操作?
插入算法的思路:
  • 如果插入位置不合理,抛出异常;
  • 如果线性表长度大于等于数组长度,则抛出异常或动态增加容量;
  • 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置;
  • 将要插入元素填入位置i处,表长加1。
/* 初始条件:顺序线性表L已存在,1≤i≤ ListLength(L), */
/* 操作结果:在L中第i个位置之前插入新的数据元 素e,L的长度加1 */Status ListInsert(SqList *L, int i, ElemType e)
{int k; /* 顺序线性表已经满 */ if (L->length == MAXSIZE)return ERROR; /* 当i不在范围内时 */ if (i < 1 || i >L->length + 1) return ERROR; /* 若插入数据位置不在表尾 */if (i <= L->length){ /*将要插入位置后数据元素向后移动一位 */ for (k = L->length - 1; k >= i - 1; k--) L->data[k + 1] = L->data[k];}/* 将新元素插入 */ L->data[i - 1] = e; L->length++; return OK; }

3.删除

思路
  • 如果删除位置不合理,抛出异常;
  • 取出删除元素;
  • 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
  • 表长减1。
/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:删除L的第i个数据元素,并用e返回 其值,L的长度减1 */Status ListDelete(SqList *L, int i, ElemType *e){int k; /* 线性表为空 */if (L->length == 0) return ERROR;/* 删除位置不正确 */ if (i < 1 || i > L->length) return ERROR;*e = L->data[i - 1];/* 如果删除不是最后位置 */if (i < L->length){ /* 将删除位置后继元素前移 */ for (k = i; k < L->length; k++)L->data[k - 1] = L->data[k];}L->length--; return OK; }
    线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1);而插入或删除时,时间复杂度都是O(n)。这就说明,它比较适合元素个数不太变化,而更多是存取数据的应用。

线性表顺序存储结构优缺点:

优点:

  • 无须为表示表中元素之间的逻辑关系而增加额外的存储空间
  • 可以快速地存取表中任一位置的元素

缺点:

  • 插入和删除操作需要移动大量元素
  • 当线性表长度变化较大时,难以确定存储空间的容量
  • 造成存储空间的“碎片”

《数据结构与算法》——线性表顺序存储结构的插入与删除相关推荐

  1. C语言数据结构线性表顺序存储结构(插入、删除、获取)

    一.代码 #include<stdio.h> #define MAXSIZE 20 /*存储空间初始分配量*/ #define OK 1 #define ERROR 0//元素数据类型,假 ...

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

    (1) 线性表的定义. 零个或多个数据元素的有限序列 序列线性表中有直接后继元素,有且仅有一个直接后继,有且仅有一个直接前驱,数据元素之间的关系是一对一的关系 常用的List操作: Operation ...

  3. 线性表顺序存储结构操作算法

    线性表顺序存储结构操作算法 ** 顺序表的初始化 线性表的插入算法 线性表的删除算法 线性表的查找算法** 根据书本的知识线性表顺序存储结构的操作算法其实是我们刚进入数据结构与算法的必修课 其实算法无 ...

  4. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  5. educoder数据结构与算法 线性表 第1关:实现一个顺序存储的线性表

    任务描述 本关任务:实现 step1/Seqlist.cpp 中的SL_InsAt.SL_DelAt和SL_DelValue三个操作函数,以实现线性表中数据的插入.删除与查找等功能. 相关知识 线性表 ...

  6. 数据结构与算法——线性表的顺序储存结构

    目录 前言 一.顺序储存的定义及储存方式 二.地址计算方法 三.顺序存储结构的插入和删除 3.1  获得元素操作 3.2   插入操作 3.3   删除操作 四.分析插入和删除操作的时间复杂度 五.线 ...

  7. 线性表的顺序存储结构(插入与删除)

    1.顺序存储定义 线性表中的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 2.地址计算方法 线性表的第i个元素是要存储在数组下标为i-1的位置. 假设占用的是c个存储单元,那 ...

  8. 第三章 线性表---顺序存储结构

    线性表(List):零个或多个数据元素的有限序列. 若将线性表记为(a1, ..., ai-1, ai , ai+1 , ..., an),则表中 ai-1 领先于ai , ai领先于ai+1,称ai ...

  9. 线性表 :: 顺序存储结构的实现

    线性表 :: 顺序存储结构的实现 说明:本文属于读书笔记.笔者将以讲述的方式表达全片文章.故文中提到的某些字词是非正式术语,只是笔者本人的理解性词语. 线性表简介:想要了解点击此处 目录 顺序存储结构 ...

最新文章

  1. numpy.hstack(a,b) 按列方向扩展 与 numpy.vstack(a,b) 按行方向扩展 其中n*1 数组可以写成 举例 np.array([[1],[2],[3]])
  2. 吴恩达:AI是时候从大数据转向「小数据」了
  3. LeetCode 257. 二叉树的所有路径 思考分析
  4. Spring boot(6)---在Eclipse中搭建Spring boot 项目
  5. 引言:扇贝 2017 服务端技术回顾
  6. i7 8750h支持linux,开启游戏本六核时代!酷睿i7-8750H处理器性能实测
  7. 分享三个免费的前端模板网站
  8. java如何验证手机号码_java如何校验国际手机号格式
  9. 光流与Lucas-Kanade 光流法
  10. PS三分钟扣图教程,并增强画质
  11. Django的多应用分布式路由
  12. yum软件包管理 yum(软件仓库)
  13. 在vmware里面免费安装纯净的xp虚拟机
  14. Unity Shader 常规光照模型代码整理
  15. 用unity实现大转盘
  16. 网络安全初学者工具安装:Kali,Windows xp虚拟机,pikachu靶场,burpsuite安装配置,phpstudy安装(学习笔记)
  17. 文件操作安全之-文件解析原理篇
  18. iOS开发——深拷贝与浅拷贝详解
  19. 每年废弃手机可提取1500公斤黄金
  20. Python使用selenium模拟滑块验证登录12306网站 实测可用

热门文章

  1. 基于校园卡消费数据的数据分析与处理
  2. 为什么Hadoop是分布式计算的未来
  3. Springboot读取.properties配置文件并取值
  4. Python使用Mechanize模块编写爬虫的要点解析
  5. 将http网站升级为https网站的方法指南
  6. html给隐藏域赋值,selenium webDriver给隐藏域赋值 input hidden set value
  7. 57次的表白,还是不及一句“我来晚了”
  8. 将句子反输java_一句话反转,说个一句话反转的故事
  9. 魔百盒CM101S-2/咪咕MG100-支持多种无线-Hi3798MV100-免拆机卡刷固件包
  10. CPU飙高和内存飙高的一般处理步骤