大家都知道单链表是由头结点和0~n个结点构成,头结点和结点的数据类型相同,都是自定义的结点数据类型:
这里定义一种:
typedef struct LNode{ ElemType data; LNode *next; }LNode, *LinkList;
虽然头结点和结点的数据类型相同,但是他们又有很大区别。
(1)作用不同
单链表虽然是单向的,但涉及到单链表操作都要先找到单链表的第一个结点,头结点的作用就是始终指向第一个结点。而普通的结点则是保存数据元素和指向下一个结点的指针。
(2)构成不同
头结点和普通结点的类型相同,但是普通结点即包含数据项又包含指向下一个结点的指针。而头结点不含数据项(也可以自行增加一个保存链表的长度的数据项),只包含一个指向头结点的指针,这个指针和头结点指针类型相同,头结点指针是指向这个指针的指针。
LNode * *header; //定义一个头结点 LNode *node; //定义一个普通结点 *header=node; //将头结点指针指向普通结点(3)生存周期不同
在新建和清空一个链表时,是不包含普通结点的,只保留一个头结点。但是,只要有普通结点,就要有一个头结点。
举一个例子:新建一个单链表并采用键盘输入的方式初始化
void CreatLinkList(LNode *LinkList, int n) { LNode **header; LNode *p; LinkList->next=NULL; int i; for(i=0;i<n;i++) { p=(LNode *)malloc(sizeof(LNode)); scanf(&(p->data)); p->next=LinkList->next; LinkList->next=p; } *header=LinkList; }