在高一凡编写的算法书P20页写着:
//销毁链表时用了引用
void DestroyList(LinkList &L)
{
LinkList q;
while(L)
{
q = L->next;
free(L);
L = q;
}
}
//清空链表没有使用引用
void ClearList(LinkList L)
{
LinkList p = L->next;
L->next = NULL;
DestroyList(p);
}
一开始我是不能接受清空链表函数ClearList(),不使用引用或者*L(二级指针)的。
我们大多数的人可能都会想,L链表确实改变了,DestroyList()使用了引用,怎么ClearList()就不需要使用呢?
科普:L->next = p; 表示将变量p赋值给结构体指针L所指的next变量。一般多用于链表、队列和堆栈等。
函数ClearList()中 L->next = NULL 表示指针L指向的地方(next指针),并且给指针next赋值为NULL(这一句要重点理解)。
如果L不是指向链表的指针,而是一个普通的指针,换成*L(指针指向的值嘛)时,大家肯定都懂:
L->next = NULL;换成下面两行
*L = NULL;
next = *L;
所以不管是真正的指针L,还是指针L在函数ClearList()中的copy,指向的值都是一样的,这一点肯定没问题。