【软考设计师】S01 数据结构 E01 线性结构 P01 线性表

news2024/11/17 10:43:57

线性表

  • 前言——线性结构
  • 线性表
    • 线性表的定义
    • 线性表的特点
    • 线性表的存储结构
      • 顺序存储
      • 链式存储
        • 单链表
        • 双向链表
        • 循环链表
        • 静态链表


前言——线性结构

线性结构是一种基本的数据结构,主要用于对客观世界中具有单一前驱和后继的数据关系进行描述。线性结构的特点是数据元素之间呈现一种线性关系,即元素“一个接一个排列”。


线性表

线性表的定义

  • 线性结构: 线性表是最简单、最基本也是最常用的一种线性结构;
  • 存储结构: 顺序存储、链式存储;

在这里插入图片描述

  • 基本操作: 插入、删除和查找;

线性表的特点

线性表可为空。非空线性表的特点如下:

  1. 存在唯一一个称为“第一个”的元素;
  2. 存在唯一一个称为“最后一个”的元素;
  3. 除第一个元素外,每个元素都有且只有一个直接前驱
  4. 除最后一个元素外,每个元素都有且只有一个直接后继

线性表的存储结构

线性表的存储结构分为顺序存储链式存储

在这里插入图片描述

顺序存储

基础概念:

  1. 精辟: 用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻
  2. 公式: L O C ( a 1 ) LOC(a_1) LOC(a1) 表示线性表中第一个元素的存储位置,在顺序存储结构中,第 i i i 个元素 a i a_i ai 的存储位置为: L O C ( a i ) = L O C ( a 1 ) + ( i − 1 ) ∗ L LOC(a_i) = LOC(a_1) + (i-1) * L LOC(ai)=LOC(a1)+(i1)L 其中 L L L 表示每个数据元素所占空间的字节数。
  3. 优点: 可以随机存取表中的元素:根据上述的公式,我们可以根据计算关系得知表中任一个元素的位置。
  4. 缺点: 插入和删除操作需要移动元素:在插入前要移动元素以挪出空的存储单元,然后再插入元素;删除时同样需要移动元素,以填充被删除元素空出来的存储单元。

基本操作:

  1. 插入: 在表长为 n n n 的线性表中插入新元素时,共有 n + 1 n+1 n+1 个插入位置。在位置 1 1 1 插入新元素,表中原有 n n n 个元素都需要移动;在位置 n + 1 n+1 n+1 插入新元素时,不需要移动任何元素。因此等概率下,插入一个新元素需要移动的元素个数期望 E i n s e r t E_{insert} Einsert 为: E i n s e r t = ∑ i = 1 n + 1 P i ∗ ( n − i + 1 ) = 1 n + 1 ∑ i = 1 n + 1 ( n − i + 1 ) = n 2 E_{insert} = \sum ^{n+1} _{i=1} P_i *(n-i+1) = \frac 1 {n+1} \sum ^{n+1} _{i=1} (n-i+1) = \frac n 2 Einsert=i=1n+1Pini+1=n+11i=1n+1(ni+1)=2n 其中 P i P_i Pi 表示在表中的位置 i i i 插入新元素的概率。
  2. 删除: 在表长为 n n n 的线性表中删除元素时,共有 n n n 个可删除的元素。删除元素 a 1 a_1 a1 时需要移动 n − 1 n-1 n1 个元素;删除元素 a n a_n an 时不需要移动元素。因此等概率下,删除一个元素需要移动的元素个数期望 E d e l e t e E_{delete} Edelete 为: E d e l e t e = ∑ i = 1 n q i ∗ ( n − i ) = 1 n ∑ i − 1 n ( n − i ) = n − 1 2 E_{delete} = \sum ^{n} _{i=1} q_i*(n-i)=\frac 1 n \sum ^{n} _{i-1} (n-i) = \frac {n-1} 2 Edelete=i=1nqi(ni)=n1i1n(ni)=2n1 其中 q i q_i qi 表示删除第 i i i 个元素(即 a i a_i ai)的概率。

链式存储

在这里插入图片描述

线性表的链式存储是通过指针链接起来的结点来存储数据元素,基本结点结构为:

在这里插入图片描述

