1. 链表

news2024/12/23 19:27:41

b站懒猫数据结构课程笔记:https://www.bilibili.com/read/cv8013121?spm_id_from=333.999.0.0


一、链表的概念

  • 单链表:线性表的链接存储结构
image-20230515221042959
  • 单链表存储特点:

    • 逻辑次序和物理次序不一定相同

    • 元素之间的逻辑关系用指针表示

    • 举例:(a1, a2, a3, a4)的存储示意图

      image-20230515221600277 image-20230515221737217
      • 单链表是由若干个结点构成的;
      • 单链表的结点只有一个指针域
  • 单链表的结点结构:

    typedef struct node {
        DataType data;	    // 数据域(可以是任意类型)
        struct node *next;	// 指针域
    } Node, *Link;		    // Node为node类型的别名,Link为node类型的指针别名
    
    Node st;	// 声明一个Node类型的结构体st,等价于struct node st;
    
    Link p;     // 等价于struct node *p;
    
    • 引用数据元素:(*p).data ,但建议用p->data
    • 引用指针域:p->next
  • 什么是存储结构?

    image-20230515223336245
    • 头指针:指向第一个结点的地址
    • 尾标志:终端结点的指针域为空

    空表和非空表不统一,不便于编程,如何将空表和非空表统一???

    • 头节点不存储数据
    image-20230515223646084

二、单链表的实现

2.1 单链表的遍历操作

  • 操作接口:void displayNode(Link head);
void displayNode(Link head) {
    p = head->next;				// head的next域就是指向第一个有效结点
    while(p != NULL) {			// 链表p为空的时候就直接退出了
        printf("%d", p->data);	 // 打印p对应的数据域data
        p = p->next;			// p的next域就是下一个结点的位置,往后移一位
    }
}

step 1:

image-20230516002524211

step 2:

image-20230516002958929

最后一次:p的next域指向了尾指针,p = NULL,从而退出循环

image-20230516002629484
  • 注意:不能将p = p->next改成p++来实现指针后移

    • 因为链表中结点的存储不是连续的,是零散的分配在内存中

      image-20230516003353451

2.2 求单链表的元素个数

  • 操作接口:int length(Link head);
    • 初始化让p指向第一个有效结点,并初始化累加器count
image-20230516003608131
int length(Link head) {
    p = head->next;				// head的next域就是指向第一个有效结点
    count = 0;
    while(p != NULL) {			// 链表p为空的时候就直接退出了
        p = p->next;			// p的next域就是下一个结点的位置,往后移一位
        count++;
    }
    return count;
}

2.4 单链表的查找操作

bool queryNode(Link head, DataType x) {  // DataType x是准备查找的数据;head是头指针
    p = head->next;
    while ( p!=NULL ) {
        if ( p->data == x ) {
            print(data);		// 找到则调用输出函数,并提前返回true
            return true;
        }
        p = p->next;
    }
    
    // 如果循环结束了,说明没有找到
    return false;
}

