问答题 如何使用链表头
【正确答案】
【答案解析】在回答这个问题前,首先弄清楚一个概念,什么是结点?简单地说,结点表示的就是数据域与指针域的和,数据域存储数据元素的信息,指针域指示直接后继存储位置,所以结点表示数据元素或数据元素的映像关系。
单链表的开始结点之前附设一个类型相同的结点,称之为头结点,头结点的数据域可以不存储任何信息(也可以存放如线性表的长度等附加信息),头结点的指针域存储指向开始结点的指针(即第一个元素结点的存储位置)。如图所示为带头结点的单链表。

图1 带头结点的单链表

头结点的作用主要有以下两点:
1)对带头结点的链表,在表的任何结点之前插入结点或删除表中任何结点,所要做的都是修改前一结点的指针域,因为任何元素结点都有前驱结点。若链表没有头结点,则首元素结点没有前驱结点,在其前插入结点或删除该结点时操作会复杂些。
2)对带头结点的链表,表头指针是指向首结点的非空指针,因此空表与非空表的处理是一样的。
在实现运算时,需要动态产生出其头结点,并将其后继指针置为空。
void initial_List(node *L)
{
L=(node*)malloc(sizeof(node));
L->next=NULL;
}
需要注意的是,开始结点、头指针、头结点并不是一个概念,它们是有区别的。开始结点是指链表中的第一个结点,也就是没有直接前趋的那个结点,而链表的头指针是指向链表开始结点的指针(没有头结点时),单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。图2所示链表的头指针为head,则称该链表为链表head,在定义链表变量时可以这样声明:node *head,而头结点是人为地在链表的开始结点之前附加的一个结点。有了头结点之后,头指针指向头结点,无论链表是否为空,头指针总是非空。而且头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致(都是在某一结点之后)。