1,单链表分为带头结点和不带头结点,带头节点的好处,只有实际写代码后才能体会出来。可以类比顺序表中的哨兵
好处:
1,第1个位置的插入、删除更加方便,带来操作上的统一。
2,对于头插法:
不带头结点的链表,插入第一个结点时,需要特殊处理,删除操作类似.
3,优势2:统一空表和非空表的处理
举例:无头结点链表的头插法实现函数,不太明白,为什么网上搜到的样例,总是在循环之前建立了一个结点,放入循环中建立,本人测试并无问题。
typedef struct Link { int elem; struct Link *next; }link; //无头结点链表的头插法实现函数 link * creatLink(int * arc, int length) { int i; //最初状态下,头指针 H 没有任何结点,所以,插入第一个元素,就相当于是创建结点 H link * H = NULL; //如果采用头插法插入超过 1 个元素,则可添加到第一个结点 H 之前 for (i = 0; i<length; i++) { link * a = (link*)malloc(sizeof(link)); a->elem = arc[i]; //插入元素时,首先将插入位置后的链表链接到新结点上 a->next = H; //然后再链接头指针 H H = a; } return H; } //网上样例,无头结点链表的头插法实现函数 link * creatLink(int * arc, int length) { int i; //最初状态下,头指针 H 没有任何结点,所以,插入第一个元素,就相当于是创建结点 H link * H =(link*)malloc(sizeof(link)); H->elem = arc[0]; H->next = NULL; //如果采用头插法插入超过 1 个元素,则可添加到第一个结点 H 之前 for (i = 1; i<length; i++) { link * a = (link*)malloc(sizeof(link)); a->elem = arc[i]; //插入元素时,首先将插入位置后的链表链接到新结点上 a->next = H; //然后再链接头指针 H H = a; } return H; }