文章目录

  • 一、什么是单链表
    • (一)单链表结点的数据结构
    • (二)非空单链表数据结构
  • 二、单链表的各个功能实现
    • (一)初始化
      • 1、算法步骤
      • 2、算法代码
    • (二)查找元素
      • 1、算法步骤
      • 2、算法代码
    • (三)插入元素
      • 1、算法步骤
      • 2、算法代码
    • (四)删除元素
      • 1、算法步骤
      • 2、算法代码
    • (五)销毁链表
  • 三、全部代码

一、什么是单链表

每个结点只包含一个指针域的链表,称为单链表。

(一)单链表结点的数据结构

单链表结点的数据结构图

// 结点结构体
typedef struct node
{ElemType value;struct node* link;}Node;

(二)非空单链表数据结构

非空单链表的数据结构图

// 单链表结构体
typedef struct headerSingleList
{Node* head;int n;
}HeaderSingleList;

二、单链表的各个功能实现

(一)初始化

1、算法步骤

单链表的初始化:
(1)单链表的头指针赋值为 N U L L NULL NULL
(2)单链表的长度初始化为0

2、算法代码

// 单链表的初始化
Status Init(HeaderSingleList* list)
{list->head = NULL;list->n = 0;return OK;
}

(二)查找元素

1、算法步骤

算法步骤:
(1)判断索引是否越界
(2)从头结点开始依次遍历单链表,直到找到目标结点
(3)将找到的值返回

2、算法代码

void GetValue(HeaderSingleList* list, int i, int* value)
{printf("调用了 GetValue() 函数\n");Node* node = list->head;for (int j = 0; j < i; j++){node = node->link;}*value = node->value;
}

(三)插入元素

1、算法步骤

单链表的插入是指将新元素 x x x 插入到 初始链表 a i a_i ai​ 结点的后面。
算法步骤:
(1)为元素 x x x 生成新的结点,由指针 n o d e node node 指向该结点,并将结点数据域 v a l u e value value 的值置为 x x x
(2)若传入的索引值 i = − 1 i = -1 i=−1,则表示要将新元素插入到头结点
(3)若传入的索引值 i > − 1 i > -1 i>−1,则表示要将新元素插入到非头结点,即新结点成为结点 a i a_i ai​的直接后继结点, a i + 1 a_{i+1} ai+1​的直接前驱结点。

2、算法代码

// 单链表的插入
Status Insert(HeaderSingleList* list, int i, int value)
{// 如果插入的位置越界,则返回错误if (i < -1 || i > list->n - 1){return Error;}Node* newNode = malloc(sizeof(Node));Node* before = list->head;for (int j = 0; j < i; j++){before = before->link;}newNode->value = value;// 如果不是插入在头结点if (i > -1){newNode->link = before->link;before->link = newNode;}// 如果插入在头结点else{newNode->link = list->head;list->head = newNode;}printf("调用了 Insert() 函数\n");list->n++;
}

(四)删除元素

1、算法步骤

删除索引值所在的结点,即删除 a i a_i ai​
(1)若要删除的结点越界,返回错误

(2)查找要删除元素 a i a_i ai​ 的直接前驱结点 a i − 1 a_{i-1} ai−1​,并令指针 b e f o r e N o d e beforeNode beforeNode 和 d e l e t e N o d e deleteNode deleteNode 分别
指向 a i − 1 a_{i-1} ai−1​ 和 a i a_{i} ai​ ,即 N o d e ∗ b e f o r e N o d e = a i − 1 Node*beforeNode = a_{i-1} Node∗beforeNode=ai−1​, N o d e ∗ d e l e t e N o d e = a i Node*deleteNode = a_{i} Node∗deleteNode=ai​

(3)若 i = 0 i=0 i=0,则表示删除头结点;若 i > 0 i >0 i>0,则使 d e l e t e N o d e deleteNode deleteNode 指向 a i a_i ai​ 结点,删除 a i a_i ai​

(4)释放 d e l e t e N o d e deleteNode deleteNode 所指向空间的内存

(5)链表长度 - 1,返回 O K OK OK



2、算法代码

void Delete(HeaderSingleList* list, int i)
{if (list->n == 0){return Error;}if (i < 0 || i >list->n - 1){return Error;}Node* beforeNode = list->head;Node* deleteNode = NULL;// 如果删除头结点if (i == 0){list->head = list->head->link;}// 如果删除的不是头结点else{// 找到要删除节点的前一个结点for (int j = 0; j < i-1; j++){beforeNode = beforeNode->link;}// 此时的 beforNode 是所要删除结点的前一个结点deleteNode = beforeNode->link;       // 要删除的结点deleteNode 为 beforNode 的下一个结点beforeNode->link = deleteNode->link;       // 将要删除结点的前一个结点的 link 指向 要删除结点的下一个结点free(deleteNode);}printf("调用了 Delete(\%d) 函数\n", i);list->n--;
}

(五)销毁链表

// 单链表的销毁
void Destory(HeaderSingleList* list)
{printf("调用了 Destory() 函数\n");Node* node = list->head;while (list->head){node = node->link;free(list->head);list->head = node;}
}

三、全部代码

