带头链表的创建和销毁

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;
}

希望各位大佬多多指点。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值