| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 《数据结构与算法的C语言实现》数据结构篇(二)单链表 -> 正文阅读 |
|
[数据结构与算法]《数据结构与算法的C语言实现》数据结构篇(二)单链表 |
零,前言? ? ? 在上一篇文章中我们介绍了顺序表这一种存储数据的结构。顺序表在增删查改的操作上有一些操作过于复杂且无法解决。
? ? ?为了解决上述难题,引入了 “链表” 这个新的数据结构作为解决方案。 一,单链表? ? ? 一,单链表的概念? ? ? 链表分为单链表和双链表,我们首先介绍的是单链表。 ? ? ? 链表与顺序表不同,链表中的每个数据在物理上不是连续的,也就是说链表中的数据的地址不是连续的,而是分散在内存里不同的位置。但是我们又必须要把每个数据连接在一起。我们又该如何做? ? ? ?我们用结构体定义了?"节点" 。链表由许许多多的节点构成,每个节点由一个数据和一个指针组成,指针指向的是下一个节点,如
那么该链表的结构就如图所示: ? ? ? ? 可能很多人看到这个结构和代码后很懵,那么我们就先通过了解一下打印链表数据的操作来理解整个链表这个结构是如何运行的。 ?在链表中。我们规定链表尾节点的next指针指向NULL。 对于链表的打印,我们的传参只需要穿链表头节点(也就是第一个节点)的地址即可。
? ? 理解链表第一步就是要理解cur = cur->next。? ? 在题目中,首先将头指针phead赋给cur,cur是当前节点的地址,我们通过当前节点地址cur用结构体指针cur->data打印出了该节点存的数据后,我们需要知道下一个节点的地址,怎么办呢? ?我们是否忘记了在结构体中还有一个next指针呢?它指向的是下一个节点的地址那么我们一但用cur = cur>next,我们将cur->next的值赋给cur后,cur这个指针就已经指向了下一个节点。 ? ? 首先头指针是0x0012FFA0,那么cur的值也是0x0012FFA0。由于头节点中的next指针指向的是下一个节点的地址。因此,其指针的值就是下一个节点的地址:0x0012FFB0那么cur->next的值也就是0x0012FFB0,当我们用cur = cur->next时,我们便成功地将0x0012FFB0赋给了cur。 ? 为什么要判断? cur != NULL呢?因为整个链表的尾节点的next指针指向的是NULL,因此当cur 等于NULL时,整个链表就已经遍历完,链表打印的函数将结束。 ?? ? ? 总而言之,链表用next指针将每个节点连接在了一起,由于next指针的缘故。只有知道上一个节点的地址才能求得当前节点的地址。 二,单链表的增删查改? 我们理解单链表的结构后就要进行单链表增删查改的实现。 1)单链表的创建? ? 创建一个 数据为x的节点
2)单链表的头插和头删? 单链表的头插头删和顺序表不同,由于数据在内存中不是连续存放因此不需要移动数据。 头插 ? ?若要进行头插只需要将新节点的next指针指向头节点,即可将其连接起来。
? ? 我们看到,在头插的传参中用了二级指针,这有什么用呢?
? ?在题目中,我们头插了节点后该链表的头指针phead变成了新节点的地址,因此phead需要改变。由于phead的类型是指针,因此改变一级指针的值就应该用二级指针pphead。 如果不使用二级指针,那么newnode这个新创建的节点就无法插入到该链表内。 头删 然后将头指针指向下一个节点。然后用free销毁原来的头节点。
3)单链表的尾插和尾删尾插和尾删都需要找“尾节点”,只有知道尾节点的地址才能进行尾插和尾删 尾插 进行尾插,即找到尾节点。然后把尾节点的next指针指向新节点,然后将新节点的next指针指向NULL。
? ? ?很多人有疑惑,为什么前面头插的代码改变指针的值要用二级指针,而tail->next = newnode;不需要用二级指针呢?因为上面代码和下面代码两个改变的东西不同。next在结构体中就是结构体变量,改变结构体变量的值就要用结构体指针tail。而上面头插改变的phead不是结构体变量而是单纯的一级指针。 尾删要分链表中只有一个节点或者有多个节点
4)链表的销毁
5)链表查找,插入与删除查找
插入 在pos之前插入
删除 删除pos处的节点
三,总结? ? ? 单链表同样存在一些问题,例如在进行尾部的插入删除时,需要找尾,时间复杂度会较大,为了解决这种问题引入了双链表。下一篇文章将会介绍双链表。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:15:04- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |