使用两种简单的代码列子进行解说。
有这样一个结构体:
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("单链表头节点删除成功\n");
}
else
{
printf("单链表头节点删除失败\n");
}
- 打印结果:单链表头节点删除失败
- 原因:
- 函数
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("单链表头节点删除成功\n");
}
else
{
printf("单链表头节点删除失败\n");
}
- 打印结果:单链表头节点删除成功
- 原因:
- 函数
deleteList(LPNODE* head)
中的 head 是二级指针 *head
就代表了headNode
,因此,*head = NULL;
就代表headNode = NULL;
- 函数