C C++最全一篇解单链表(0基础看)(C语言)《数据结构与算法,2024年最新C C++开发者值得深入思考的几个问题

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

链表

1. 链表的概念及结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

2. 链表的分类

2.1. 单向或者双向
2.2. 带头或者不带头
2.3. 循环或者非循环

2.4. 虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构

  1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

  2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。

3. 效果展示图

4. 接口实现

本篇幅是无头+单向+非循环链表增删查改实现,下一篇就是带头+双向+循环链表的实现哈。

对于接口的实现我们首先是要知道要实现什么,本文是对于链表的基本使用,让大家初步了解链表,所以就只实现顺序表的增删查改,还有特定位置前插入删除特定位置值等当然代码也不一定要作者这么写,这里只是提供一种思路,废话不多说,看代码。

有什么不懂的欢迎到评论区交流哈,当然也可以私信作者。

4.01. 本文章要实现的接口

4.02. 链表的实现
4.03. 初始化
4.04. 销毁链表

4.05. 打印链表

4.06. 动态申请一个节点
4.07. 头插
4.08. 尾插

4.09. 头删

4.10. 尾删

4.11. 查找某个值并返回地址
4.12. 在pos位置之前插入某个值
4.13. 删除pos位置的值

5. 源代码

5.1. test.c
#include"SList.h"

int main()
{
	//直接初始化next为NULL就可以了
	SListNode* plist = NULL;
	//头插 1 2
	SListPushFront(&plist, 1);
	SListPushFront(&plist, 2);
	SListPushFront(&plist, 6);
	SListPrint(&plist);
	//尾插 3 4 5
	SListPushBack(&plist, 3);
	SListPushBack(&plist, 4);
	SListPushBack(&plist, 5);
	SListPrint(&plist);
	//头删一个数
	SListPopFront(&plist);
	SListPrint(&plist);
	//尾删两个个数
	SListPopBack(&plist);
	SListPopBack(&plist);
	SListPrint(&plist);
	//找 3 4 1
	SListFind(&plist, 3);
	SListFind(&plist, 4);
	SListFind(&plist, 1);
	//在 1 前面插入 8
	SListNode* pos=SListFind(&plist, 1);
	SListInsert(&plist, pos, 8);
	SListPrint(&plist);
	//删除 2  3
	pos = SListFind(&plist, 2);
	SListErase(&plist, pos);
	SListPrint(&plist);
	pos = SListFind(&plist, 3);
	SListErase(&plist, pos);
	SListPrint(&plist);
	//销毁链表
	SListDestory(&plist);
	return 0;
}

5.2. SList.h
#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<assert.h>
#include<malloc.h>

typedef int SLTDateType;

typedef struct SListNode
{
	SLTDateType date;
	struct SListNode* next;
}SListNode;


//销毁
void SListDestory(SListNode** pphead);
//打印
void SListPrint(SListNode** pphead);

//动态申请一个节点
SListNode* BuySListNode(SLTDateType x);
//查找某个值
SListNode* SListFind(SListNode** pphead, SLTDateType x);

//头插
void SListPushBack(SListNode** pphead,SLTDateType x);
//尾插
void SListPushFront(SListNode** pphead, SLTDateType x);

//头删
void SListPopFront(SListNode** pphead);
//尾删
void SListPopBack(SListNode** pphead);

//在pos位置之前插入某个值
void SListInsert(SListNode** pphead, SListNode* pos, SLTDateType x);
//删除pos位置的值
void SListErase(SListNode** pphead,SListNode* pos);
//找到某个值并改变为某个值
5.3. SList.c
#include"SList.h"

//动态申请一个节点
SListNode* BuySListNode(SLTDateType x)
{
	SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));
	(newnode)->next = NULL;
	newnode->date = x;
	return newnode;
}


//头插
void SListPushFront(SListNode** pphead, SLTDateType x)
{
	SListNode* newnode=BuySListNode(x);

	if (!(*pphead))
	{
		*pphead = newnode;
	}
	else
	{
		newnode->next = *pphead;
		*pphead = newnode;
	}
}

//打印
void SListPrint(SListNode** pphead)
{
	SListNode* cur = *pphead;
	while (cur)
	{
		//注意这里打印的 -> 和下面的 NULL 只是为了打印出来更像是链表
		printf("%d->", cur->date);
		cur = cur->next;
	}
	printf("NULL\n");
}

//尾插
void SListPushBack(SListNode** pphead, SLTDateType x)
{
	SListNode* tail = *pphead;
	SListNode* newnode=BuySListNode(x);
	if (!tail)
	{
		tail = newnode;
	}
	else
	{
		while (tail->next)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}

//头删
void SListPopFront(SListNode** pphead)
{
	assert(*pphead);
	
	SListNode* next = (*pphead)->next;
	free(*pphead);
	*pphead = next;
}

//尾删
void SListPopBack(SListNode** pphead)
{
	assert(*pphead);

	SListNode* tail = *pphead;
	SListNode* prev = *pphead;
	if (prev->next == NULL)  //一个节点的时候
	{
		//注意这里free是*pphead
		free(*pphead);
		*pphead = NULL;
		return;
	}
	else
	{
		//多个节点的时候(此时最少两个节点)
		tail = tail->next;


![img](https://img-blog.csdnimg.cn/img_convert/aa0d7985b42081f3b5734558cc079f43.png)
![img](https://img-blog.csdnimg.cn/img_convert/ce54529e675ce066d2606437e94ccd1f.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

urn;
	}
	else
	{
		//多个节点的时候(此时最少两个节点)
		tail = tail->next;


[外链图片转存中...(img-eGoeuY9B-1715704086009)]
[外链图片转存中...(img-p03N5uVa-1715704086009)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值