【数据结构】单链表 | 详细讲解

这篇具有很好参考价值的文章主要介绍了【数据结构】单链表 | 详细讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线性表顺序存储结构的优缺点

顺序表优点

  • 无须为了表示中间的元素之间的逻辑关系而增加额外的存储空间;
  • 因为以数组形式存储,可以快速地存取表中任一位置的元素。

顺序表缺点

  • 插入和删除操作需要移动大量元素,时间复杂度为O(N);
  • 当线性表长度变化较大时,难以确定存储空间的容量;
  • 造成存储空间的“碎片”。

顺序存储结构不足的解决办法

其实顺序表最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费极大时间,因为相邻两元素的存储位置也具有邻居关系。它们编号是1,2,3,...,n,它们在内存中的位置也是挨着的,中间没有空隙,当然就无法快速介入,而删除后,当中就会留出空隙,自然需要弥补。

那这样的话,我们反正都要让相邻的元素都留有足够余地,那么干脆所有的元素都不考虑相邻位置了,哪里有空位就到哪里,而只是让每个元素知道他下一个元素的位置在哪里,这样我们就可以在第一个元素时,就知道第二个元素的位置(内存地址),而找到它;在第二个元素时,就知道第三个元素的位置(内存地址),而找到它。这样所有的元素我们就都可以通过遍历而找到了。

其实这个思路也就是链表存储思路,而本篇文章着重讲述链表中的单链表。

线性表链式存储结构定义

在链式结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址。

数据域:存储数据元素信息的域称为数据域;

指针域:存储直接后继位置的域称为指针域。

在指针域中存储的信息称为指针或链。数据域与指针域信息组成数据元素的存储映像,称为结点。

单链表:n个结点链结成的链表,此链表中的每个结点中只包含一个指针域。

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法

单链表的代码实现以及分析 

单链表的结构代码

单链表中的结点,是由存放数据元素的数据域和存放后继结点地址的指针域组成的。所以,假设这个数据为val,存放后继结点地址的指针为next。

typedef int SLNDataType;
typedef struct SListNode
{
	struct SListNode* next;
	SLNDataType val;
}SLNode;

单链表中的每一个节点都是一个结构体成员,也就是多个结构体构成了一条链表。这与顺序表不同,顺序表由于数组存储 ,所以就是一个结构体的数组中存储了多个节点。

单链表的遍历打印

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法

void SLTPrint(SLNode* phead)
{
	assert(phead);
	SLNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d->", cur->val);
		cur = cur->next;
	}
	printf("NULL\n");
}

单链表建立新的头结点 

在创建新的头结点时,需要用到malloc函数,关于malloc的使用方法,这里不做过多阐述,大家有什么不懂的,可以点击链接(单击即可查看)详细学习malloc的使用方法哦。

C库函数中 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。

malloc分配内存空间函数。

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法 

SLNode* SLTCreateNode(SLNDataType x)
{
	SLNode* newnode = (SLNode*)malloc(sizeof(SLNode));
	if (newnode == NULL)
	{
		perror("malloc fail\n");
		exit(-1);
	}
	newnode->next = NULL;
	newnode->val = x;
	return newnode;
}

单链表的尾插

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法

那如果这是一个空表的话,那么就直接让这个单链表为指针,指向新创建的节点。

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法 

void SLTPushBack(SLNode** pphead, SLNDataType x)
{
	assert(pphead);
	SLNode* Newnode = SLTCreateNode(x);
	if (*pphead == NULL)
	{
		*pphead = Newnode;
	}
	else
	{
		SLNode* tail = pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		tail->next = Newnode;
	}
}

单链表的头插

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法 

void SLTPushFront(SLNode** pphead, SLNDataType x)
{
	assert(pphead);
	SLNode* Newnode = SLTCreateNode(x);
	Newnode->next = *pphead;
	*pphead = Newnode;
}

单链表的尾删

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法 

void SLTPopBack(SLNode** pphead)
{
	assert(pphead);
	assert(*pphead);
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SLNode* tail = *pphead;
		while (tail->next->next != NULL)
		{
			tail = tail->next;
		}
		free(tail->next);
		tail->next = NULL;
	}
}

单链表的头删

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法 

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法 

void SLTPopFront(SLNode** pphead)
{
	assert(pphead);
	assert(*pphead);
	SLNode* cur = (*pphead)->next;
	//注意在单链表头删的时候,如果只有一个节点,那也是可以的,就让那个临时的为空
	free(*pphead);
	*pphead = cur;
}

单链表的查找x数据

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法 

SLNode* SLTFind(SLNode* phead, SLNDataType x)
{
	SLNode* cur = phead;
	while (cur)
	{
		if (cur->val == x)
		{
			return cur;
		}
		else
		{
			cur = cur->next;
		}
	}
	return NULL;
}

单链表在pos位置插入x的数

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法

【数据结构】单链表 | 详细讲解,数据结构,学习资源,数据结构,算法 文章来源地址https://www.toymoban.com/news/detail-752907.html

