带头链表的创建和销毁

Posted 别碰我的宏定义

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带头链表的创建和销毁相关的知识,希望对你有一定的参考价值。

1.有头链表和无头链表的区别 :
有头链表,链表的添加和删除元素时,情况是相同的,除了初始化和销毁需要传入头指针的内容外,其他时候都不需要传入,
无头链表的话在面试中较多,除过头插,头删外,和有头链表的操作差别不大。
2.话不多说,贴上代码

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<assert.h>
typedef int DateType;  //定义数据类型
typedef struct SListNode
{
	DateType date;
	struct SListNode *next;
}Node;
Node* BuyListNode(DateType date);   //创建节点
//带头链表初始化,创建头节点
void SHListInit(Node **Head);
//头插,头删,尾插,尾删,销毁
void SHListPushFront(Node *Head,DateType date);
void SHListPopFront(Node *Head);
void SHListPushBack(Node *Head,DateType date);
void SHListPopBack(Node *Head);
void SHListDistroy(Node **Head);
//打印函数
void Print(Node *Head);
void test1();

3,贴上功能模块代码

#include"SHList.h"
void SHListInit(Node **Head)
{
	assert(Head);   //判断其头节点是否传入正确
	*Head = BuyListNode(0);//给头节点的数据域赋予任意值
	(*Head)->next= NULL;
}
Node* BuyListNode(DateType date)
{
		//1.动态申请内存,注意最后需要在删除和销毁的时候用
		//2.free将mallo申请的内存释放掉
		//3.申请完成后需要判断空间申请是否成功
	Node *node = (Node *)malloc(sizeof(Node));
	if (node == NULL)
	{
		printf("节点创建失败 \\n");
		exit(0);
	}
	node->next = NULL;
	node->date = date;
	return node;
}
//头插,头删,尾插,尾删,销毁
void SHListPushFront(Node *Head,DateType date)
{
	//头插,尾插和任意插的方式是一样的,和无头链表的插法相同
	assert(Head != NULL);
	Node *node= BuyListNode(date);
	node->next = Head->next;
	Head->next = node;
}
void SHListPopFront(Node *Head)
{
	assert(Head != NULL);
	Node *node = Head;
	//头删需要判空,为空,则不可删除
	if (node->next == NULL)
	{
		printf("此链表已空,无任何数据\\n");
		exit(0);
	}
	node = Head->next;
	Head->next = node->next;
	free(node);
	node = NULL;
}
void SHListPushBack(Node *Head,DateType date)
{
	assert(Head != NULL);
	Node *NewNode = BuyListNode(date);
	Node *node=Head;
	//尾插,找最后一个节点,然后将创建的元素插入即可
	while (node->next)
	{
		node = node->next;
	}
	node->next = NewNode;
}
void SHListPopBack(Node *Head)
{
	assert(Head != NULL);
	Node *node = Head;
	//尾删也需要判断是否已空
	if (node->next == NULL)
	{
		printf("链表已空,无法进行操作\\n");
	}
	//找当前元素的下一个元素的next 是否已经空,
	//若为空,则当前元素的下一个就是待删除元素
	//否则指针后移
	while (node->next->next != NULL)
	{
		node = node->next;
	}
	free(node->next);
	node->next	= NULL;
}
void Print(Node *Head)
{
	assert(Head != NULL);
	Node *node = Head->next;
	while (node)
	{
		printf("%d ", node->date);
		node = node->next;
	}
	printf("\\n");
}
//销毁链表,由于时malloc创建的,故需要用free将所有节点删除。
void SHListDistroy(Node **Head)
{
	assert(*Head != NULL);		
	Node *node = (*Head)->next;
	Node *cur = NULL;
	while (node)
	{
		cur = node->next;
		(*Head)->next = cur;
		free(node);
		node = (*Head)->next;
	}
	free(*Head);
}
void test1()
{
	Node *Head;
	SHListInit(&Head);
	SHListPushFront(Head, 1);
	SHListPushFront(Head, 2);
	SHListPushFront(Head, 3);
	SHListPushFront(Head, 4);
	SHListPushFront(Head, 5);
	SHListPushFront(Head, 6);
	SHListPushFront(Head, 7);
	Print(Head);
	SHListPopFront(Head);
	SHListPopFront(Head);
	SHListPopFront(Head);
	Print(Head);
	SHListPushBack(Head, 8);
	SHListPushBack(Head, 9);
	SHListPushBack(Head, 10);
	SHListPushBack(Head, 11);
	Print(Head);
	SHListPopBack(Head);
	SHListPopBack(Head);
	SHListPopBack(Head);;
	Print(Head); 
	SHListDistroy(&Head);
}
#include"SHList.h"
int main()
{
	test1();
	system("pause");
	return 0;
}

希望各位大佬多多指点。

以上是关于带头链表的创建和销毁的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之带头结点的循环双向链表详细图片+文字讲解

《链表》之带头双向循环链表

数据结构请编程实现一个对单链表进行基本操作系统,主要包括链表的创建,查询,插入,删除,销毁等操作。

带头节点的双向链表

带头双向循环链表的实现@线性表

数据结构之链表