jjzjj

舍友打游戏的时候,我学会了单链表

我不是小明同学 2023-08-06 原文

🎉🎉🎉哈喽!!!大家好,这里是禾子日月

🎆欢迎各位小伙伴关注➕点赞➕留言➕收藏

🎆我坚信努力奔跑才能与幸运不期而遇。

目录

1、为什么要学链表

2.链表的定义

3、链表的插入

①尾插

②头插

③其他位置插入

4、链表的删除

①尾删

②头删

③其他位置删除

5、打印链表

6、销毁链表

写在最后


🎇🎇🎇上篇文章我们用顺序表写了一个目录,通过写目录我们又巩固了顺序表的相关知识,如果你对这个感兴趣可以点击下方的链接哦。

👇👇👇

http://t.csdn.cn/HSkor

🎉🎉🎉废话不多说,我们开始今天的内容。

1、为什么要学链表

在回答这个问题之前,我们先引入一个例子:

 首先我们想到的是用数组存储,但是用数组有些不便之处。因为事先我们并不知道文件1.txt中数据的个数,因此数组的大小不易确定。数组定义的太小,不能容纳所有数据;定义的太大,造成内存空间的浪费。——该问题用动态数组可以解决。

数组需要占用连续的内存空间,当没有所需大小的连续空间时,程序不能运行。——该问题用链表可以解决。

2.链表的定义

链表分为单向链表和双向链表。链表的每个元素称为一个节点。每个节点包含两部分

第一部分  data;第二部分  next。  data时用户需要的数据(可以是一个成员,或多个成员),称为链表的数据领域;next为下一个节点的地址,或称为指向下一个节点的指针,它也被称为链表的指针域。看到这里你可能似懂非懂,接下来上图🎈🎈🎈

 链表的尾部是链表的最后一个节点,即指针域为NULL的节点。链表的长度不是固定的,随时可以添加,如果添加到链表的尾部,则新的节点将成为链表的结尾。所以任何一个需要添加到链表尾部的新节点,其指针域必须是NULL,并使原来链表的结尾指针域指向新的节点。

接下来我们创建一个链表

typedef struct SLinkNode
{
	int data;
	struct SLinkNode *next;
}SLTNode;

※※注意:我们在定义链表的时候可以使用typedf关键字起一个别名,这样在后面的操作中会省下不少事。SLTNode   等价于 struct SLinkNode。

main函数中代码

int main()
{
    SLTNode *plist=NULL;
    return 0;
}

3、链表的插入

①尾插

尾插示意图:

尾插后原链表最后一个节点的指针域不再为NULL而是指向新节点。接下来我们用代码来实现一下。

void SListPushBack(SLTNode **pphead,int x)
{
	SLTNode *newnode=(SLTNode*)malloc(sizeof(SLTNode));
	newnode->data = x;
	newnode->next = NULL;
	if(*pphead==NULL)
	{
		*pphead=newnode;
	}
	else
	{
		SLTNode *tail = *pphead;
		while(tail->next !=NULL)
		{
			tail=tail->next;
		}
		tail->next=newnode;
	}
}

②头插

头插示意图:

 头插时我们只需要将新节点的指针域指向头节点即可。

代码如下:

void SListPushFront(SLTNode **pphead,SLTDataType x)
{
	SLTNode *newnode=(SLTNode*)malloc(sizeof(SLTNode));
	newnode->data = x;
	newnode->next = *pphead;
	*pphead=newnode;
}

③其他位置插入

其他位置插入示意图:

 从其他插入我们需要先断开两个节点之间的联系。

//在pos位置插入一个节点
void SListInsert(SLTNode **pphead,SLTNode *pos,SLTDataType x)
{
	SLTNode *newnode=(SLTNode*)malloc(sizeof(SLTNode));
	newnode->data = x;
	if(*pphead==pos)
	{
		newnode->next =*pphead;
		*pphead=newnode;	
	}
	else
	{
		//找到pos的前一个位置
		SLTNode *posPrev = *pphead;
		while(posPrev->next != pos)
		{
			posPrev=posPrev->next;
		}
		posPrev->next = newnode;
		newnode->next =pos;
	}
} 

4、链表的删除

①尾删

尾删示意图:

 尾删时,我们只需要将最后一个节点前面的节点的指针域变成NULL即可。

代码如下:

void SListPopBack(SLTNode **pphead)
{
 
	if(*pphead==NULL)//判断链表是否为空
	{
		return;
	}
	SLTNode *tail=*pphead;
	while(tail->next->next ){
		tail=tail->next;
	}
	free(tail->next); 
	tail->next =NULL;
}

②头删

头删示意图:

代码如下:

void SListPopFront(SLTNode **pphead)
{
	assert(pphead);
	if(*pphead==NULL)//判断链表是否为空
		return;
		
	SLTNode *q=(*pphead)->next;
	free(*pphead);
	*pphead=q;
}

③其他位置删除

其他位置删除示意图:

 代码如下:

void SListErase(SLTNode **pphead,SLTNode *pos)
{
	if(*pphead==pos)
	{
		SListPopFront(pphead);//如果要删除的是头节点,我们偷个懒直接调用
	}
	else
	{
		SLTNode *prev=*pphead;
		while(prev->next !=pos)
		{
			prev=prev->next ;
		}
		prev->next =pos->next ;
		free(pos);
	}
}

5、打印链表

打印链表比较简单,我们只需要遍历一次链表就可以了。

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

6、销毁链表

链表的节点都是我们在内存中申请的,使用完后要销毁掉。

void SListDestory(SLTNode **pphead)
{
	assert(pphead);
	SLTNode *cur= *pphead;
	while(cur)
	{
		SLTNode *next=cur->next ;
		free(cur);
	}
	*pphead=NULL;
} 

写在最后

🎉🎉🎉以上就是本篇文章全部内容,作者知识水平有限,若有什么错误或者需改进之处希望大家指出,若是你有更好的代码希望能给博主留言,博主希望能在CSDN与各位一起进步,感谢大家观看!

有关舍友打游戏的时候,我学会了单链表的更多相关文章

  1. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  2. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  3. ruby - 下拉菜单在应该被选中的时候没有被选中……为什么? - 2

    我正在尝试解决我们测试中的一个错误,我认为它应该有效。我很确定这是selectize或capybara中的错误,但我不明白为什么。我已经进入了capybara的源代码,一切似乎都在正常工作。我真的不确定如何前进。为了测试这个错误,我已经尽可能地把这个错误剥离成一个小的testapplication.请参阅下面的设置bugs/show.html.erbOneTwoThreeFourOneTwoThreeFourbug_spec.rbfeature'bug'doit"specsetup",js:truedovisitbug_pathfind('div.selectize-inputinpu

  4. ruby - 使用 Ruby 编写 Unity 游戏 - 2

    所以我看到unity支持c#、JS和Boo。我可以学习其中一个,但我想制作一个“编译器”或类似的东西,让我可以编写ruby​​代码并输出JS代码或制作一个可以被Unity编译器读取的层。这有可能吗?我愿意在这方面投入很多时间并且有相当多的经验。 最佳答案 如果您的问题实际上是“我如何将Ruby编译为JavaScript”,那么这更容易回答:Opal:RubytoJavaScriptcompiler但是,学习其中一种受支持的语言会更好。当运行的是用另一种语言解释的代码时,很难调试“您的”代码。

  5. ruby-on-rails - 什么时候 block 比函数更有用(ruby)? - 2

    我有两个给出相同结果的例子。带block:defself.do_something(object_id)self.with_params(object_id)do|params|some_stuff(params)endenddefself.with_params(object_id,&block)find_object_by_idcalculate_params_hashblock.call(params_hash)end和方法:defself.do_something(object_id)some_stuff(self.get_params(object_id))enddefsel

  6. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  7. Unity游戏开发:背包系统的实现 - 2

    背包是游戏中经常使用的一个组件,它负责管理玩家在游戏中所获得的道具。一个完整的背包系统应当具有将物品放置进背包、对背包内物品进行管理和使用背包内物品等功能。而往往一个背包系统的逻辑关系较为复杂,如果把所有功能都放在一个脚本中实现会使代码显得十分冗杂且缺乏逻辑。所以在背包系统的设计过程中,我们常将其分解为数据、逻辑和UI三部分分别来进行完成。一、UI设计以CottonPuzzle中的背包设计为例,我们需要有物品展示栏、物品切换按键和物品提示信息等部分。在Canvas中创建ItemHolder,在ItemHolder中创建LeftButton和RightButton控制物品的左右切换、Slot来控

  8. ruby-on-rails - 什么时候需要在 Rails Gemfile 中使用 require? - 2

    在我的gemfile中我有这样的东西:gem'net-sftp','2.1.1',:require=>'net/sftp'gem'backup','3.0.27'gem'watu_table_builder',:require=>'table_builder'gem'browser','0.1.6'在Gemfile中什么时候需要require?我还发现了诸如:require=>false之类的东西。帮忙? 最佳答案 如果您省略:require选项,默认情况下Bundler将尝试使用标准名称到文件的转换规则来请求gem:dashesa

  9. ruby-on-rails - rails 4 什么时候需要 "inverse_of"? - 2

    我是第一次使用Rails4开发Web应用程序。我正在使我所有的模型关联成为双向的,并在任何允许的地方使用inverse_of。通过阅读文档,我形成了这样的印象,即这可能是最佳实践,但从来没有在任何地方真正清楚地说明这一点。对于经验丰富的Rails开发人员在这方面的任何一般性建议,我将不胜感激。我希望这个问题不会太模糊以至于在这里没有值(value)。谢谢!更新:除了非标准名称之外,似乎还有两种主要的额外情况需要显式设置inverse_of:对于INVALID_AUTOMATIC_INVERSE_OPTIONS(http://www.rubydoc.info/docs/rails/Act

  10. 仍在积极维护的 Ruby 游戏框架? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭7年前。Improvethisquestion我发现很难调查使用Ruby进行游戏编程的选项。其他帖子和文章中提到的几个包装器和框架不再维护或使用。Gosu/Ruby似乎仍然活跃:官方论坛上的讨论一直很稳定。是否还有其他积极维护的ruby​​游戏框架?编辑:我发现使用MacRuby进行大量游戏开发。

随机推荐