天公不知世间好,最是数据结构线性表

简介: 正片开始👀线性表👏数据结构里我们时常看到什么什么表,线性表是最基本、最简单、也是最常用的一种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义:

正片开始👀

线性表👏

数据结构里我们时常看到什么什么表,线性表是最基本、最简单、也是最常用的一种数据结构,其他各种表的万恶之源就是这个线性表,他是个啥其实顾名思义:


一个线性表是n个具有相同特性的数据元素的有限序列。数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。


说的这么复杂其实就是下面这个模型,线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

image.png

而我们说的线性是指他的连续性,并非是内存上连续,而是逻辑上连续,什么又是逻辑上连续?我们说数据结构有两种结构,一是物理结构即在内存中怎么存,二是逻辑结构是我们假想的。物理结构其实非数组即链表,基本都逃不开这俩,但数组有个致命的缺陷就是不知道咱要存多少,我开辟10个空间,若想存第11个就是放屁,那直接给他1000个空间呢?那剩下989个空间直接浪费掉,一句话就是他不能按需所取。


这时链表就应运而生,我们有几个数据就开辟几个空间,众所周知数组我们得到首元素地址,直接遍历就能得到全部成员,那它怎么去串联这些独立零散的空间来建立联系?我们按需所取首先就会选择去堆区申请空间,去堆区不是一定是最好,因为 malloc 函数嘛, 满足要就拿不要就释放。我们对数据寻踪觅迹是通过其对应的地址对吧,不难想到应用指针吧,这样那我们就可以“有备而来”,在开辟数据空间时多开辟4到8个字节来存放指针,最后一个数据我们不需要指针了,直接放一个空指针就行。

image.png

顺序表👏

线性表主要由顺序表示或链式表示。在实际应用中,常以栈、队列、字符串等特殊形式使用。


顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。


我们说过线性表中结构不是物理就是逻辑,我们的顺序表其实就是使用数组来存储数据,本质上来说顺序表就是一个数组。

image.png

抛开实际的代码谈概念就是耍流氓,我们采用工程化方式来写一组代码,在.h文件中进行定义:

typedef int type;//便于随时修改类型
#define n 10 //方便定义数组大小
struct SeqList
{
  type a[n];
  int size;
};
void PushBack(struct SeqList* p, type x);
void PopBack(struct SeqList* p, type x);
……
//后面这些为尾插,尾删等接口来处理他们之间的关系

以上的代码就是很多教材上的静态顺序表设计结构,咱跳出来看看就会秒感很low,他是固定大小不能按需所取,其实就是封装了一个数组,我们要变成动态顺序表很简单,增设一个capacity成员即可:

typedef int type;
#define n 10 
struct SeqList
{
  type a[n];
  int size;   //有效数据的个数
  int capacity;   //容量,即空间的大小
};
void PushBack(struct SeqList* p, type x);
void PopBack(struct SeqList* p, type x);
……

扩容操作我们手动操作,只需引入 realloc 函数即可,如果是将分配的内存扩大,则有以下情况:


如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc函数将返回原指针。

如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。

如果申请失败,将返回NULL,此时,原来的指针仍然有效。

相关文章
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
503 2
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
172 0
|
存储 算法 测试技术
【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
400 7
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
588 5
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
423 5
|
存储 Java
数据结构第二篇【关于java线性表(顺序表)的基本操作】
数据结构第二篇【关于java线性表(顺序表)的基本操作】
193 6
|
存储
【数据结构】线性表和顺序表
【数据结构】线性表和顺序表
174 1
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
01(数据结构考研)线性表相关操作代码
01(数据结构考研)线性表相关操作代码
216 0
|
存储 C语言
数据结构之线性表的初始化及其操作
数据结构之线性表的初始化及其操作
262 0