其中数据域用于存储数据元素的值指针域用于存储当前元素的直接前驱直接后继位置信息。指针域中的信息称为指针(或链)。

单链表

因为链式存储存储各元素的结点的地址并不要求是连续的,因此存储数据元素的同时必须存储元素之间的逻辑关系。结点与结点之间通过指针域构成一个链表,若节点中只有一个指针域,则称为单链表(或称线性链表)。

在这里插入图片描述

假设单链表中的元素是整型,则单链表结构类型的定义为:

typedef struct node{
	int data;				/*结点的数据域,假设为整型*/
	struct node *next;		/*结点的指针域*/
}NODE, *LinkList

在链式存储结构中,只需要一个指针(称为头指针,上图中 head)指向第一个结点,就可以顺序地访问到表中的任意一个元素。

在链式存储结构下,进行插入和删除元素,其实实质上都是对相关指针的修改。

在这里插入图片描述

插入:

在单链表中,若在 p p p 所指结点后插入新结点 s s s,基本步骤如下:

s->next = p->next;
p->next = s;

我们先将 p p p 所指结点的后继结点指针赋给 s s s 所指结点的指针域,然后将 p p p 所指结点的指针域修改为 s s s 所指结点。

删除:

在单链表中,删除 p p p 所指结点的后继结点时,步骤如下:

q = p->next;
p->next = p->next->next;
free(q)

我们先令临时指针 q q q 指向待删除的结点,然后修改 p p p 所指结点的指针域为指向 p p p 所指向结点的后继的后继结点,从而将元素所在结点从链表中删除,最后释放 q q q 所指结点的空间。

头结点:

在实际应用中,为了简化对链表状态的判定和处理,特别引入一个不存储数据元素的结点,称为头结点,将其作为链表的第一个结点并令头指针指向该结点。

单链表的操作(查找、插入、删除)
单链表的查找操作:

LinkList Find_List(LinkList L, int k)	/*L为带头结点单链表的头指针*/
/*在表中查找第k个元素,若找到,返回该元素结点的指针;否则,返回空指针NULL*/
{
	LinkList p; int i;
	i = 1; p = L->next;		/*初始时,令p指向第一个元素结点,i为计数器*/
	while(p && i<k) {		/*顺指针链向后查找,直到p指向第k个元素结点或p为空指针*/
		p = p->next; i++;
	}
	if(p && i==k) return p;	/*存在第k个元素且指针p指向该元素结点*/
	return NULL
} /*Find_List*/

单链表的插入操作:

int Insert_List(LinkList L, int k, int newElem)	/*L为带头结点单链表的头指针*/
/*将元素newElem插入表中的第k个元素之前,若成功则返回0,否则返回-1*/
/*该插入操作等同于将元素newElem插入在第k-1个元素之后*/
{
	LinkList p,s;		/*p,s为临时指针*/
	if(k == 1) p = L;	/*元素newElem要插入到第1个元素之前*/
	else p = Find_List(L, k-1)		/*查找表中的第k-1个元素并令p指向该元素结点*/
	if(!p) return -1;				/*表中不存在第k-1个元素,不满足运算要求*/
	s = (NODE *)malloc(sizeof(NODE));	/*创建新元素的结点空间*/
	if(!s) return -1;
	s->data = newElem;
	s->next = p->next; p->next = s;	/*将元素newElem插入到第k-1个元素之后*/
	return 0;
} /*Insert_List*/

单链表的删除操作:

int Delete_List(LinkList L, int k)	/*L为带头结点的单链表的头指针*/
/*删除表中的第k个元素结点,若成功则返回0,否则返回-1*/
/*删除第k个元素相当于令第k-1个元素结点的指针域指向第k+1个元素所在结点*/
{
	LinkList p,q;		/*p,q为临时指针*/
	if(k == 1) p = L;	/*删除的是第一个元素结点*/
	else p = Find_List(L, k-1);		/*查找表中的第k-1个元素并令p指向该元素结点*/
	if(!p||!p->next) return -1;		/*表中不存在第k个元素*/
	q = p->next;					/*令q指向第k个元素结点*/
	p->next = q->next;	free(q);	/*删除结点*/
	return 0;
} /*Delete_List*/