SLNode* SLTInsert(SLNode** pphead, SLNode* pos, SLNDataType x)
{
	assert(*pphead);
	assert(pphead);
	assert(pos);
	
	if (*pphead==pos)
	{
		SLTPushFront(pphead,x);
	}
	else
	{
		SLNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		SLNode* Newnode = SLTCreateNode(x);
		prev->next = Newnode;
		Newnode->next = pos;
	}
}

单链表删除pos位置上的值

void SLTErase(SLNode** pphead, SLNode* pos)
{
	assert(*pphead);
	assert(pphead);
	assert(pos);

	if (pos == *pphead)
	{
		SLTPopFront(pphead);
	}
	else
	{
		SLNode* prev = *pphead;
		while (prev->next!=pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
}

单链表的销毁

void SLTDestroy(SLNode** pphead)
{
	assert(pphead);
	SLNode* cur = *pphead;
	while (cur)
	{
		SLNode* tmp = cur->next;
		free(cur);
		cur = tmp;
	}
	*pphead = NULL;
}

到了这里,关于【数据结构】单链表 | 详细讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】吃透单链表!!!(详细解析~)

    上篇文章介绍了顺序表,这篇文章开始着重讲解链表了。 链表有很多种:单、双链表,循环、非循环链表还有带头、不带头的链表。 本篇的主要内容是单链表(无头,单向,非循环) 。 链表对比顺序表有哪些不同之处,接下来会带大家一起了解~ 1.头部和中间的插入删除效

    2024年02月12日
    浏览(40)
  • 带你玩转数据结构-单链表(适合初学者的文章,讲解的很仔细哦)

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::讲解数据结构中链表的知识,;链表的分类,c语言实现单链表常见接口等. 金句分享: ✨山不向我走来,我便向山走去.✨ 顺序表 缺点: 中间/头部的插入删除,时间复杂

    2024年02月03日
    浏览(35)
  • 数据结构之单链表非常详细介绍(适合小白)

    之前有一篇文章介绍完顺序表,可以点击(顺序表文章)即可看到顺序表的知识后,我们就要开始学习链表了,链表的种类有很多,比如说 单链表 、 双向链表 、 循环或者非循环链表 以及 带头或者不带头链表等 ,那么链表和顺序表有哪些不同呢,相较于顺序表,链表做了哪些

    2024年02月06日
    浏览(41)
  • 【数据结构】—C语言实现单链表(超详细!)

                                         食用指南:本文在有C基础的情况下食用更佳                                     🔥 这就不得不推荐此专栏了:   C语言                                      ♈️ 今日夜电波:  あなたは煙草

    2024年02月14日
    浏览(64)
  • 【数据结构】——单链表超详细介绍(小白必看!!!)

     c语言中的小小白-CSDN博客 c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域. https://blog.csdn.net/bhbcdxb123?spm=1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行!!! 铁铁们,成功的路上必然是孤

    2024年04月11日
    浏览(67)
  • 【数据结构】——单链表超详细介绍(独家介绍,小白必看!!!)

    被滑走别滑走 ,我这 一万字 的文章,写的真的很痛苦的,希望能得到 一点点支持 !!! 重点内容 和 易错点 都用 彩笔 标注了,干货满满,耐心看完,我真的真的有在 认真更新o(╥﹏╥)o 上一篇文章介绍完顺序表后,我们就要开始学习链表了,链表的种类有很多,比如说

    2024年02月02日
    浏览(40)
  • 数据结构学习分享之单链表详解

        💓博主CSDN:杭电码农-NEO💓🎉🎉🎉       ⏩专栏分类:数据结构学习分享(持续更新中🫵)⏪🎉🎉🎉     让我们紧接上一章顺序表的概念,引出链表,我们说顺序表每次增容需要申请新的空间,会产生很多空间碎片,代价比较高,并且我们扩容一般是扩两倍,还是会有一些

    2024年02月02日
    浏览(48)
  • 【数据结构】顺序表 | 详细讲解

    在计算机中主要有两种基本的存储结构用于存放线性表:顺序存储结构和链式存储结构。本篇文章介绍采用顺序存储的结构实现线性表的存储。 线性表的顺序存储结构,指的是一段地址连续的存储单元依次存储链性表的数据元素。 线性表的(,……)的顺序存储示意图如下

    2024年02月04日
    浏览(39)
  • 数据结构:栈和队列(详细讲解)

    🎇🎇🎇作者: @小鱼不会骑车 🎆🎆🎆专栏: 《数据结构》 🎓🎓🎓个人简介: 一名专科大一在读的小比特,努力学习编程是我唯一的出路😎😎😎 栈 :一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为 栈顶 ,另

    2024年02月03日
    浏览(46)
  • 【数据结构】快排的详细讲解

    江河入海,知识涌动,这是我参与江海计划的第7篇。 目录:         快排是排序算法中效率是比较高的,快排的基本思想是运用二分思想,与二叉树的前序遍历类似,将数据划分,每次划分确定1个基准值(就是已经确定好有序后位置的数据),以升序为例,基准值左面的数据

    2024年02月06日
    浏览(91)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包