单链表的头指针、头结点与首元结点

继续我们昨天所说的单链表。单链表也是一种线性表,所以总得有个头有个尾。链表中第一个结点的存储位置叫做头指针,那么整个链表的存取就必须是从头指针开始进行了。之后的每一个结点,其实就是上一个的后继指针指向的位置。雅加达娱乐城

  • 这里有个地方要注意,就是对头指针概念的理解,这个很重要。“链表中第一个结点的存储位置叫做头指针”,如果链表有头结点,那么头指针就是指向头结点数据域的指针。画一个图吧。

  • 这个图看起来很清晰了。比如说头结点,我们就可以这么描述了:

  • 头结点是为了操作的统一与方便而设立的,放在第一个元素结点之前,其数据域一般无意义(当然有些情况下也可存放链表的长度、用做监视哨等等)。
  • 有了头结点后,对在第一个元素结点前插入结点和删除第一个结点,其操作与对其它结点的操作统一了。
  • 首元结点也就是第一个元素的结点,它是头结点后边的第一个结点。
  • 头结点不是链表所必需的。
  • 是的,对于头指针,我们也可以有相应的理解了。

  • 在线性表的链式存储结构中,头指针是指链表指向第一个结点的指针,若链表有头结点,则头指针就是指向链表头结点的指针。
  • 头指针具有标识作用,故常用头指针冠以链表的名字。
  • 无论链表是否为空,头指针均不为空。头指针是链表的必要元素。
  • 单链表也可以没有头结点。如果没有头结点的话,那么单链表就会变成这样:

了解了单链表的结构,对后面的代码描述就轻松多了。

时间: 2024-10-13 02:59:00

单链表的头指针、头结点与首元结点的相关文章

链表总的首元结点、头结点、头指针的区别

前言,:今天看书的时候,又复习了一下链表的知识点,但是标题上这个知识点老是弄混淆,所以接下来做一个小小的总结,给自己加深理解. 一.三者的基本概念; 1.首元结点:就是指链表中存储第一个数据元素a1的结点,如下表格所示结点ZHAO就是首元结点: L-----> 数据域和指针域-----> ZHAO+指针域---->   2.头结点:它是在首元结点之前附设的一个节点,其指针域指向首元结点.头结点的数据域可以不存储任何信息,也可以存储与数据元素类型的其他附加信息,例如,当数据元素为整数型时,

头指针 头结点

头指针:是必须的(头指针标识了这个链表 LinkList *L  L就是头指针) 头结点:不是必须的(没有头结点时,头指针指向第一个数据元素的位置)

20140428 宏定义 单链表翻转 野指针

1.宏定义swap,加括号有什么意义 #define swap(x,y) x = (x)+(y):y=(x)-(y):x=(x)-(y) 加括号是为了处理表达式参数(即宏的参数可能是个算法表达式)时不出错,因为宏替换就是文本替换,所以如果有以下情况: #define COM(A,B) (A)*(B) 那么COM(6+5,3),它会换成这样: (6+5)*(3) 但是如是去掉了定义中括号,即写成这样: #define COM(A,B) A*B 那么COM(6+5,3),它就会换成这样:6+5*3

头指针 头节点

typedef struct LNode { ElemType data; struct Lnode* next; }Lnode, *LinkList; 若L是LinkList类型的变量,则L为单链表的头指针,它指向表中第一个节点.

已知单链表的数据元素为整型数且递增有序,L为单链表的哨兵指针。编写算法将表中值大于X小于Y的所有结点的顺序逆置。(C语言)

对此题目的完整示例可直接运行代码如下: #include <stdio.h> #include <stdlib.h> typedef struct LNode{ int data; struct LNode *next; }LNode; LNode* creat(int n){ LNode *Link; LNode *p1,*p2; int data; Link=(LNode*)malloc(sizeof(LNode)); p2=Link; for(int i=0;i<n;+

删除首元结点的算法步骤

昨天研究了链队列的入队操作,那么现在再来看看链队列的出队操作吧. 出队操作时,就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩一个元素时,则需将rear指向头结点.还是画个图理解一下吧. 一般情况下,链队列的出队图示:老品牌娱乐城 如果链队列只剩下一个元素的时候,出队则如下图: 具体步骤如下: 如图中,要删除掉a1结点,思路很简单,就是让头结点Q->front的后继next直接指向a2.但是a2如何标识呢? 假设a1结点为p结点,那么a2就是p->next了.如何

C语言单链表

学过线性表中的顺序表的都知道,顺序表里的数据在物理内存上是相邻的,所以当我们在顺序表中想要访问下一个元素时可以直接去访问,就像数组一样.但是单链表却不同,单链表的数据存储的位置是动态分配的,也就是说单链表的存储在物理内存上不是相邻的,所以我们就只能通过指针这种方式来把单链表串起来,通过指针来访问下一个结点. 单链表结点 单链表的结点里有数据域和指针域,数据域是用来储存数据的,指针域是用来储存直接后继结点的域. typedef struct Node{ int data;//数据域 struct

(java实现)单链表

什么是单链表 在了解单链表之前,你知道什么是链表吗?如果你不知道什么是链表,可以看看我的这篇博客<链表-LinkList> 单链表是链表的其中一种基本结构.一个最简单的结点结构如图所示,它是构成单链表的基本结点结构.在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点. 因为只有一个指针结点,称为单链表. 单链表中三个概念需要区分清楚:分别是头指针,头节点和首元节点. 头结点.头指针和首元结点(此段转自@ciyeer大牛的博客) 头结点:有时,在链表的第一个结点之前会额外增设

如何使用C++实现单链表

线性表--链表 为什么假期也在发文章 //TODO NullGirlfrindException 请忽略以上两行无聊的事实...... 如何弥补顺序表的不足之处? 第一次学习线性表一定会马上接触到一种叫做顺序表(顺序存储结构),经过上一篇的分析顺序表的优缺点是很显然的,它虽然能够很快的访问读取元素,但是在解决如插入和删除等操作的时候,却需要移动大量的元素,效率较低,那么是否有一种方法可以改善或者解决这个问题呢? 首先我们需要考虑,为什么顺序表中的插入删除操作会涉及到元素的移动呢? 好家伙,问题就