所以综上,当线性表采用链表作为存储结构时,我们不能对数据元素进行随机访问,但是具有插入和删除操作不需要移动元素的优点。

双向链表

每个结点包含两个指针,分别指向当前元素的直接前驱和直接后继。其特点是可以从表中任意的结点出发,从两个方向上遍历链表。

若双向链表中结点的 front 和 next 指针域分别指示当前结点的直接前驱和直接后继,则在双向链表中插入结点的操作过程表示为:

s->front = p->front;
p->front->next = s;
s->next = p;
p->front = s;

在这里插入图片描述

在双向链表中删除结点的操作过程表示为:

p->front->next = p->next;
p->next->front = p->front;
free(p);
循环链表

在单向链表(或双向链表)的基础上令表尾结点的指针指向链表的第一个结点,构成循环链表。其特点是可以从表中任意结点开始遍历整个链表。

静态链表

借助数组来描述线性表的链式存储结构,用数组元素的下标表示元素所在结点的指针。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1073230.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漏刻有时数据可视化Echarts组件开发(43)水球图svg温度计动画

SVG是一种用XML定义的语言&#xff0c;用来描述二维矢量及矢量/栅格图形。具体来说&#xff0c;SVG图形是可伸缩的矢量图形&#xff0c;其图像质量不会因放大或改变尺寸而损失。 在SVG中&#xff0c;可以创建和修改图像、对图像进行搜索和索引、对其进行脚本化或压缩。此外&am…

【网络安全入门】学习网络安全必须知道的100 个网络基础知识

前言 话不多说&#xff0c;完整的资料已经上传至CSDN官方&#xff0c;需要的可以点击链接自取【282G】网络安全&黑客技术零基础到进阶全套学习大礼包&#xff0c;免费分享&#xff01; 1 什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备…

Zabbix“专家坐诊”第206期问答汇总

问题一 Q&#xff1a;老师&#xff0c;我想配置一下监控项和触发器&#xff0c;目前我想要三个&#xff0c;内存的使用情况百分比、磁盘的剩余多少G、CPU的使用情况百分比&#xff0c;用自带的模板修改&#xff0c;该怎么做&#xff1f; A&#xff1a;可以用100减去内置键值cp…

ICCV 2023 | 当尺度感知调制遇上Transformer,会碰撞出怎样的火花?

作者 &#xff5c; AFzzz 1 文章介绍 近年来&#xff0c;基于Transformer和CNN的视觉基础模型取得巨大成功。有许多研究进一步地将Transformer结构与CNN架构结合&#xff0c;设计出了更为高效的hybrid CNN-Transformer Network&#xff0c;但它们的精度仍然不尽如意。本文介绍…

java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

基于ssm的少儿编程网上报名系统+vue【附PPT|万字文档(LW)和搭建文档】

主要功能 前台登录&#xff1a; 注册用户&#xff1a;用户名、密码、姓名、联系电话 用户&#xff1a; ①首页、课程信息推荐、课程资讯、查看更多 ②课程详情、点我收藏、购买、评论、留言反馈 ③个人中心、修改用户名、密码、姓名、性别、头像、手机号、我的收藏等 后台登录…

Pycharm调试时,到达断点后,一直connected

Pycharm调试时&#xff0c;到达断点后&#xff0c;一直connected&#xff0c;画了一上午时间&#xff0c;最后发现是因为我dataloader使用的是多进程&#xff0c; 选中Gevent兼容后解决。

九方云学堂学员告诉你学习可以掌握哪些内容

在当前的股票市场环境下,存在许多不确定性因素和风险。虽然不少新兴行业的诞生,为投资者带来了更多的投资机会,但是风险同样会与日俱增。在这种情况下,作为一名投资者,想要在不断变化的市场环境中,提高投资胜率,做到复利,完整、科学的投资策略,成为了越来越多投资者关注的焦点。…

软信天成:物料主数据的标准管理

在制造企业加工生产的过程中&#xff0c;物料管理尤为重要。严格的原料管控将直接影响产品的品质、工作效率以及制造成本。相较于其他主数据&#xff0c;物料主数据是一种最复杂、数据量最大也是最关键的主数据&#xff0c;其准确性和规范程度将直接决定系统是否顺畅运行。 因此…

