清空链表和销毁链表

清空链表和销毁链表

清空链表和销毁链表的区别:

清空链表:将所有除头节点以外的存放有数据的节点释放掉销毁链表:将包括头结点在内的所有节点释放掉注意:当清空所有有数据的节点,并且释放头结点后,该链表就无法再通过头结点创建,访问,插入,删除节点,因此相当于销毁了此链表清空链表代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS

#include

#include

typedef struct LinkNode

{

int num;

LinkNode* next;

}Lk, * lk;

//有头链表的初始化

lk initLinkNode()

{

//创建头结点

lk headNode = (lk)malloc(sizeof(Lk));

//检验头结点分配内存是否成功

if (headNode == NULL)

{

return NULL;

}

//初始化头结点

headNode->num = -1; //头结点不维护数据域,这行代码可写可不写

headNode->next = NULL;

//记录节点位置,方便插入新的数据

lk currentNode = headNode;

//让用户输入几个数,如果输入-1,结束输入

int val = -1;

while (1)

{

printf("请给当前链表赋值,输入-1结束输入:\n");

scanf("%d", &val);

if (val == -1)

{

break;

}

//开辟一个新节点存放数据

lk node = (lk)malloc(sizeof(Lk));

node->num = val;

node->next = NULL;

//利用记录当前位置的指针,将链表中最后一个节点与新开辟的节点相连接

currentNode->next = node;

//将记录当前位置的指针指向新的节点

currentNode = currentNode->next;

}

return headNode;

}

//遍历链表

void for_each_linkList(lk headNode)

{

if (headNode == NULL)

{

return;

}

//利用一个记录当前节点的指针,来遍历输出整个链表

lk curNode = headNode->next;

//循环结束条件:curNode指针为空

while (curNode)

{

printf("%d\n", curNode->num);

curNode = curNode->next;

}

}

//清空链表

void clear_LinkList(lk headNode)

{

if (headNode == NULL)

{

return;

}

//清空链表,是不清空头节点的,因此从第一个有数据的节点开始释放

lk curNode = headNode->next;

while (curNode != NULL)

{

//先保住下一个节点的位置

lk nextNode = curNode->next;

free(curNode);

curNode = nextNode;

}

//将头结点next指针置空

headNode->next = NULL;

}

int main()

{

lk headNode = initLinkNode();

clear_LinkList(headNode);

printf("链表遍历结果为:\n");

for_each_linkList(headNode);

return 0;

}

注意:清空链表后,链表还是可以继续使用

画图说明:

销毁链表代码语言:javascript复制#define _CRT_SECURE_NO_WARNINGS

#include

#include

typedef struct LinkNode

{

int num;

LinkNode* next;

}Lk, * lk;

//有头链表的初始化

lk initLinkNode()

{

//创建头结点

lk headNode = (lk)malloc(sizeof(Lk));

//检验头结点分配内存是否成功

if (headNode == NULL)

{

return NULL;

}

//初始化头结点

headNode->num = -1; //头结点不维护数据域,这行代码可写可不写

headNode->next = NULL;

//记录节点位置,方便插入新的数据

lk currentNode = headNode;

//让用户输入几个数,如果输入-1,结束输入

int val = -1;

while (1)

{

printf("请给当前链表赋值,输入-1结束输入:\n");

scanf("%d", &val);

if (val == -1)

{

break;

}

//开辟一个新节点存放数据

lk node = (lk)malloc(sizeof(Lk));

node->num = val;

node->next = NULL;

//利用记录当前位置的指针,将链表中最后一个节点与新开辟的节点相连接

currentNode->next = node;

//将记录当前位置的指针指向新的节点

currentNode = currentNode->next;

}

return headNode;

}

//遍历链表

void for_each_linkList(lk headNode)

{

if (headNode == NULL)

{

return;

}

//利用一个记录当前节点的指针,来遍历输出整个链表

lk curNode = headNode->next;

//循环结束条件:curNode指针为空

while (curNode)

{

printf("%d\n", curNode->num);

curNode = curNode->next;

}

}

//销毁链表

void disposal_LinkList(lk headNode)

{

if (headNode == NULL)

{

return;

}

//清空链表,是不清空头节点的,因此从第一个有数据的节点开始释放

lk curNode = headNode->next;

while (curNode != NULL)

{

//先保住下一个节点的位置

lk nextNode = curNode->next;

free(curNode);

curNode = nextNode;

}

//释放头结点

free(headNode);

//头结点指针置空

headNode = NULL;

}

int main()

{

lk headNode = initLinkNode();

//销毁链表

disposal_LinkList(headNode);

return 0;

}注意销毁链表后,就不能对链表进行任何操作,否则为访问权限冲突,因为头结点指向的内存的操作权限已经归还给了操作系统

画图说明:

相关风雨

回味经典:红警2各关卡名称及任务简述
be365

回味经典:红警2各关卡名称及任务简述

🌊 08-23 💨 阅读 3230
微会和易信:企业微信沟通的深度比较
365bet线上娱

微会和易信:企业微信沟通的深度比较

🌊 07-31 💨 阅读 8569
光盘不小心格式化后怎么恢复
be365

光盘不小心格式化后怎么恢复

🌊 10-07 💨 阅读 8310