清空链表和销毁链表

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

  1. 清空链表:将所有除头节点以外的存放有数据的节点释放掉
  2. 销毁链表:将包括头结点在内的所有节点释放掉

注意:当清空所有有数据的节点,并且释放头结点后,该链表就无法再通过头结点创建,访问,插入,删除节点,因此相当于销毁了此链表

清空链表

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
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;
}

在这里插入图片描述
注意:清空链表后,链表还是可以继续使用
在这里插入图片描述
画图说明:
在这里插入图片描述

销毁链表

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
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;
}

在这里插入图片描述

注意销毁链表后,就不能对链表进行任何操作,否则为访问权限冲突,因为头结点指向的内存的操作权限已经归还给了操作系统
在这里插入图片描述
画图说明:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_53157173/article/details/113951457
今日推荐