2.5 单链表的插入操作

  • 操作接口:void insertNode(Link head, int i, DataType x);
    • 定义要插入的数据的结点node
      • 开辟一块存储空间,让node指向该空间(node = (Link)malloc(sizeof(Node))
      • 将所希望插入的数据元素x赋给node的数据域(node->data = x
      • a i − 1 a_{i-1} ai1对应的p的next域赋给插入结点node(node->next= p->next
    • a i − 1 a_{i-1} ai1对应的p的next域指向结点node(`node->next = p)
image-20230516004654525

需要注意分析边界请况:表头,表尾

image-20230516005909435 image-20230516005956144
bool insertNode(Link head, int i, DataType x) {
    p = head;	// 工作指针p指向头结点
    count = 0;
    
    while ( p != NULL && count < i-1 ) {	// 查找第i-1个结点
        p = p->next;
        count++;
    }
    
    if ( p == NULL ) {
        return false;	// 没有找到第i-1个结点
    } else {
        node = (Link)malloc(sizeof(Node));	// 申请一个结点node
        node->data = x;
        node->next = p->next;			   // 结点node插入结点p之后
        p->next = node;
        return node;
    }
}

2.6 创建一个单链表

2.6.1 头插法

  • 操作接口:Link newList(DataType a[], int n)
  • 头插法:将待插入结点插在头结点的后面
image-20230516011055081

注意:创建一个结点时,最好立马将结点的next域设置为空

image-20230516011200639 image-20230516011324631
  • 顺序和数组相反
template<class DataType>
Link newList(DataType a[], int n) {
    // 创建头结点
    head = (Link)malloc(sizeof(Node));
    head->next = NULL;
    
    // 创建后续结点
    for ( i = 0; i < n; i++ ) {
        node = (Link)malloc(sizeof(Node));
        node->data = a[i];
        node->next = head->next;
        head->next = node;
    }
    return head;
}

2.6.2 尾插法

  • 操作接口:Link newList(DataType a[], int n)
  • 尾插法:将待插入结点插在终端结点的后面
image-20230516012005475
  • head表示头结点,rear表示尾结点
image-20230516012125955 image-20230516012146378 image-20230516012349857
Link newList(DataType a[], int n) {
    head = (Link)malloc(sizeof(Node));	// 生成头指针
    head->next = NULL;
    rear = head;	// 尾指针初始化

    for ( i = 0; i < n; i++ ) {
        node = (Link)malloc(sizeof(Node));
        node->data = a[i];
        
        // node->next = NULL; 加上这句,则后面的rear->next = NULL;就不需要了
        
        rear->next = node;
        rear = node;
    }
    rear->next = NULL;
    return head;
}

2.7 单链表的删除

  • 操作接口:bool deleteNode(Link head, DataType x);
image-20230516013045064 image-20230516013255180 image-20230516013358712 image-20230516013502017 image-20230516013549101 image-20230516013617765
bool deleteNode(Link head, DataType x) {
    if ( head == NULL || head->next == NULL ) {	// 若链表没有数据
        return false;
    }
    
    p = head->next;		// 初始化。p,q两个指针一前一后
    q = head;
    
    while ( p != NULL ) {
        if ( p->data == x ) {	// 找到x结点,删除这个结点,并提前返回
            q -> next = p->next;
            free(p);
            return true;
        } else {
            q = p;
            p = p->next;
        }
    } 
    // 如果循环结束了,说明没有找到和x相等的结点
    return false;
}

2.8 单链表的释放

image-20230516014341496 image-20230516014418558

三、循环链表的实现

image-20230516014546089 image-20230516014625359
  • 循环链表插入(相关操作和单链表相似)
image-20230516014748864 image-20230516014839184

四、双向链表

image-20230516014951361 image-20230516015015774

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

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

相关文章

PASCAL VOC数据集

一、前言 之前寒假好像就学了&#xff0c;但是没有记笔记&#xff0c;现在看来还是得记笔记&#xff0c;都忘得差不多了啊。 二、数据集的介绍 2.1数据集背景 分类类别 2.2数据集文件结构&#xff1a; 2.3文件夹 2.3.1Annotations文件夹 对于标注文件Annotations&#xff1a;里…

基于SpringBoot框架的程序开发步骤

SpringBoot简介 1. 入门案例问题导入1.1 入门案例开发步骤1.2 基于SpringBoot官网创建项目1.3 SpringBoot项目快速启动 2. SpringBoot概述问题导入2.1 起步依赖2.2 辅助功能 1. 入门案例 问题导入 SpringMVC的HelloWord程序怎么写&#xff1f; SpringBoot是由Pivotal团队提供…

死锁、生产者和消费者问题

目录 生产者和消费者问题 死锁的概念 内存的基础知识 内存管理的概念 覆盖与交换 介绍一下PCB 连续分配管理方式​编辑 生产者和消费者问题 死锁的概念 什么是死锁 进程死锁、饥饿、死循环的区别 死锁产生的必要条件 什么时候会发生死锁 死锁的处理策略 内存的基础知识 内存…

微三云润秋带你解析商城分销系统

管理大师德鲁克曾说过&#xff1a;当今企业间的竞争&#xff0c;不是产品之间的竞争&#xff0c;而是商业模式之间的竞争。创业不只是项目选择重要&#xff0c;好的商业模式同样重要&#xff0c;如果没有好的商业模式&#xff0c;企业将会被淘汰。 今天我们要聊的这个商城就有点…

怎样设置CRM目标?有什么作用?

实施CRM系统可以帮助企业提高客户保留率&#xff0c;增加收入&#xff0c;并推动业绩增长。然而&#xff0c;在实施CRM系统之前&#xff0c;必须设定明确的目标&#xff0c;与企业的整体战略保持一致。在这篇文章中&#xff0c;我们来讨论实施CRM目标是什么&#xff0c;如何设定…

基于AD9172/AD9176的4 通道12.6GSPS 采样率16 位DA 播放FMC JESD204B 接口子卡模块

板卡概述 FMC_XM131 是一款4 通道12.6GSPS 采样率16 位DA 播放FMC子卡模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.4 规范&#xff0c;可以作为一个理想的IO 模块耦合至FPGA 前端&#xff0c;16 通道的JESD204B 接口通过FMC连接器连接至FPGA 的高速串行端…

【Python TurboGears】零基础也能轻松掌握的学习路线与参考资料

Python TurboGears是一款开源的web框架&#xff0c;它篮了多种Python库和工具&#xff0c;可以更容易地开发和维护web应用程序。TurboGears具有优秀的文档和活跃的社区支持&#xff0c;是学习web开发的理想选择之一。以下是Python TurboGears学习路线&#xff0c;参考资料和优秀…

一句话简短解析 jsjiami.v6

jsjiami.v6 是一种广泛使用的 JavaScript 代码混淆工具&#xff0c;它提供了多种代码混淆技术&#xff0c;包括变量名重命名、函数名重构、字符串替换、代码结构混淆等&#xff0c;可以将代码转换为难以理解和阅读的形式。在本文中&#xff0c;我们将对 jsjiami.v6 进行分析&am…

【FMC137】基于 VITA57.4 标准的4 路2GSPS/2.6GSPS/3GSPS 14 位AD 采集子卡模块--AD9208得多通道中文资料

板卡概述 FMC137 是一款基于VITA57.4 标准规范的JESD204B 接口FMC 子卡模块&#xff0c; 该模块可以实现4 路14-bit 、2GSPS/2.6GSPS/3GSPSADC 采集功能。该板卡ADC 器件采用ADI公司的AD9208 芯片&#xff0c;&#xff0c;与ADI 公司的AD9689 可以实现PIN 脚兼容。该ADC 与FPGA…

Agisoft Metashape 基于影像的外部点云着色

Agisoft Metashape 基于影像的外部点云着色 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Agisoft Metashape 基于影像的外…

JavaScript全解析——this指向

本系列内容为JS全解析&#xff0c;为千锋教育资深前端老师独家创作 致力于为大家讲解清晰JavaScript相关知识点&#xff0c;含有丰富的代码案例及讲解。如果感觉对大家有帮助的话&#xff0c;可以【点个关注】持续追更~ this指向&#xff08;掌握&#xff09; this 是一个关…

Python系列之判断和循环

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 目录 一、判断语句 1.1 Shell里的判断语句格式 1.2 Python里的判断语句格式 二、循环语句 2.1 Python while循环 2.1.1 while 循环的基本格式 2.1.2 while 循环使用else语句 2.2 Python for 循…

每日学术速递5.16

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Locally Attentional SDF Diffusion for Controllable 3D Shape Generation 标题&#xff1a;用于可控 3D 形状生成的局部注意 SDF 扩散 作者&#xff1a;Xin-Yang Zheng, Hao Pa…

全能视频转换:Tipard Video Converter Ultimate Mac

Tipard Video Converter Ultimate 是一款 Mac 平台上的视频转换工具&#xff0c;它可以帮助用户将各种视频文件转换为不同的格式&#xff0c;以适应不同的设备和播放器。使用 Tipard Video Converter Ultimate&#xff0c;用户可以轻松地将视频转换为 MP4、AVI、WMV、FLV、MKV、…

美股股指期货在哪看?如何选择美股股指期货平台?

美股股指期货的交易方式与股票交易的方式类似。投资者可以通过经纪人或美股股指期货平台进行交易&#xff0c;也可以到股票交易所进行交易。需要注意的是&#xff0c;并非所有的美股股指期货平台都值得信赖。投资者在交易前需要筛选出靠谱的美股股指期货平台。 美股股指期货平台…

12金币问题的解决

title: 12金币 date: 2023-05-16 11:42:26 tags: 数据结构与算法 git地址&#xff1a;https://github.com/944613709/HIT-Data-Structures-and-Algorithms 12金币 **问题&#xff1a;**给出12个硬币&#xff0c;其中一个是假硬币&#xff0c;用一个天平来确定三种重量的假币&a…

AVUE样式、刷新、字典等操作

1、操作栏、表格样式的控制 2、下拉框字典的设置 3、日期格式的设置 const dateFormat function(row, value) { if (!value) return ; let format YYYY-mm-dd; let date new Date(value); const dataItem { Y: date.getFullYear().toString(), m: (date.ge…

Pycharm找不到python版本怎么办?解决方法:ModuleNotFoundError: No module named ‘torch‘

目录 1、conda我的使用版本是2023,04最新的 2、如果使用conda自定义的python的版本的话&#xff0c;那么着实有问题 我发现了我不管使用什么办法&#xff0c;切换到conda里面安装的虚拟机吧&#xff0c;就是找不到&#xff01; 如果直接吧conda作为加载器搞进去呢&#xff0c…

【ChatGPT】ChatGPT国内镜像网站整理

目录 一、什么是ChatGPT镜像&#xff1f;1、二狗问答(AI对话)2、AiDuTu3、WOChat4、ChatGPT(个人感觉最好用) 二、我们可以利用ChatGPT干什么&#xff1f;1、自动化制作PPT2、打造智能问答助手3、提高个人对话的效率4、开发智能客服机器人 一、什么是ChatGPT镜像&#xff1f; …

Vmware配置centos7(简单上手)

Linux操作系统 vmware安装centos71.安装下载VM&#xff08;本次使用VMware Workstation Pro 16&#xff09;2.安装下载镜像&#xff08;本次使用CentOS7-x86_64&#xff09;&#xff08;1&#xff09;进入VMware&#xff0c;创建虚拟机&#xff08;2&#xff09;设置虚拟机&…