数据结构-C语言单链表的实现-尾插尾删头插头删


单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象)


指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。

下面代码包括尾插尾删 头插头删 任意位置插入和删除 查找 打印 释放


不?嗦直接上代码


下面是SinList.h


#pragma once

#include
#include
#include

typedef int SListDataType;

typedef struct SListNode
{
SListDataType data; // 数据域
struct SListNode* next; // 指针域
}SLTNode;

SLTNode* CreatSListNode(SListDataType x); // 创建一个结点
void SListPushBack(SLTNode** pphead, SListDataType x); // 尾插
void SListPopBack(SLTNode** pphead); // 尾删
void SListPushFront(SLTNode** pphead, SListDataType x); // 头插
void SListPopFront(SLTNode** pphead); // 头删
void SListInsertAfter(SLTNode** pphead, int pos, SListDataType x); // 在pos位置插入x
void SListEraseAfter(SLTNode** pphead, int pos); // 在pos位置删除x
SLTNode* SListFind(SLTNode** phead, SListDataType x); // 查找结点

void SListPrint(SLTNode* phead); // 打印链表
void FreeList(SLTNode** phead); // 释放链表

下面是SinList.c


#include "SinList.h"

SLTNode* CreatSListNode(SListDataType x)
{
SLTNode* newNode = (SLTNode*)malloc(sizeof(SLTNode));
if (newNode == NULL)
{
printf("申请空间失败!
");
exit(-1);
}
newNode->data = x; // 将数据赋给新结点的数据域
newNode->next = NULL; // 下一个结点为NULL

return newNode;
}

void SListPrint(SLTNode* phead)
{
int count = 0;
SLTNode* cur = phead; // 初始化当前值
while (cur != NULL) // 当前值不为空时
{
printf("%d->", cur->data);
cur = cur->next;
count++;
}
printf("NULL
");
printf("当前结点个数为:%d", count);
}

void SListPushBack(SLTNode** pphead, SListDataType x)
{
SLTNode* newNode = CreatSListNode(x);

if (*pphead == NULL) // 当头结点为空时直接赋值
*pphead = newNode;
else
{
SLTNode* tail = *pphead;
while (tail->next != NULL) // 找到最后一个结点
{
tail = tail->next;
}
tail->next = newNode; // 将新结点赋给最后一个结点的next
}
}

void SListPopBack(SLTNode** pphead)
{
if (*pphead == NULL) // 如果头结点为空
exit(-1);
else if ((*pphead)->next == NULL) // 当只有一个结点时
{
free(*pphead);
*pphead = NULL;
}
else // 有多个结点时
{
SLTNode* prev = NULL; // 定义一个跟踪结点
SLTNode* tail = *pphead;
while (tail->next != NULL) // 找到最后一个结点
{
prev = tail;
tail = tail->next;
}
free(tail); // 释放最后一个结点
prev->next = NULL; // 将最后一个结点置为NULL

}
}

void SListPushFront(SLTNode** pphead, SListDataType x)
{
SLTNode* newNode = CreatSListNode(x);
newNode->next = *pphead; // 新结点指向头结点
*pphead = newNode; // 新结点成为头结点
}

void SListPopFront(SLTNode** pphead)
{
if (*pphead == NULL) // 头结点为空
exit(-1);
else
{
SLTNode* next = (*pphead)->next;
free(*pphead); // 释放头结点
*pphead = next; // 第二个结点为头指针
}
}

SLTNode* SListFind(SLTNode** pphead, SListDataType x)
{
SLTNode* cur = *pphead;
while(cur) // 当前结点不为空时
{
if (cur->data == x) // 查找匹配项
return cur;
cur = cur->next;
}
return NULL;
}

void SListInsertAfter(SLTNode** pphead, int pos, SListDataType x)
{
if (*pphead == NULL)
exit(-1);

SLTNode* cur = *pphead;
SLTNode* newnode = CreatSListNode(x);

int curpos = 1; // 当前位置
while (cur->next != NULL && curpos < pos - 1) // 循环找到对应位置的前一个结点
{
cur = cur->next;
curpos++;
}
newnode->next = cur->next; // 新结点指向插入位置的后一个结点
cur->next = newnode; // 前一个结点指向新结点
}

void SListEraseAfter(SLTNode** pphead, int pos)
{
if (*pphead == NULL)
exit(-1);
if (pos == 1) // 删除第一个结点
*pphead = (*pphead)->next;
else
{
int curpos = 1; // 当前位置
SLTNode* prev = NULL; // 用于定位删除位置的前一个结点
SLTNode* cur = *pphead;
while (cur->next != NULL && curpos < pos) // 循环找到对应删除位置结点
{
prev = cur;
cur = cur->next;
curpos++;
}
prev->next = cur->next; // 删除位置前的结点指向要删除位置结点的后一个结点
free(cur); // 释放删除结点
}
}

void FreeList(SLTNode** phead)
{
SLTNode* current = *phead;
while (*phead != NULL)
{
*phead = current->next;
free(current);
current = *phead;
}
}
int main()
{
SLTNode* L = NULL;
SListPushBack(&L, 1);
SListPushBack(&L, 2);
SListPushBack(&L, 3);
SListPushBack(&L, 4);
SListPopBack(&L);
SListPushFront(&L, 6);
SListInsertAfter(&L, 7, 4);
SListEraseAfter(&L, 1);
SLTNode* ret = SListFind(&L, 7);
if (ret)
printf("%d存在
", ret->data);
else
printf("不存在
");
SListPrint(L);
FreeList(&L);
}

下面是代码运行图


相关文档

  • 华为mate30和nova5pro对比
  • 【数学建模】线性规划模型MATLAB求解(最优化)
  • 日常食谱
  • 小学少先队工作计划模板三篇小学少先队辅导员工作计划
  • 人教版三年级下册语文第三单元试卷及答案
  • 苹果手机被抢了怎么办
  • 未来大数据时代,Hadoop会被Spark取代?
  • c++ opencv调用摄像头程序
  • 小学学校安全黑板报内容
  • 飘荡在风中的歌
  • 招商银行实习周记优秀范文8篇
  • 关于大班毕业典礼的老师感言
  • 听故事_作文100字_小学二年级作文_第一范文网
  • 老年人高血压日常如何保健
  • 银耳不出胶是假银耳吗银耳熬不出胶有功效吗
  • 海底世界宣传抵制海豹制品演讲稿
  • 在深圳结婚证怎么办理
  • 虚拟地址与物理地址的概念
  • 2021国际三八妇女节小学生作文
  • 小学学年度第二学期音乐教研组工作总结范文
  • 《我不是胆小鬼》读后感(通用7篇)
  • 「阳台种菜视频」通心菜
  • 已婚男士喜欢怎样过男人节
  • 给残疾儿童捐物建议书精选
  • NR---PUSCH之一:协议流程梳理
  • 茶亭公园游记
  • 儿童皮肤过敏怎么办? 宝宝皮肤过敏怎么办
  • 八年级下册期末考试政治知识点
  • 父母教育孩子的句子
  • 电脑驱动安装总是失败
  • 电脑版