销毁带头单链表,为什么要传入二级指针进行销毁
使用两种简单的代码列子进行解说。 有这样一个结构体:
typedef struct Node
{
          
   
	int data;			//数据域
	struct Node* next;	//指向下一个节点的指针域
}NODE, *LPNODE; 
头节点的创建
LPNODE headNode = (LPNODE)malloc(sizeof(NODE)); assert(headNode); //断言 headNode->next = NULL:
传入一级指针
函数实现
//销毁函数——传入一级指针
void deleteList(LPNODE head)
{
          
   
	free(head);
	head = NULL;
} 
调用函数
deleteList(headNode);
if(headNode == NULL)
{
          
   
	printf("单链表头节点删除成功
");
}
else
{
          
   
	printf("单链表头节点删除失败
");
} 
- 打印结果:单链表头节点删除失败
 - 原因: 函数deleteList(LPNODE head) 中的 head 是临时的,当调用完该函数,head 的内存就会被回收。 虽然 head 保存了头节点 headNode 中保存的地址,但是head 时一级指针,head = NULL; 不代表 headNode = NULL;
 
传入二级级指针
函数实现
//销毁函数——传入一级指针
void deleteList(LPNODE* head)
{
          
   
	free(*head);
	*head = NULL;
} 
调用函数
deleteList(&headNode);
if(headNode == NULL)
{
          
   
	printf("单链表头节点删除成功
");
}
else
{
          
   
	printf("单链表头节点删除失败
");
} 
- 打印结果:单链表头节点删除成功
 - 原因: 函数deleteList(LPNODE* head) 中的 head 是二级指针 *head 就代表了 headNode ,因此,*head = NULL; 就代表 headNode = NULL;
 
