【数据结构入门】无头单向非循环链表(SList)详解(定义、增、删、查、改) | 图解链表,超生动详细哦~


学习链表之前,建议先学习下顺序表,配合这篇文章食用更佳哦:

【数据结构入门】顺序表(SeqList)详解(初始化、增、删、查、改)

(1)链表介绍

1)为什么引入链表

  • 学习链表之前,先让我们来思考一个问题:

为什么有了顺序表,还需要有链表这样的数据结构呢?

  • 顺序表存在的一些问题:
  1. 顺序表在中间/头部的插入删除,要挪动很多数据,时间复杂度为O(N),效率太低了。
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是一次增长2倍,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们
    再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。
  • 为了更好的解决上述问题,引入了链表。

2)链表的概念及结构

  • 概念

前面学习的顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,而链表是一种物理存储结构上不连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,可以实现更加灵活的动态内存管理。

  • 链表的组成

链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。

每个结点包括两个部分:

1、数据域:存储数据元素

2、指针域:存储下一个结点地址

  • 链表的物理结构

可以看到,4个节点的地址并不是连续的,链表在物理结构上不一定是线性的,而在逻辑结构上是线性的

image-20210824110616542
  • 链表的逻辑结构(想象出来的)
image-20210822225322883
  • 注意

1、链式结构在逻辑上是连续的,但在物理上不一定连续

2、链表的节点是在堆上申请出来的

3)链表的分类

链表的结构非常多样化

  • 单向、双向
image-20210827235931988
  • 带头结点、不带头节点(哨兵位的头节点,不存储有效数据)
image-20210828002001494
  • 非循环、循环
image-20210827235906305
  • 常用的两种结构
image-20210828000023080

(2)无头单向非循环链表的实现

首先新建一个工程( 博主使用的是 VS2019 )

  • SList.h(单链表的类型定义、接口函数声明、引用的头文件)
  • SList.c(单链表接口函数的实现)
  • Test.c(主函数、测试顺序表各个接口功能)

如图:

image-20210824114457095

1)单链表的定义

image-20210831212953194
typedef int SLTDataType;

//定义单链表节点
typedef struct SListNode
{
   
	SLTDataType data;        //数据域
	struct SListNode* next;  //指针域
}SListNode;

2)动态申请一个节点

//动态申请一个节点
SListNode* BuySListNode(SLTDataType x)
{
   
	SListNode* node = (SListNode*)malloc(sizeof(SListNode));
	if (node == NULL)  //检查是否开辟成功
	{
   
		perror("malloc");
		return;
	}
	node->data = x;
	node->next = NULL;

	return node;
}

3)销毁(释放)所有节点

//销毁单链表中所有节点
void SListDestory(SListNode** pphead)
{
   
	assert(pphead);

	SListNode* cur = *pphead;
	while (cur != NULL)  //遍历链表
	{
   
		SListNode* next = cur
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值