带头链表的创建和销毁
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;
}
希望各位大佬多多指点。
以上是关于带头链表的创建和销毁的主要内容,如果未能解决你的问题,请参考以下文章