【C语言】链表详解(无头单向非循环)

本文详细介绍了链表的概念、结构和分类,并重点讲解了无头单向非循环链表的实现,包括动态申请节点、销毁节点、打印链表、尾插、头插、尾删、头删、查找指定值节点、在pos位置后插入和删除等操作。文章还强调了在函数中正确传递链表指针的重要性。
摘要由CSDN通过智能技术生成

📒博客主页:要早起的杨同学的博客
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文所属专栏:【数据结构
✉️坚持和努力从早起开始!
💬参考在线编程网站:🌐牛客网🌐力扣
🙏作者水平有限,如果发现错误,敬请指正!感谢感谢!

在这里插入图片描述
学习链表之前,建议先学习下顺序表哦:

【C语言】详解顺序表(SeqList)

一. 链表介绍

1.1 为什么引入链表

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

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

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

1.2 链表的概念及结构

  • 概念

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

  • 链表的组成

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

每个结点包括两个部分:

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

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

  • 链表的物理结构

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

image-20210824110616542

  • 链表的逻辑结构(想象出来的)

image-20210822225322883

  • 注意

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

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

1.3 链表的分类

链表的结构非常多样化

  • 单向、双向

image-20210827235931988

  • 带头结点、不带头节点(哨兵位的头节点,不存储有效数据)

image-20210828002001494

  • 非循环、循环

image-20210827235906305

  • 常用的两种结构

image-20210828000023080

二. 无头单向非循环链表的实现

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

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

如图:

image-20210824114457095


2.1 单链表的定义

image-20210831212953194

typedef int SLTDataType;

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

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

2.3销毁(释放)所有节点

//销毁单链表中所有节点
void SListDestory(SListNode** pphead)
{
   
	
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morning_Yang丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值