若线性表为空表,则头结点的指针域为“空”,如图所示。
这里我们大概地用图示表达了内存中单链表的存储状态。
看着满图的省略号“……”,你就知道是多么不方便。而我们真正关心的:它是在内存中的实际位置吗?不是的,这只是它所表示的线性表中的数据元素及数据元素之间的逻辑关系。
所以我们改用更方便的存储示意图来表示单链表,如图所示。
- 若带有头结点的单链表,则如图所示。
空链表如图所示。
单链表中,我们在C语言中可用结构指针来描述。
/* 线性表的单链表存储结构 */
typedef struct Node
{
ElemType data;
struct Node *next;
} Node;
/* 定义LinkList */
typedef struct Node *LinkList;
从这个结构定义中,我们也就知道,结点由存放数据元素的数据域和存放后继结点地址的指针域组成。
假设p是指向线性表第i个元素的指针,
- 该结点ai的数据域我们可以用p->data来表示,p->data的值是一个数据元素,
- 结点ai的指针域可以用p->next来表示,p->next的值是一个指针。
p->next指向谁呢?当然是指向第i+1个元素,即指向a i+1 的指针。
也就是说,如果p->data=a i ,那么p->next->data=a i+1 (如图所示)。