销毁带头单链表,为什么要传入二级指针进行销毁

使用两种简单的代码列子进行解说。 有这样一个结构体:

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("单链表头节点删除失败
");
}
  1. 打印结果:单链表头节点删除失败
  2. 原因: 函数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("单链表头节点删除失败
");
}
  1. 打印结果:单链表头节点删除成功
  2. 原因: 函数deleteList(LPNODE* head) 中的 head 是二级指针 *head 就代表了 headNode ,因此,*head = NULL; 就代表 headNode = NULL;
经验分享 程序员 微信小程序 职场和发展