#include <stdio.h>
#define ElemType int
#define Error 0
#define OK 1
#define Overflow 2
#define Underflow 3
#define NotPresent 4
#define Duplicate 5
typedef int Status;// 结点结构体
typedef struct node
{ElemType value;struct node* link;}Node;// 单链表结构体
typedef struct headerSingleList
{Node* head;int n;
}HeaderSingleList;// 单链表的初始化
Status Init(HeaderSingleList* list)
{list->head = NULL;list->n = 0;return OK;
}// 单链表的插入
Status Insert(HeaderSingleList* list, int i, int value)
{// 如果插入的位置越界,则返回错误if (i < -1 || i > list->n - 1){return Error;}Node* newNode = malloc(sizeof(Node));Node* before = list->head;for (int j = 0; j < i; j++){before = before->link;}newNode->value = value;// 如果不是插入在头结点if (i > -1){newNode->link = before->link;before->link = newNode;}// 如果插入在头结点else{newNode->link = list->head;list->head = newNode;}printf("调用了 Insert() 函数\n");list->n++;
}void Delete(HeaderSingleList* list, int i)
{if (list->n == 0){return Error;}if (i < 0 || i >list->n - 1){return Error;}Node* beforeNode = list->head;Node* deleteNode = NULL;// 如果删除头结点if (i == 0){list->head = list->head->link;}// 如果删除的不是头结点else{// 找到要删除节点的前一个结点for (int j = 0; j < i-1; j++){beforeNode = beforeNode->link;}// 此时的 beforNode 是所要删除结点的前一个结点deleteNode = beforeNode->link;       // 要删除的结点deleteNode 为 beforNode 的下一个结点beforeNode->link = deleteNode->link;       // 将要删除结点的前一个结点的 link 指向 要删除结点的下一个结点free(deleteNode);}printf("调用了 Delete(\%d) 函数\n", i);list->n--;
}void GetValue(HeaderSingleList* list, int i, int* value)
{printf("调用了 GetValue() 函数\n");Node* node = list->head;for (int j = 0; j < i; j++){node = node->link;}*value = node->value;
}// 单链表的销毁
void Destory(HeaderSingleList* list)
{printf("调用了 Destory() 函数\n");Node* node = list->head;while (list->head){node = node->link;free(list->head);list->head = node;}
}void PrintAllValue(HeaderSingleList* list)
{Node* node = NULL;node = list->head;while (node){printf("%d -> ", node->value);node = node->link;}printf("NULL\n\n");}int main()
{HeaderSingleList* list = malloc(sizeof(HeaderSingleList));Init(list);Insert(list, -1, 4);Insert(list, -1, 3);Insert(list, -1, 2);Insert(list, -1, 1);Insert(list, -1, 0);/*int x = 0;GetValue(list, 0, &x);printf("%d\n", x);*/PrintAllValue(list);Delete(list, 1);PrintAllValue(list);Destory(list);PrintAllValue(list);}

线性表的单链表存储结构相关推荐

  1. 这一篇让你弄懂线性表的链式存储结构

    线性表的链式存储结构以及单链表概念 本篇内容是线性表链式存储结构的相关概念 这里有几篇线性表的干货供大家讨论学习: 这里是吐血总结的线性表顺序存储结构 这里是单链表的各种操作,超详细~ 双向链表.循环 ...

  2. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

  3. 线性表的链式存储结构以及单链表的插入和删除原理实现

    线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...

  4. 链表list(链式存储结构实现)_5 线性表的链式存储结构

    系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...

  5. 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

    线性表的链式存储结构 数据结构系列文章 第三章 循环链表.双向链表 文章目录 线性表的链式存储结构 前言 一.循环链表 (一)定义 (二)尾指针 二.双向链表 (一)定义 (二)代码 总结 前言 提示 ...

  6. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  7. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  8. 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16

    线性表11|单链表小结:腾讯面试题 让编程改变世界 Change the world by program 静态链表的删除操作 我们的故事还没结束,小C看到小A和2B这样非法的勾当,内心觉得很不爽,一 ...

  9. java单链表存储结构_Java数据结构——单链表

    单链式存储线性列表 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的 (图片来自网络,侵删) 存储单元由两部分组成,数据源和指针,数据源 ...

最新文章

  1. Leetcode 103. 二叉树的锯齿形层序遍历 (每日一题 20210924)
  2. matlab 范德蒙德矩阵,Matlab中fft与fwelch有什么区别?如何用fft求功率谱?
  3. c语言循环结成绩统计,学生成绩统计C语言实现
  4. 如何将函数的实际参数转换成数组
  5. js处理富文本编辑器转义、去除转义、去除HTML标签
  6. 使用AirFlow调度MaxCompute
  7. IDEA 2021.1正式发布,新增了这几个超实用功能!
  8. java 微商_Java 基础语法 - V8微商网_www.vip3158.com---时代创业网_www.sdcye.com - BlogJava...
  9. 做不完了吧,做不出了吧!
  10. SharePoint Secure Store Service(SSSS)的使用(一)
  11. ecshop二次开发bug(一)
  12. 阳明先生固天纵英才矣《王阳明全集》作者: 王守仁
  13. 维京传奇第四季/全集Vikings迅雷下载
  14. 【引路帖】【MATLAB】【求解最优化问题】
  15. 云计算、大数据、人工智能时代,为什么不能错过Linux?
  16. IOT(4)---手机中的传感器
  17. regedit.msc
  18. 织梦迁移服务器修改文件,织梦dedecms更换服务器搬家教程
  19. 【题解】 [SCOI2012]滑雪
  20. mysql逻辑运算符的优先顺序_布尔逻辑算符的类型和在检索式中优先执行的顺序...

热门文章

  1. 如何保存EDIUS工程里面的素材
  2. kkFileView word、 excel、 ppt、 pdf在线预览
  3. 基于51单片机的指纹密码锁
  4. Simple FOC
  5. springboot学习文档
  6. 人工智能辅助检测儿童自闭症谱系障碍
  7. 中小企业选择CRM需要注意“7”要素
  8. java实现双色球彩票中奖游戏
  9. ThinkpadR400键盘失灵的解决方法
  10. Linux修改系统时间为东八区北京时间(更换时区)