在使用单链表时,一直有一个疑惑,初始化单链表时为什么要用二级指针?
代码如下:
typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */
typedef struct Node
{
ElemType data;
struct Node * next;
}Node, *LinkList;/*LinkList为结构指针类型*/
void InitList(LinkList *L) /* 等价于Node **L,二级指针 */
{
*L = (LinkList)malloc(sizeof(Node));//建立头结点
(*L)->next = NULL;//建立空的单链表
}
在初始化过程中,需要修改头指针,因此要用到二级指针传递头指针的地址,这样才能修改头指针。这与普通变量类似,当需要修改普通变量的值,需传递其地址。使用二级指针,很方便就修改了传入的结点一级指针的值。 如果用一级指针,则只能通过指针修改指针所指内容,却无法修改指针的值,也就是指针所指的内存块。
用框图表示链表中二级指针或者一级指针的使用
总结:
在使用带头结点
的单链表时
1、初始化链表头部指针需要用二级指针
2、销毁链表需要用到二级指针
3、插入、删除、遍历、清空结点用一级指针即可
注意:
如果是不带头结点的单链表,插入、删除和清空结点也需要二级指针(比如往空链表中插入一个节点时,新插入的节点就是链表的头指针,此时会改动头指针。同理,删除第一个结点和清空结点都会改动头指针)。