哨兵节点:哨兵节点(sentinel)是一个哑元节点(dummy node),可以简化边界条件。是一个附加的链表节点,该节点作为第一个节点,它的值域中并不存储任何东西,只是为了操作的方便而引入的。如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点。
很多情况下,需要处理当前节点的前驱节点,如果是没有哨兵节点的链表,对第一个节点,即头节点,没有前驱节点。如果不作特殊处理,就可能出错;如果对它特别对待,就会增加代码复杂性,还会降低程序效率。而如果有哨兵节点的话, 线性表的每个位置的节点都有前驱节点,因此可以统一处理。
当链表为空时,没有哨兵节点的链表的头节点为NULL,处理起来也和其他情况不同。带哨兵节点的链表,当其为一个空链表时,仅含哨兵节点,哨兵节点的指针域为空,和其他情况的表尾是一样的。
定义链表的节点:
typedef struct _node{
int data;
struct _node *next;
}node, *pNode;
定义链表结构体的数据类型。
创建一个链表。
没有哨兵节点的情况:
pNode createList(void)
{
pNode temp;
pNode prev;
int input;
pNode head = NULL;
scanf("%d", &input);
while(input != -1){
temp = (pNode)malloc(sizeof(node));
temp->data = input;
temp->next = NULL;
//需要考虑链表为空的情况
if(head == NULL){
head = temp;
prev = temp