【数据结构与算法】链表与队列

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨
📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852
📢:文章若有幸对你有帮助,可点赞 👍 收藏 ⭐不迷路🙉
📢:内容若有错误,敬请留言 📝指正!原创文,转载请注明出处


https://blog.csdn.net/Edward_Asia/article/details/120876314
https://www.zhihu.com/question/315752464

前言:顺序表的优缺点

顺序表的特点:以物理位置相邻表示逻辑关系。
顺序表的优点:任一元素均可随机存取。
顺序表的缺点:进行插入和删除操作时,需移动大量的元素。其次, 存储空间不灵活,空间大小有限

由于顺序表存在以上的这些优缺点,才开始有替代它的数据结构出现:线性表。

线性表的链式表示和实现

链式存储结构:结点在存储器中的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻 线性表的链式表示又称为非顺序映像或链式映像。
每个节点由两个域组成
1、数据域:存储元素数值数据;
2、指针域:存储直接后继结点的存储位置。

在这里插入图片描述
在这里插入图片描述
只要找到头指针,便能顺藤摸怪找到其他元素,这就是链表的结构特点。单链表是由头指针唯一确定,因此单链表可以用头指针的名字来命名。其次,单链表的尾部由于没有指向下一个元素了,因此其指针域为空NULL

与链式存储有关的术语

1、结点:数据元素的存储映像。由数据域和指针域两部分组成
2、链表:n个结点由指针链组成一个链表。

一、单链表

单链表的特点

单链表(Singly Linked List)是一种常见的数据结构,具有以下特点:

1、链式存储:单链表使用节点来存储数据,并通过节点之间的链接关系组织起来。每个节点都包含数据和一个指向下一个节点的指针(通常称为“next”指针)。

2、动态大小:单链表的大小可以根据需要动态地增长或缩小,因为它使用了动态内存分配。这使得在插入或删除节点时不需要移动其他节点,相比于数组,单链表更灵活。

3、顺序访问:由于单链表只能从头部开始顺序访问,无法直接访问中间或尾部的节点。要访问某个特定位置的节点,需要从头节点开始按照链接依次遍历到目标位置。

4、插入和删除效率较高:相对于数组,单链表在插入和删除节点的操作上具有较高的效率。在已知位置的情况下,插入和删除一个节点的时间复杂度为
O(1)。但是,要找到插入或删除的位置可能需要遍历整个链表,平均时间复杂度为 O(n)。

单链表的创建

typedef struct Node {
    int data;           // 节点中存储的数据
    struct Node* next;  // 指向下一个节点的指针
} Node;

// 创建链表
Node* createLinkedList(int arr[], int size) {
    if (size == 0) {
        return NULL;
    }

    Node* head = (Node*)malloc(sizeof(Node));
    head->data = arr[0];
    head->next = NULL;
    Node* tail = head;

    for (int i = 1; i < size; i++) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = arr[i];
        newNode->next = NULL;
        tail->next = newNode;
        tail = newNode;
    }

    return head;
}

在上述代码中,我们定义了一个名为 Node 的结构体类型,表示单链表的节点。
该结构体包含两个成员:data 和 next。
data 表示节点中存储的数据,可以是任意类型的数据。
next 是指向下一个节点的指针(也可以为空指针)。 通过将多个节点按照 next 指针链接起来,就形成了一个完整的单链表。

双向链表

双向链表的节点结构:有前驱和后继指针
Data:节点
Prev:节点的前驱指针
Next:节点的后继指针

二、队列

2.1 基础概念

概念: 队列(Queue)是仅在表尾进行插入操作,在表头进行删除操作的线性表。
表尾即an端,称为队尾;
表头即a端,称为队头。 它是一种先进先出( FIFO )的线性表。
入队与出队:插入元素称为入队;删除元素称为出队。
存储结构:链队或顺序队(常用循环顺序队)。链式队列就是使用链表的形式进行存储。
运算规则:只能在队首和队尾运算,且访问结点时依照先进先出(FIFO)的原则。所谓的“头删尾插”,也就是运算的时候,数据只能存尾部插入或是添加,在头部删除或是离开。

2.2 顺序队列的操作

队列大致上有如下的基本操作

1、构造队列 2、清除队列 3、求队列的长度 4、求队列的头元素、尾元素 5、删除队列的对头元素

如何实现顺序队列
队和的顺序表示——用一维数组base[MAXSIZE]
在这里插入图片描述

2.3 链式队列的操作

顺序队列的表示与实现

空队的标志:头指针等于尾指针
真溢出与假溢出

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌小超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值