IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 线性表的应用 —— 顺序表 -> 正文阅读

[数据结构与算法]线性表的应用 —— 顺序表

线性表的应用 —— 顺序表

【线性表】

线性表是由n (n ≥0)个相同类型的数据元素组成的有限序列,它是最基本、最常用的一种线性结构。顾名思义,线性表就像是一条线,不会分叉。线性表有唯一的开始和结束,除了第1个元素,每个元素都有唯一的直接前驱;除了最后一个元素,每个元素都有唯一的直接后继。

在这里插入图片描述

线性表有两种存储方式:顺序存储和链式存储。
采用顺序存储的线性表被称为顺序表,采用链式存储的线性表被称为链表。

【顺序表】

顺序表是顺序存储方式,即逻辑上相邻的数据在计算机内的存储位置也是相邻的。在顺序存储方式中,元素存储是连续的,中间不允许有空,可以快速定位某个元素,所以插入、删除时需要移动大量元素。
根据分配空间方法的不同,顺序表可以分为静态分配动态分配两种。

【静态分配】

在顺序表中,最简单的方法是使用一个定长数组data[]存储数据,最大空间为Maxsize,用length记录实际的元素个数,即顺序表的长度。这种用定长数组存储的方法被称为静态分配。

在这里插入图片描述

当采用静态分配的方法时,定长数组需要预先分配一段固定大小的连续空间,但是在运算过程中进行合并、插入等操作容易超过预分配的空间长度,并出现溢出。
可以采用动态分配的方法解决溢出问题。

【动态分配】

在这里插入图片描述

在程序运行过程中,根据需要动态分配一段连续的空间(大小为Maxsize),用elem记录该空间的基地址(首地址),用length记录实际的元素个数,即顺序表的长度。

采用动态分配方法时,在运算过程中如果发生溢出,则可以另外开辟一块更大的存储空间,用来替换原来的存储空间,从而达到扩充存储空间的目的。

在这里插入图片描述

顺序表的动态分配结构体定义:

在这里插入图片描述

【插入】

在顺序表中的第i 个位置之前插入一个元素e ,需要从最后一个元素开始,后移一位……直到把第i 个元素也后移一位,然后把e 放入第i 个位置

在这里插入图片描述

算法步骤:

  1. 判断插入位置i 是否合法(1 ≤ i ≤ L.length + 1),可以在第1个元素之前插入,也可以在第L.length + 1 个元素之前插入。
  2. 判断顺序表的存储空间是否已满。
  3. 将第L.length 至 第 i 个元素依次向后移动一个位置,空出第 i 个位置
  4. 将要插入的新元素 e 放入 第 i 个位置
  5. 顺序表长度 + 1,插入成功后返回 true。

[举个栗子]

在顺序表中的第5个位置之前插入一个元素9。

在这里插入图片描述

移动元素。从最后一个元素(下标:L.length - 1)开始后移 一位,移动过程:

在这里插入图片描述

插入元素。这个时候第 5 个位置就空出来了,将要插入的元素 9 放入第 5 个位置,表长 + 1。

在这里插入图片描述

[算法代码]

bool ListInsert_Sq(SqList &L , int i , int e){
	if(i < 1 || i > L.length + 1){
		return false; //i 值不合法
	}
	if(L.length == Maxsize){
		return false; //存储空间已满
	}
	for(int j = L.length - 1; j >= i - 1; j--){
		L.elem[j + 1] = L.elem[j]; // 从最后一个元素开始后移,直到第i个元素后移
	}
	L.elem[i - 1] = e; // 将新元素e 放入第 i 个位置
	L.length ++ ;// 表长 + 1
	return true; // 插入成功
}

[算法分析]

假设每个位置插入的概率均等,则顺序表中插入元素算法的平均时间复杂度为O (n)。

【删除】

在顺序表中删除第i 个元素时,需要把该元素暂存到变量e 中,然后从第i +1个元素开始前移……直到把第n 个元素也前移一位,即可完成删除操作。

[算法步骤]

  1. 判断删除位置 i 是否合法(1 ≤ i ≤ L.length)
  2. 将欲删除的元素保留在 e 中。
  3. 将第 i + 1 至 第 n 个元素依次向前移动一个位置。
  4. 表长 - 1,若删除成功 则返回 true。

在这里插入图片描述

[举个栗子:从顺序表中删除第5个元素]

在这里插入图片描述

移动元素。首先将待删除元素2暂存到变量e 中,以后可能有用,如果不暂存,则将被覆盖。然后从第6个元素开始前移一位。

在这里插入图片描述

表长 - 1。

在这里插入图片描述

[算法代码]

bool ListDelete_Sq(SqList &L , int i ,int &e){
	if(i < 1 || i > L.length){
		return false;   // i 值不合法
	}
	e = L.elem[i - 1];  //将欲删除的元素保留在e中
	for(int j = 1; j <= L.length - 1; j++){
		L.elem[j - 1] = L.elem[j];  //被删除元素之后的元素前移
	}
	L.length --;  //表长 - 1
	return true;
}

[算法分析]

假设每个元素删除的概率均等,则顺序表中删除元素算法的平均时间复杂度为O (n)。

【顺序表的优缺点】

  • 优点
    操作简单,存储密度高,可以随机存取,只需O(1)的时间就可以取出第i 个元素。
  • 缺点
    需要预先分配最大空间,最大空间数估计过大或过小都会造成空间浪费或溢出。进行插入和删除操作时需要移动大量元素。
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:43:26  更:2022-09-13 11:47:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 21:12:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码