Python教程:方法重载

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 方法重载 方法重载在Python中起着关键作用。 方法有时接受零参数&#xff0c;有时接受一个或多个参数。 当我们以不同的方式调用同一个方法时&#xff0c;这就被称为方法…

Windows mysql 5.7 msi版、mysql 8.0 msi版下载、安装教程,附详细图文

大家好&#xff0c;今天为大家带来的是 mysql 5.7 msi &#xff0c; MySql 8.0 版本的下载、安装教程&#xff0c;附详细图文。本文以 5.7 版本为例子&#xff0c;帮助大家讲解。希望对大家有所帮助 文章首发地址 一、下载地址 这里提供一下 CSDN 镜像下载地址&#xff0c;有…

ESP-07S进行TCP 通信测试

一&#xff0c;TCP Server 为 AP 模式&#xff0c;TCP Client 为 Station 模式。 这里电脑pc作为TCP Server&#xff0c;ESP-07S作为TCP Client 。 二&#xff0c;电脑端配置。 1&#xff0c;开启热点。 2&#xff0c;转到“设置”&#xff0c;编辑热点信息。 3&#xff0c;关闭…

ROS2 Galactic安装

ROS2 Galactic安装 ROS2 Galactic安装字体编码检查添加ros2仓库到本机安装ROS2系统测试ROS卸载ros2 ROS2 Galactic安装 字体编码检查 安装需要设置本级为UTF-8字体&#xff0c;使用如下指令检查&#xff1a; locale # check for UTF-8sudo apt update && sudo apt …

【C++】空间配置器 allocator:原理及底层解析

文章目录 空间配置器一级空间配置器二级空间配置器1. 内存池2. SGI-STL中二级空间配置器设计 - - 哈希桶3. 二级空间配置器的空间申请 空间配置器的默认选择空间配置器的在封装&#xff1a;添加了数据类型大小空间配置器对象的构造与析构 容器中的 allocator 空间配置器 提到空…

移动办公管理系统低代码解决方案

随着企业数字化转型的加速&#xff0c;人工智能、云计算、大数据等技术应用的愈加广泛&#xff0c;数字化的办公系统在企事业内部编织起一套高效、畅通的信息互联体系&#xff0c;极大推动了企事业单位生产力的发展。 但与此同时&#xff0c;由于需要依赖固定的办公场所和固定…

最值得收藏的顶级专业数据恢复软件列表 [持续更新]

互联网上充斥着很多的数据恢复软件&#xff0c;每个软件都声称自己是最好的。现在该同意谁的观点呢&#xff1f;我们创建了 2023 年顶级专业数据恢复软件列表。下载顶级一流数据恢复专业软件的免费试用版&#xff0c;我们强烈建议用户评估演示版本&#xff0c;然后选择付费版本…

Python 樱花

Python实现樱花 效果图 &#xff08;源码在下面&#xff09; 源码&#xff1a; from turtle import * from random import * from math import *def tree(n, l):pd() # 下笔# 阴影效果t cos(radians(heading() 45)) / 8 0.25pencolor(t, t, t)pensize(n / 3)forward(l…

面试经典 150 题 1 —(数组 / 字符串)— 88. 合并两个有序数组

88. 合并两个有序数组 方法一&#xff1a; class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {for(int i 0; i<n;i){nums1[mi] nums2[i];}sort(nums1.begin(),nums1.end());} };方法二&#xff1a; clas…

CRMEB 标准版商城系统新增主题风格颜色【超级完整教程】

一、后台 1.新增主题图片 assets/images/brown.jpg和assets/images/brownsign.png 2.修改admin/src/pages/setting/themeStyle/index.vue 3.修改admin/src/pages/marketing/sign/index.vue 4.修改admin/src/pages/system/group/visualization.vue &#xff08;第三步和第四步…

Rust专属开发工具——RustRover发布

JetBrains最近推出的Rust集成开发工具——RustRover已经发布&#xff0c;官方网站&#xff1a;RustRover: Rust IDE by JetBrains JetBrains出品过很受欢迎的开发工具IntelliJ IDEA、PyCharm等。 RustRover优势 Rust集成环境&#xff0c;根据向导可自动下载安装rust开发环境提…