关于链表中头指针和头结点的理解

article/2025/11/9 0:47:20

 

 

线性表使用顺序(数组)存储时有个弊端,那就是在插入和删除时需要大量的移动数据,这显示是非常消耗时间的,所以可以采用链式存储,即有一个指针域(单链表),来记录下个结点的存储位置(地址),这样在插入和删除结点时只需要修改指针域即可,从而大量减少移动数据所消耗的时间。来看链表的定义:

struct node {int data;struct node *next;
};

其中有两个元素,data为数据域,用于存储数据,next为指针域,用于存储下个结点的位置(地址)。

 

       单链表的示意图如下:

 

                                           
      Head指针为单链表的头指针,单链表L:L既是单链表的名字,也是其头指针。链表中的最后一个结点的指针域定义为空指针(NULL)。
      单链表的定义:当一个序列中只含有指向它的后继结点的链接时,就称该链表为单链表。

 

[plain] view plain copy

  1. struct Node  
  2. {  
  3.   ElemType data;  
  4.   struct Node *next;  
  5. };  
  6. typedef struct Node LNode;  
  7. typedef struct Node *LinkedList;  

   

那么什么是头指针呢?我们把指向第一个结点的指针称为头指针,那么每次访问链表时都可以从这个头指针依次遍历链表中的每个元素,例如:

struct node first;
struct node *head = &first;

这个head指针就是头指针。
这个头指针的意义在于,在访问链表时,总要知道链表存储在什么位置(从何处开始访问),由于链表的特性(next指针),知道了头指针,那么整个链表的元素都能够被访问,也就是说头指针是必须存在的。示例如下:

 

[cpp] view plain copy

  1. #include <stdio.h>  
  2.   
  3. struct node {  
  4.     int data;  
  5.     struct node *next;  
  6. };  
  7.   
  8. int main(void)  
  9. {  
  10.     struct node *head, first, second;  
  11.   
  12.     head = &first;  
  13.     first.data = 1;  
  14.     first.next = &second;  
  15.       
  16.     second.data = 2;  
  17.     second.next = NULL;  
  18.       
  19.     while (head) {  
  20.         printf("%d\n", head->data);  
  21.         head = head->next;  
  22.     }  
  23.     return 0;  
  24. }  

需要着重注意的是while那部分(通过头指针遍历完整个链表)。     

单链表有带头结点和不带头结点之分。

 

 

       上图为没有头结点的单链表,下图为带有头结点的单链表:

                                         

1.单链表的初始化,即建立一个空链表。

[plain] view plain copy

  1. //不带头结点的单链表的初始化  
  2. void LinkedListInit1(LinkedList L)  
  3. {  
  4.   L=NULL;  
  5. }  
  6. //带头结点的单链表的初始化  
  7. void LinkedListInit2(LinkedList L)  
  8. {  
  9.   L=(LNode *)malloc(sizeof(LNode));  
  10.   if(L==NULL)  
  11.   {  
  12.     printf("申请空间失败!");  
  13.     exit(0);  
  14.   }  
  15.   L->next=NULL;  
  16. }  

 


那么什么又是头结点呢?很多时候,会在链表的头部附加一个结点,该结点的数据域可以不存储任何信息,这个结点称为头结点,
头结点的指针域指向第一个结点,例如:

 

 

struct node head, first;
head.next = &first;

那么这里的头指针又是谁呢,不在是指向第一个结点的指针,而是指向头结点的指针,例如:

 

 

 

struct node *root = &head;

即root指针才是头指针。示例如下:

 

[cpp] view plain copy

  1. #include <stdio.h>  
  2.   
  3. struct node {  
  4.     int data;  
  5.     struct node *next;  
  6. };  
  7.   
  8. int main(void)  
  9. {  
  10.     struct node *root, head, first, second;  
  11.       
  12.     root = &head;  
  13.     root->data = 0;  
  14.     root->next = &first;  
  15.       
  16.     first.data = 1;  
  17.     first.next = &second;  
  18.       
  19.     second.data = 2;  
  20.     second.next = NULL;  
  21.       
  22.     while (root) {  
  23.         printf("%d\n", root->data);  
  24.         root = root->next;  
  25.     }  
  26.       
  27.     return 0;  
  28. }  


注:在Linux kernel中,定义头结点使用宏LIST_HEAD。


http://chatgpt.dhexx.cn/article/3YunTrWZ.shtml

相关文章

首元结点,头结点,头指针区别

https://www.cnblogs.com/letianpaiai/p/13227755.html 首元结点就是指链表中存储的第一个数据元素的结点&#xff0c;就是结点Li 头指针是指向链表中的第一个结点的指针&#xff0c;如果有头结点&#xff0c;那么头指针所指结点为头结点&#xff0c;否则为首元结点 头结点是…

头指针、头结点、首元结点概念区别

转自&#xff1a;https://blog.csdn.net/liangxingda/article/details/52755800 链表中第一个结点的存储位置叫做头指针&#xff0c;那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点&#xff0c;其实就是上一个的后继指针指向的位置。 这里有个地方要注意&a…

链表的头节点理解

不管带不带头节点&#xff0c;头指针始终指向第一个结点&#xff0c;头指针始终指向第一个结点&#xff0c;而头节点是带头结点的链表的第一个结点&#xff0c;结点内通常不存储信息。 图示如下&#xff1a; 2.在建立链表时&#xff0c;如果是不带头节点&#xff0c;第一个结…

头结点的作用

数据结构中&#xff0c;在单链表的开始结点之前附设一个类型相同的结点&#xff0c;称之为头结点。头结点的数据域可以不存储任何信息&#xff0c;头结点的指针域存储指向开始结点的指针&#xff08;即第一个元素结点的存储位置&#xff09;。 作用 1、防止单链表是空的而设的&…

