| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 再探C语言链表—TypeDef Struct模式声明链表节点 -> 正文阅读 |
|
[数据结构与算法]再探C语言链表—TypeDef Struct模式声明链表节点 |
0.?序之前看到的网上的书上的都是Struct直接创建节点。 我记得typedef struct是大学时候数据结构课本上用来声明链表结点的方法,这个方法让人容易操作链表。后来书本扔了,再买了盗版书不知道是版本问题还是什么问题,包括网上大多数博客都是直接struct声明。struct直接声明对后面链表的增删改查都稍微增加了难度。 今天在查资料时候突然看到这个写法,操作了一遍发现很容易实现链表的一些基本操作,因此完善一下贴上来 1.?代码代码比较简单,重要的地方注释了
?结果 2.?头插法示意图因为头插法稍微拐了个弯,我之前也没搞明白,画个图就明白了 ?链表的头节点是指向下一个节点,因此在插入新节点时候,首先是把待插入节点指向头结点的下一个节点,然后再把头结点地址指向待插入节点。 如下,a是待插入节点,head是head的下一个节点。
?3.?关于我代码里面的很多head可能我这里很多都是head,但是这个是传入的head的地址,因此虽然看着他们重新声明了好多次,但是在main函数里面传入的是同一个head,因此这里的head实际上地址都是一样的。 后面我再讲一下遍历里面的head可能会更清楚点 ?4.?关于遍历函数里面的head我这里算是故意写了head,如果你能把这个head弄懂,就说明真的弄懂链表了 我们这里的head=head.next就是移动指针。 又因为这里的head实际上是一个新的局部地址(指针)变量,所以我们改变这里的值,对main函数里面的head是没有影响的。 5.?关于链表的地址?实际上我们在用malloc申请内存时候,就已经在内存里面开辟了一块地址。 是保存在堆里面还是在栈里面,我们下次再讨论。 如图我们看到三个地址,这就是head、p、t所在的位置。 ?当我们把next给指向(赋值,让next等于指向的节点的地址)所在节点的地址后,地址就变成指向节点的地址,新手往往在指向地址的时候懵了,不知道是谁指谁。 这里明确说明,是next=想要指向的节点的地址。 如下图就是让next指向下一个节点的示意图 ?如下图就是在指向节点之后各个地址值 ?6.?关于next指向NULL这张图里面我们可以看到,在我们使用malloc创建了一个结构体指针变量之后,他的值是一个明确的地址。而我们的结构体里面的结构体指针因为没有使用malloc,所以他指向的是一个随机值,如下图在指向地址之前是一个相同的值,他们都指向了同一个地方。 因此在初始化和添加节点的时候next指向NULL是非常重要的,如果没有指到NULL,我们在遍历的时候就找不到尾结点在什么地方。对了,这里说明一下,我们判断尾结点的方式就是判断当前结点的next是不是指向NULL,如果指向NULL就说明他是尾结点。 ?因此一定要注意新建的节点的next一定要指向NULL |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/26 6:27:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |