玩转链表(1)

顺序表问题及思考

问题:

  1. 中间/头部的插入删除,时间复杂度为O(N)
  2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
  3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,
    我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

链表的概念及结构

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

链表的分类

在这里插入图片描述
在这里插入图片描述
带哨兵位的头节点不存数据。
在这里插入图片描述
总共有八种结构,但我们最常用的有无头单项非循环链表和有头双项循环链表

打印链表节点数据

void SListPrint(SLTNode* plist)
{
	SLTNode* cur = plist;
	while (cur != NULL)
	{
		printf("%d "cur->data);
		cur = cur->next;
	}
	printf("\n");
}

建立一个新的节点

SLTNode *BuySLTNode(SLTDataType x)
{
	SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));
	node->data = x;
	node->next = NULL;
}

先用Malloc动态开辟空间,然后创建新的节点

尾插

void SListPushBack(SLTNode** plist, SLTDataType x)
{
	if (plist == NULL)
	{
		plist = newnode;
	}
    else
	{
		SLTNode* tail = plist;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}
		SListNode *newnode = BuySLTNode(x);
		tail->next = newnode;
	}
}

由于我们是对指针进行改变,所以用来接收的是二级指针。
要记得判断刚开始就是空指针的情况。

头插

void SListPushFront(SLTNode** pplist, SLTDataType x)
{
	SLTNode* newnode = BuySLTNode(x);
	newnode->next = *pplist;
	*pplist = newnode;
}

由于对一级指针进行改变,所以用来接收的是二级指针。

尾删

void SListPopBack(SLTNode* plist)
{
	if (*pplist == NULL)
	{
		return;
	}
	else if ((*pplist)->next == NULL)
	{
		free(*pplist);
		*pplist = NULL;
	}
	else
	{
		SLTNode* prev = NULL;
		SLTNode* tail = plist;
		while (tail->next != NULL)
		{
			prev = tail;
			tail = tail->next;
		}
		free(tail);
		tail = NULL;
		prev->next = NULL;
	}
}

要分情况,没有节点,一个节点和多个节点的情况。

头删

void SListPopFront(SLTNode ** pplist)
{
	if (*pplist == NULL)
	{
		return;
	}
	else
	{
		SLTNode* next = (*pplist)->next;
		free(*pplist);
		*pplist = next;
	}
}

头删要记得先保存下一个,再把开头的free掉。

查找

void SLTNode* SListFinde(SLTNode* plist, SLTDataType x)
{
	SLTNode* cur = plist;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
}

任意位置前插入

void SListInsert(SLTNode* plist, SLTNode* pos, SLTDataType x)
{
	assert(pos);
	SLTNode* newnode = BuySLTNode(x);
	if (pos == *pplist)
	{
		newnode->next = pos;
		*pplist = newnode;
	}
	SLTNode* prev = NULL;
	SLTNode* cur = plist;
	while (cur != pos)
	{
		prev = cur;
		cur = cur->next;
	}
	prev->next = newnode;
	newnode->next = pos;
}

要注意考虑头节点的情况。

任意位置后插入

void SListInsertAfter(SLTNode* pos, SLTDataType x)
{
	assert(pos);
	SLTNode* newnode = BuySLTNode(x);
	pos->next = newnode;
	newnode->next = pos->next;
}
已标记关键词 清除标记
相关推荐
<p> <b><span style="background-color:#FFE500;">【超实用课程内容】</span></b> </p> <p> <br /> </p> <p> <br /> </p> <p> 本课程内容包含讲解<span>解读Nginx的基础知识,</span><span>解读Nginx的核心知识、带领学员进行</span>高并发环境下的Nginx性能优化实战,让学生能够快速将所学融合到企业应用中。 </p> <p> <br /> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><br /> </b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b><span style="background-color:#FFE500;">【课程如何观看?】</span></b> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> PC端:<a href="https://edu.csdn.net/course/detail/26277"><span id="__kindeditor_bookmark_start_21__"></span></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a> </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 移动端:CSDN 学院APP(注意不是CSDN APP哦) </p> <p style="font-family:Helvetica;color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 本课程为录播课,课程永久有效观看时长,大家可以抓紧时间学习后一起讨论哦~ </p> <p style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <br /> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <strong><span style="background-color:#FFE500;">【学员专享增值服务】</span></strong> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> <b>源码开放</b> </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化 </p> <p class="ql-long-24357476" style="font-family:"color:#3A4151;font-size:14px;background-color:#FFFFFF;"> 下载方式:电脑登录<a href="https://edu.csdn.net/course/detail/26277"></a><a href="https://edu.csdn.net/course/detail/27216">https://edu.csdn.net/course/detail/27216</a>,播放页面右侧点击课件进行资料打包下载 </p> <p> <br /> </p> <p> <br /> </p> <p> <br /> </p>
版权归作者所有,任何形式转载请联系作者。 作者:王颢(来自豆瓣) 来源:https://book.douban.com/review/8387262/ 一本书有它的读者群,这本书适合青少年编程,而不适合儿童编程。这里的青少年指中学及其以上水平的学生,有一定的数学基础。 首先看看原书作者:Majed Marji,是韦恩州立大学的电子工程博士,一直在汽车行业开发软件长达15年。所以,写出的编程书必然很专业。因为是面向青少年的编程书,所以呢,也蛮有趣的,但是本书长达260页,需要一定的耐心才能坚持读完。 一般的编程书,就是把做动画、游戏的步骤写出来,入门还不错,但是内容不太深入。这本书当然也是以例子来演示,但是穿插了数据结构等计算机科学方面的知识。适合哪些对编程感兴趣,又想继续深入学下去的青少年。 先看书的目录: 第1章:准备开始(软件安装、软件介绍) 第2章:动作和绘图 第3章:外观和声音 第4章:过程 第5章:变量 第6章:用逻辑做决定 第7章:深入循环 第8章:字符串处理 第9章:链表 贴上一张Scratch 2.0软件的编程界面: 第2章对应着软件中的“动作”和“画笔”,第3章对应软件中的“外观”和“声音”,第4章对应软件中“事件”中的广播知识和“更多模块”中的自定义模块知识,还有就是讲解编程思维。 第5章对应“数据”中的变量知识,第6章和第7章对应软件中的“控制”,第8章对应软件中的“运算符”,第9章对应软件中“数据”中的链表知识。 所以,学完这本书,基本上就把Scratch 2.0编程学完了。并且,每个章节后面,还有对应的习题,可以做做,看看自己是否掌握编程知识。实在不会做,可以到书中的官网下载练习题答案,对照一下,看看自己哪里没有掌握。 其实,这本书也适合做编程培训的老师。很多老师没有编程的基础,可以拿这个来做练习。每天学习一点,不要学太多,没有兴趣要坚持学下去还是挺累的。这样,差不多3-4周可以学完。 这本书比较好的就是:有些例子是和数学、英语、语文、物理、生物知识结合,不仅仅是游戏和动画。所以,在编程的过程中,也可以复习已经学过的课本知识,可以说一箭双雕。 再说说这本书不好的:中文翻译太烂。这个不是书的原因,是Scratch 2.0软件的问题。我尝试翻译的更地道些,好让学生更好理解积木的功能。但是,居然软件不让改变关键词的前后顺序!!! 我来举个例子:链表test中有个积木是“replace item x of test with thing”,其中x、test、thing是关键词,翻译时不能改变关键词的顺序。如果翻译成地道的中文就是:将链表test的第x项替换成thing。然后,逗比的Scratch 2.0就只能翻译成:替换第x项在链表test用thing。oh my god,杀死我吧,这是什么鬼?!不要拿英语的习惯来做软件好吗?中文和英文的意思完全相反好吧!
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页