链式存储结构:动态存储过程。根据所需要的元素(结点)随时申请存储空间(不需要连续的空间),即逻辑上连续的元素(结点)不要求物理(存储)上也连续,它是通过所谓的“链”拉起来。
单链表
设有一线性表,元素分别是a1、a2和a3,存储情形如下:
每个元素都包含两个域(数据元素信息和指向链表中另一个结点的指针)。即,
此时称各元素为“结点”,由一个“链”拉起来,称为链表。由于指针是向一个单方向指,所以称作“单链表”(后面还会有前后两个方向的指针指向的链表称为“双链表”)。为形象起见,将前面的存储方式画成下述情况(要了解图形的真实含义)。即,
其中:
head称为头指针(head放置头结点的起始地址);
a1所在的结点称为头结点;
a3所在的结点称为尾结点(其指针域为空,即NULL,用斜线表示)。
单链表的头结点(a1)没有前驱,尾结点(a3)没有后继,而结点(a2)只有唯一的前驱和唯一的后继结点,所以符合“线性”特点。
C语言表示
- 定义
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;// 递归定义
} LNode,*LinkList;
其中:LNode为结构体类型,而LinkList为结构体指针类型
LNode *head,*p,*L;//头指针和指针或LinkList head,p,L;
对结点P的数据域和指针域的表示:
为方便起见,专门为单链表设置一个专用“头结点”作为标志,它的数据域无意义,而指针域指向链表的第一个结点。于是出现“带”和“不带”头结点的单链表。
-
“带”头结点的单链表
-
“不带”头结点的单链表
注意:L称为头指针(有时也用head),操作链表时它总是指向头结点(千万不能丢),操作链表时,要另设辅助指针协助。