销毁带头单链表,为什么要传入二级指针进行销毁
使用两种简单的代码列子进行解说。 有这样一个结构体:
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;