头节点的数据域一般不记录信息。
注意区分头结点和头指针的区别:
1)头指针:是指链表指向第一个节点的指针,若链表有头结点,则是指向头结点的指针。
头指针具有标识作用,所以常用头指针冠以链表名字(指针变量的名字)。
无论链表是否为空,头指针均不为空。
头指针是链表的必要元素。
2)头结点:头结点是为了操作的统一和方便而设立的,放在第一个元素的结点之前,其数据域一般无意义(但也可以用来存放链表的长度)。
有了头结点,在第一元素结点前插入结点和删除第一结点的操作与其他结点的操作就统一了。
头结点不一定是链表的必须要素。
在C语言中,可以用结构体指针来描述单链表
typedef struct Node
{
ElemType data;
struct Node *Next;
}Node;
typedef struct Node*LinkList
链式存储结构GetElem操作的代码实现
/*初始条件:链式线性表L已存在,1 <= i <= Listlength(L) */
/*操作结构:用e返回L中第i个数据元素的值 */
Status GetElem( LinkList L, int i, ElemType *e )
{
int j;
LinkList p;
p = L->next;
j = 1;
while( p && j<i )
{
p = p->nest;
j++;
}
if( !p || j>i )
{
return ERROR;
}
*e = p->data;
return OK;
}
这个算法的核心思想叫做“工作指针后移”,这也是很多算法的常用技术。