头结点和头指针的区别

地址&#xff1a; 头指针和头结点的区别&#xff1a;头指针&#xff1a; 头结点&#xff1a; 地址&#xff1a; https://blog.csdn.net/u013593035/article/details/45953605?ops_request_misc%257B%2522request%255Fid%2522%253A%2522162688192816780255294435%2522%252C%…

链表、头指针、头结点

图1为线性表&#xff08;ZHAO, QIAN, SUN, LI, ZHOU, WU, ZHENG, WANG&#xff09;的逻辑状态。头指针 指示链表中第一个结点&#xff08;即第一个数据元素的存储映像&#xff09;的存储位置。同时&#xff0c;由于最后一个数据元素没有直接后继&#xff0c;则线性链表中最后…

头结点和头指针的详解

文章目录 头结点和头指针的详解1. 什么是结点&#xff1f;2. 链表最后一个元素3. 头结点4. 头指针 头结点和头指针的详解 1. 什么是结点&#xff1f; 为了表示每个数据元素ai与其直接后续元素ai1之间的逻辑关系&#xff0c;对于数据元素ai来说&#xff0c;除了存储其本身的信息…

头指针VS头结点 以及 如何理解头结点

头指针VS头结点 头指针和头结点是两个不同概念。 链表是它们的范畴。 1.头指针是指向链表第一个节点的指针&#xff0c;如果此链表第一个节点是头结点&#xff0c;那么头指针就指向头结点。 2.头结点内通常不储存数据&#xff0c;但不排除例外&#xff0c;有时候可能会储存链…

【头结点】【头指针】【首元结点】

2022 -1-14 文章目录 2022 -1-141. 定义&#xff1a;2. 哨兵&#xff08;头结点&#xff09;3. 有无头结点的单链表的创建3.1 有头结点3.1.1 头插法&#xff1a;3.1.2 尾插法&#xff1a; 3.2 无头结点3.2.1 头插法&#xff1a;3.2.2 尾插法&#xff1a; 1. 定义&#xff1a; …

python 链表中头结点的含义以及引入头结点的作用

一、概念 头结点:是虚拟出来的一个结点&#xff0c;不保存数据。头结点的next指针指向链表中的第一个节点。对于头结点&#xff0c;数据域可以不存储任何信息&#xff0c;也可存储如链表长度等附加信息。头结点不是链表所必需的。 头指针:是指向第一个结点的指针,如果链表没有…

数据结构:头指针,头结点详解(新手.小白)

如果不想看定义的话&#xff0c;可以看我的第二部分&#xff0c;里面有我自己遇到的一些疑难。 下文中出现的有关于java的&#xff0c;也有c语言的指针&#xff08;可以看成java的引用变量&#xff09;&#xff0c;觉得写得不好&#xff0c;多多包涵 目录 (一&#xff09;…

头结点的含义以及引入头结点的作用

一、概念 头结点:是虚拟出来的一个节点&#xff0c;不保存数据。头结点的next指针指向链表中的第一个节点。对于头结点&#xff0c;数据域可以不存储任何信息&#xff0c;也可存储如链表长度等附加信息。头结点不是链表所必需的。 头指针:是指向第一个结点的指针,如果链表没有…

qpython 3h下载_【分享】QPython 3H3.0.0 一个伟大的脚本编辑器!

这有点。。。东西!!! 【应用名称】&#xff1a;QPython 3H 【应用版本】&#xff1a;3.0.0 【应用大小】&#xff1a;25.41M 【软件介绍】&#xff1a; 这个软件集成了Python3解释器、Console控制台、QEdit编辑器和SL4A库&#xff0c;可以直接在安卓手机上运行Python代码&…

qpython3l_qpython3例子

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 在控制台使用计划界面创建使用计划&#xff0c;并将使用计划与已创建的密钥对绑定&#xff08;参考 使用计…

qpython 3h_QPython 3H

qpython 3h一款用于线上编辑来提供的手机软件&#xff0c;能够让你轻松的进行法语内容的快速编辑&#xff0c;用户只需要通过输入之后即可轻松的在软件生成法语&#xff0c;还能够轻松的将文字转化成相对应的法语让你在翻译的时候享受便捷效果&#xff0c;更是还拥有着独特的解…

说一说Qpython3在Android手机上的应用

QPython3是一款可以完美运行于Android平台上的Python3的脚本引擎&#xff0c;QPython3整合了Python3解释器、Console、编辑器和SL4A库。让你在Android设备上也能方便的开发Python项目。 研究Qpython也有一段时间了&#xff0c;一直想记录一些东西以便后面可以回顾&#xff0c;…

Visio使用技巧备忘录

用Visio画图过程中&#xff0c;将遇到的问题记录下来&#xff0c;以免忘记。 内容如下&#xff1a; 1、画流程图时&#xff0c;新建&#xff0c;根据需求选里面的模板。&#xff08;第一次选的空白绘图&#xff0c;啥都没有&#xff09; 2、画箭头&#xff0c;点击指针工具旁边…

Visio使用技巧之默认字体大小更改

然而这东西不能保存&#xff0c;但是也算是全局设置&#xff0c;免了一步一步设置的烦恼

visio 使用技巧汇总

1.visio中图形旋转任意角度的方法 视图----任务窗格----大小与位置----角度 2.箭头形状 更多形状---流程图----箭头形状 3.汇制虚线框 从基本形状中拖出一个矩形,右击矩形,选择设置形状格式,填充选择无填充,开始菜单栏中的形状样式选择线条---虚线即可 4.云状图 (1)开始---…