📚参考资料:《数据结构C语言版》-严蔚敏
目录
特点:用一组任意的存储单元存储线性表的数据元素(可以连续,可以不连续)。
对于数据元素ai来说,除存储本身的信息之外,还需要存储直接后继的存储位置。这两部分信息组成元素ai的存储映像,称为结点。
结点包括两个域:
- 数据域:存储数据元素信息的域
- 指针域:存储直接后继存储位置的域。指针域中存储的信息称作指针或链。
n个结点(ai(1<=i<=n)的存储映像)链结成一个链表,即为线性表的存储结构。
一、单链表
1.1初始化单链表
链表的每个结点中只包含一个指针域,称作线性链表或单链表
(图1)
接下来我们来看一个单链表的示例,理解一下上述概念
(图2)
(图3)
//单链表的存储结构 typedef struct Lnode { ElemType data; //结点的数据域 struct Lnode *next; //结点的指针域 }Lnode,*LinkList; //Linklist为指向结构体Lnode的指针类型
- 为了提高程序的可读性,在此对同一结构体指针类型起了两个名称,LinkList与Lnode*,两者本质上是等价的。
- 通常习惯上,用LinkList定义单链表,强调定义的是某个单链表的头指针;用Lnode*定义指向单链表中任意结点的指针变量。
我们看个例子:
若定义LinkList L,则L为单链表的头指针。若定义Lnode *p,则p为指向单链表中某个节点的指针,用*p代表该结点,当然也可以定义为LinkList p,这种定义形式完全等价于Lnode *p。
- 单链表由表头指针唯一确定因此单链表可以用头指针的名字来命名。如果头指针名是L,则简称该链表为表L
- Q:如何区分指针变量和结点变量?
A:如果定义LinkList p或Lnode *p,则p为指向某结点的指针变量,表示该节点的地址;而*p为对应的节点变量,表示该结点的名称。
Q:看了这么多概念,那首元结点、头结点、头指针有什么区别呢?
A:
- 首元结点是指链表中存储第一个数据元素ai的结点 ,也就是图3中的“zhao”
- 头节点是在首元结点之前附设的一个结点,其指针域指向首元结点(也就是图3中的L)。头节点的数据域可以不存储任何信息,也可以存储与数据元素类型相同的其他附加信息。例如,当数据元素为整数型时,头结点的数据域中可存放该线性表的长度。
- 头指针是指向链表中第一个结点的指针(也就是图3中“L”指向“zhao”的指针)。若链表设有头结点,则头指针所指结点为线性表的头结点;若链表不设结点,则头指针所指结点为该线性表的首元结点。
Q:链表增加头结点有什么作用?
A:便于首元结点的处理、便于空表和非空表的统一处理。