• 《数据结构》——顺序表和链表


    hello,这里是bangbang,本系列记录我所学数据结构相关知识。


    目录

    1.线性表

    2.顺序表

     2.1接口实现

    3.链表

    3.1链表的概念和结构

    3.2链表分类

     3.3单链表接口

    3.4带头双向循环链表

    4.顺序表和链表的区别


    1.线性表

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

    2.顺序表

    顺序表是用一段 物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
    储。在数组上完成数据的增删查改。
    静态顺序表:定长数组

    动态顺序表:动态开辟

     2.1接口实现

    // 基本增删查改接口
    // 顺序表初始化
    void SeqListInit ( SeqList * psl );
    // 检查空间,如果满了,进行增容
    void CheckCapacity ( SeqList * psl );
    // 顺序表尾插
    void SeqListPushBack ( SeqList * psl , SLDataType x );
    // 顺序表尾删
    void SeqListPopBack ( SeqList * psl );
    // 顺序表头插
    void SeqListPushFront ( SeqList * psl , SLDataType x );
    // 顺序表头删
    void SeqListPopFront ( SeqList * psl );
    // 顺序表查找
    int SeqListFind ( SeqList * psl , SLDataType x );
    // 顺序表在 pos 位置插入 x
    void SeqListInsert ( SeqList * psl , size_t pos , SLDataType x );
    // 顺序表删除 pos 位置的值
    void SeqListErase ( SeqList * psl , size_t pos );
    // 顺序表销毁
    void SeqListDestory ( SeqList * psl );
    // 顺序表打印
    void SeqListPrint ( SeqList * psl );

    具体代码可以参考我的gitee

    3.链表

    3.1链表的概念和结构

    链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表
    中的 指针链接 次序实现的 。
    单链表:一个数据域,一个地址域

     需要注意:

    申请的空间一般是从堆上申请,并且连续申请的两个结点可能地址连续,也可能不连续。

    3.2链表分类

    链表有许多种类,我分为3部分,进行组合形成我们需要的链表

    1、单向或双向

    2、带头或不带头

    3、循环或非循环

     我们最常用的两种结构是:无头单向非循环链表、带头双向循环链表

    1. 无头单向非循环链表: 结构简单 ,一般不会单独用来存数据。实际中更多是作为 其他数据结
    构的子结构 ,如哈希桶、图的邻接表等等。另外这种结构在 笔试面试 中出现很多。
    2. 带头双向循环链表: 结构最复杂 ,一般用在单独存储数据。实际中使用的链表数据结构,都
    是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带
    来很多优势,实现反而简单了,后面我们代码实现了就知道了。

     3.3单链表接口

    // 1 、无头 + 单向 + 非循环链表增删查改实现
    typedef int SLTDateType ;
    typedef struct SListNode
    {
    SLTDateType data ;
    struct SListNode * next ;
    } SListNode ;
    // 动态申请一个结点
    SListNode * BuySListNode ( SLTDateType x );
    // 单链表打印
    void SListPrint ( SListNode * plist );
    // 单链表尾插
    void SListPushBack ( SListNode ** pplist , SLTDateType x );
    // 单链表的头插
    void SListPushFront ( SListNode ** pplist , SLTDateType x );
    // 单链表的尾删
    void SListPopBack ( SListNode ** pplist );
    // 单链表头删
    void SListPopFront ( SListNode ** pplist );
    // 单链表查找
    SListNode * SListFind ( SListNode * plist , SLTDateType x );
    // 单链表在 pos 位置之后插入 x
    void SListInsertAfter ( SListNode * pos , SLTDateType x );
    // 单链表删除 pos 位置之后的值
    void SListEraseAfter ( SListNode * pos );

     详细代码:我的gitee

    3.4带头双向循环链表

    // 2 、带头 + 双向 + 循环链表增删查改实现
    typedef int LTDataType ;
    typedef struct ListNode
    {
    LTDataType _data ;
    struct ListNode * next ;
    struct ListNode * prev ;
    } ListNode ;
    // 创建返回链表的头结点 .
    ListNode * ListCreate ();
    // 双向链表销毁
    void ListDestory ( ListNode * plist );
    // 双向链表打印
    void ListPrint ( ListNode * plist );
    // 双向链表尾插
    void ListPushBack ( ListNode * plist , LTDataType x );
    // 双向链表尾删
    void ListPopBack ( ListNode * plist );
    // 双向链表头插
    void ListPushFront ( ListNode * plist , LTDataType x );
    // 双向链表头删
    void ListPopFront ( ListNode * plist );
    // 双向链表查找
    ListNode * ListFind ( ListNode * plist , LTDataType x );
    // 双向链表在 pos 的前面进行插入
    void ListInsert ( ListNode * pos , LTDataType x );
    // 双向链表删除 pos 位置的结点
    void ListErase ( ListNode * pos );

     老规矩(滑稽)gitee

    4.顺序表和链表的区别

    不同点顺序表链表
    存储空间上
    物理上一定连续
    逻辑上连续,但物理上不一定连续
    随机访问
    支持O(1)
    不支持: O(N)
    任意位置插入或者删除元素
    可能需要搬移元素,效率低O(N)
    只需修改指针指向
    插入
    动态顺序表,空间不够时需要扩容
    没有容量的概念
    应用场景
    元素高效存储 + 频繁访问
    任意位置插入和删除频繁
    缓存利用率

    记录学习,有些草率了请见谅,谢谢!

  • 相关阅读:
    在Linux Ubuntu系统中部署C++环境与Visual Studio Code软件
    Socket 服务端实例学习笔记
    mdr1基因寡核苷酸/酸敏感靶多肽/聚乙二醇埃博霉素B偶联阿霉素的相关制备
    树莓派4B开机自动发微信报告ip地址
    Java集合实例
    leetcode贪心算法:Gas Station
    《论文阅读》Commonsense Knowledge Aware Conversation Generation with Graph Attention
    中标麒麟国产服务器安装MinIO报错不能读取该二进制文件解决方案
    【LangChain系列 8】Prompt模版——少样本prompt模版(二)
    基于IGT-DSER智能网关实现GE的PAC/PLC与罗克韦尔(AB)的PLC之间通讯
  • 原文地址:https://blog.csdn.net/bang___bang_/article/details/126178353