【数据结构与算法】深入浅出:单链表的实现和应用

这篇具有很好参考价值的文章主要介绍了【数据结构与算法】深入浅出:单链表的实现和应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 【数据结构与算法】深入浅出:单链表的实现和应用

🌱博客主页:青竹雾色间.

😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注

【数据结构与算法】深入浅出:单链表的实现和应用

 ✨人生如寄,多忧何为 

目录

前言

单链表的基本概念

节点

头节点

尾节点

单链表的基本操作

创建单链表

头插法:

尾插法:

插入(增)操作

 删除(删)操作:

查找(查)操作:

修改(改)操作:

遍历链表

单链表的应用场景


前言

在本篇博客中,我们将深入探索一种常见的数据结构——单链表。单链表是一种线性数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单链表的特点是插入和删除操作非常简单,但是查找和遍历操作可能会比较耗时。我们将学习单链表的基本概念、操作以及实现方式。

【数据结构与算法】深入浅出:单链表的实现和应用

单链表的基本概念

下面我们来介绍一下单链表的基本概念和操作。

  • 节点

单链表中的每个节点都包含两个部分:数据域(DATA)和指针域(NEXT)。

数据域用于存储数据元素可以是数组,可以是int,甚至可以是结构体,

指针域用于存储指向下一个节点的指针

【数据结构与算法】深入浅出:单链表的实现和应用

typedef int ElemType; //定义单链表结构
typedef struct Node{
    ElemType data;//数据域
    struct Node *next;//指针域
} LinkList;//初始化
  • 头节点

单链表的第一个节点称为头节点,它不包含任何数据元素,只包含一个指向第一个节点的指针。在单链表中,头节点通常被定义为全局变量或者静态变量。

【数据结构与算法】深入浅出:单链表的实现和应用

//创建头结点,并将数据存入头结点中
LinkList CreateList(ElemType n){
    LinkList head = (LinkList)malloc(sizeof(struct Node));
    head->data = n;
    head->next = NULL;
    return head;
}
  • 尾节点

单链表的最后一个节点称为尾节点,它也不包含任何数据元素,只包含一个指向最后一个节点的指针。在单链表中,尾节点通常被定义为全局变量或者静态变量。

链表的尾节点NEXT指向NULL(空),因为尾部没有任何可以指向的空间了.

【数据结构与算法】深入浅出:单链表的实现和应用

单链表的基本操作

单链表是一种常见的数据结构,支持以下四种基本操作:插入(增)、删除(删)、查找(查)、修改(改)。下面将逐一介绍这些操作的实现方法。

创建单链表

头插法:

我们首先创建一个头结点,然后将新节点插入到头结点的后面。具体实现时,我们可以使用指针来遍历链表,找到最后一个节点,然后将新节点插入到该节点的后面。这样就可以保证新节点始终位于链表的头部。

【数据结构与算法】深入浅出:单链表的实现和应用

// 头插法
Node* insertAtHead(Node *head, int data) {
    Node *newNode = (Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    newNode->next = head;
    return newNode;
}

尾插法:

【数据结构与算法】深入浅出:单链表的实现和应用

我们首先创建一个头结点,然后将新节点插入到头结点的后面。具体实现时,我们可以使用指针来遍历链表,找到最后一个节点,然后将新节点插入到该节点的后面。这样就可以保证新节点始终位于链表的尾部。

// 尾插法
Node* insertAtTail(Node *head, int data) {
    Node *newNode = (Node*)malloc(sizeof(struct Node));
    newNode->data = data;
    if (head == NULL) { // 如果链表为空,则直接将新节点作为头结点。
        newNode->next = NULL;
        return newNode;
    } else if (head->next == NULL) { // 如果链表只有一个元素,则直接将新节点插入到该元素后面。
        head->next = newNode;
        return head;
    } else { // 否则,找到最后一个节点,然后将新节点插入到该节点的后面。
        Node *temp = head;
        while (temp->next != NULL) temp = temp->next;
        temp->next = newNode;
        return head;
    }
}
  • 插入(增)操作

          在单链表中插入一个新节点,将其链接到链表中的其他节点。

// 在指定位置插入一个新节点
void insertAtPos(Node** head, int pos, ElemType e) {
    Node* p = *head;
    int i = 1; // i表示当前节点的位置,从第二个节点开始计算
    while (i < pos && p != NULL) p = p->next, i++; // 从第二个节点开始遍历到指定位置的前一个节点
    Node* newNode = (Node*)malloc(sizeof(struct Node));
    if (newNode == NULL) exit(0); // 如果分配失败则退出程序
    newNode->data = e; // 将新节点的数据域设置为e
    if (p == NULL) *head = newNode; // 如果指定位置的前一个节点是空的,则将新节点作为新的头结点
    else newNode->next = p->next; // 否则将新节点插入到指定位置的前一个节点后面
    p->next = newNode; // 将新节点插入到链表中
}

【数据结构与算法】深入浅出:单链表的实现和应用

  •  删除(删)操作:

         从单链表中删除一个节点,重新连接链表中的其他节点。

  1. 若要删除的节点为头节点,直接将头节点指向下一个节点即可。
  2. 若要删除的节点不是头节点,遍历链表找到该节点的前一个节点。
  3. 将前一个节点的next指针指向要删除节点的下一个节点。

 【数据结构与算法】深入浅出:单链表的实现和应用

  • 查找(查)操作:

        在单链表中查找特定的元素。

  1. 从头节点开始遍历链表,逐个比较节点的数据与目标数据是否相等。
  2. 若找到相等的节点,则返回该节点或其他需要的信息。
  3. 若遍历完整个链表仍未找到目标数据,则表示目标数据不存在于链表中。
//在单链表中查找值为x的结点
int Locate(LinkList L, int x)
{
    LinkList p;
    int j = 1;
    p = L->next;
    while (p != NULL && p->data != x)
    {
        p = p->next;
        j++;
    }
    if (p)
    {
        printf("%d在链表中,是第%d个元素", p->data - 48, j);//由于是ASCII,所以-48
    }
    else
    {
        printf("该数值不在链表里。\n");
        return 0;
    }
}
//求单链表的长度
int ListLength(LinkList L)
{
    Node* p;
    p = L->next;
    int j = 0;//计数器j
    while (p != NULL)
    {
        p = p->next;
        j++;
    }
    printf("%d", j);
    return 0;
}
  • 修改(改)操作:

        更新单链表中节点的数据。

  1. 从头节点开始遍历链表,逐个比较节点的数据与目标数据是否相等。
  2. 若找到相等的节点,则将该节点的数据更新为新的数据。
//链表内容的修改,在链表中修改值为x的元素变为为k。
LinkedList LinkedListReplace(LinkedList L,int x,int k) {
    Node *p=L->next;
    int i=0;
    while(p){
        if(p->data==x){
            p->data=k;
        }
        p=p->next;
    }
    return L;
}
  • 遍历链表

在单链表中,遍历链表的操作可以通过以下步骤实现:

a. 从头结点开始遍历链表;

b. 对于每个节点,执行相应的操作(如打印数据元素)。

void Print(LinkList L) 
{
    Node* p = L->next;
    while (p) 
    {
        printf("%c ", p->data);
        p = p->next;
    }
}

单链表的应用场景

单链表在实际的软件开发中有广泛的应用,例如:

  • 数据库系统中的链表索引。

【数据结构与算法】深入浅出:单链表的实现和应用

  • 实现栈和队列等其他数据结构。
  • 图算法中的邻接表表示。

【数据结构与算法】深入浅出:单链表的实现和应用文章来源地址https://www.toymoban.com/news/detail-477204.html

到了这里,关于【数据结构与算法】深入浅出:单链表的实现和应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】深入浅出理解快速排序背后的原理 以及 版本优化【万字详解】(C语言实现)

    快速排序是 Hoare 于1962年提出的一种 二叉树结构 的 交换排序 方法。 任取待排序元素序列中的 某元素作为基准值 ,按照该排序码将待排序集合 分割成两子序列 , 左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值 ,然后最左右子序列重复该过程,直到所

    2024年02月05日
    浏览(90)
  • 深入浅出:单链表的实现和应用

      🌱博客主页:青竹雾色间. 😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注  ✨ 人生如寄,多忧何为  ✨ 目录 前言 单链表的基本概念 节点 头节点 尾节点 单链表的基本操作 创建单链表 头插法: 尾插法: 插入(增)操作  删除(删)操作: 查找(查)操作: 修改(改

    2024年02月08日
    浏览(31)
  • 深入浅出:手把手教你实现单链表

    链表是一种 链状数据结构 。简单来说,要存储的数据在内存中分别独立存放,它们之间通过某种方式相互关联。 如果我们使用C语言来实现链表,需要声明一个 结构体 作为链表的结点,结点之间使用指针关联。 单向链表的每个结点内都有一个指针指向下一个结点,从而把所

    2024年02月10日
    浏览(37)
  • 随机森林算法深入浅出

    目录 一 随机森林算法的基本原理 二 随机森林算法的优点 1. 随机森林算法具有很高的准确性和鲁棒性 2. 随机森林算法可以有效地避免过拟合问题 3. 随机森林算法可以处理高维度数据 4. 随机森林算法可以评估特征的重要性 三 随机森林算法的缺点 1. 随机森林算法对于少量数

    2023年04月08日
    浏览(35)
  • 【蓝桥杯日记】复盘篇一:深入浅出顺序结构

      本期是一篇关于顺序结构的题目的复盘,通过复盘基础知识,进而把基础知识学习牢固!通过例题而进行复习基础知识。 前言 1.字符三角形  分析: 知识点: 代码如下 2. 字母转换 题目分析: 知识点: 代码如下  3. 再分肥宅水 题目分析: 知识点: 代码如下  4. 数字反转 题

    2024年01月22日
    浏览(45)
  • 深入浅出排序算法之计数排序

    目录 1. 原理 2. 代码实现 3. 性能分析 首先看一个题目,有n个数,取值范围是 0~n,写出一个排序算法,要求时间复杂度和空间复杂度都是O(n)的。 为了达到这种效果,这一篇将会介绍一种 不基于比较的排序方法。 这种方法被称为计数排序。 计数排序的思路是这样的,对于每

    2024年02月06日
    浏览(26)
  • 深入浅出排序算法之基数排序

    目录 1. 前言 1.1 什么是基数排序⭐⭐⭐ 1.2 执行流程⭐⭐⭐⭐⭐ 2. 代码实现⭐⭐⭐ 3. 性能分析⭐⭐ 3.1 时间复杂度 3.2 空间复杂度 一个算法,只有理解算法的思路才是真正地认识该算法,不能单纯记住某个算法的实现代码! (1) 通过键值得各个位的值,将要排序的元素分配

    2024年02月08日
    浏览(42)
  • 深入浅出讲解自动驾驶 - 激光雷达原理和结构简介

    💂 个人主页 : 同学来啦 🤟 版权 : 本文由【同学来啦】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助, 欢迎关注、点赞、收藏和订阅专栏哦 激光雷达最先应用于海洋深度探测领域,其实现思路是通过相同回波之间的时间差实现海洋深度测算。后来不断演

    2024年02月16日
    浏览(29)
  • 【实体识别】深入浅出讲解命名实体识别(介绍、常用算法)

    本文收录于《深入浅出讲解自然语言处理》专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅! 个人主页:有梦想的程序星空 个人介绍:小编是人工智能领域硕士,全栈工程师,深耕Flask后端开发、数据挖掘、NLP、Android开发、自动化等领域

    2023年04月08日
    浏览(28)
  • 深入浅出 Yolo 系列之 Yolov7 基础网络结构详解

    从 2015 年的 YOLOV1 ,2016 年 YOLOV2 , 2018 年的 YOLOV3 ,到 2020 年的 YOLOV4 、 YOLOV5 , 以及最近出现的 YOLOV76 和 YOLOV7 可以说 YOLO 系列见证了深度学习时代目标检测的演化。对于 YOLO 的基础知识以及 YOLOV1 到 YOLOV5 可以去看大白的 YOLO 系列,本文主要对 YOLOV7 的网络结构进行一个梳理

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包