C语言单双线性及循环链表怎么实现


今天小编给大家分享一下C语言单双线性及循环链表怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Operation
InitList(*L):初始化操作,简历一个空的线性表L
ListEmpty(L):判断线性表是否为空表,若线性表为空返回true,否则返回false
ClearList(*L):将线性表清空
GetElem(L,i,*e):将线性表L中的第i个位置返回给e
LocatElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功,否则,返回0表示失败
ListInsert(*L,i,e):在线性表L中第i个位置插入元素e
ListDelete(*L,i,*e):删除线性表L中的第i个位置的元素,并用e返回其值
ListLength(L):返回线性表L的元素个数线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以存在内存中未被占用的任意位置。
比起顺序存储结构每个数据元素只需要存储一个位置就可以了。
现在链式存储结构中,除了要存储数据元素信息外,还要存储它的后继元素的存储地址(指针)
我们把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针。这两部分信息组成数据元素称为存储映像,称为结点(Node)。
n个结点链接成一个链表,即为线性表(a1,a2,a3, …., an)的链式存储结构。
因为此链表的每个结点中只包含一个指针域,所以叫做单链表。获得链表第i个数据的算法思路:声明一个结点p指向链表第一个结点,初始化从1开始当j若到链表末尾p为空,则说明第i个元素不存在;否则查找成功,返回结点p的数据。通俗易懂就是从头开始找,直到第i个元素为止。由于这个算法的时间复杂度取决于i的位置,当i=1时,则不需要遍历,而i=n时则遍历n-1次才可以。因此最坏情况的时间复杂度为O(n)。由于单链表的结构中没有定义表长,所以不能实现知道要循环多少次,因此也就不方便使用for控制循环。其核心思想叫做“工作指针后移”,这其实也是很多算法的常用技术。看图发现我们插入结点不需要向顺序存储一样全部更改,只需要让s -> next和p -> next发生一点指向改变:s -> next = p-> nextp -> next = s如图:单链表第i个数据插入结点的算法思路:1.声明一结点p指向链表头结点,初始化j从1开始;-当j2.若到链表末尾p为空,则说明第i个元素不存在;
3.否则查找成功,在系统中生成一个空结点S;
4.将数据元素e赋值给s->data;
5.单链表的插入刚才两个标准语句;
6.返回成功
(表示类型)malloc(sizeof(表示长度))开辟一个空间假设元素a2的结点为q,要实现结点q删除单链表的操作,其实就是将它的前继结点的指针绕过指向后面。我们要做的就是上一步
可以写成 p -> next = p ->next -> next
也可以使用
q = p -> next;p -> next = q -> next单链表第i个数据删除结点的算法思路:声明结点p指向链表第一个结点,初始化j=1;当j 一若到链表末尾p为空,则说明第i个元素不存在;否则查找成功,将欲删除结点p->next赋值给q;单链表的删除标准语句p -> next = q -> next ;将q结点中的数据赋值给e,作为返回;释放q结点。free(q)创建单链表的过程是一个动态生成链表的过程,从“空表“的初始状态起,依次建立各元素结点并逐个插入链表。所以单链表整表创建的算法思路如下:声明一结点p和计数器变量i;初始化一空链表L;让L的头结点的指针指向NULL,即建立一个带头结点的单链表;循环实现后继结点的赋值和插入。头插法从一个空表开始,生成新结点,读取数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束为止。简单来说,就是把新加进的元素放在表头后的第个位置:先让新节点的next指向头节点之后然后让表头的next指向新节点嗯,用现实环境模拟的话就是插队的方法,始终让新结点插在第一的位置。声明结点p和q;将第一个结点赋值给p,下一结点赋值给q;循环执行释放p和将q赋值给p的操作;此处使用c++语法,请自行切换main.hmain.cppdoubleLink.cpp贪吃蛇实例展示:1.我们知道,双向链表中各个节点的标准构成是一个数据域和 2 个指针域,免费云主机域名但对于实现贪吃蛇游戏来说,由于各个节点的位置是随贪吃蛇的移动而变化的,因此链表中的各节点还需要随时进行定位。
在一个二维画面中,定义一个节点的位置,至少需要所在的行号和列号这 2 个数据。由此,我们可以得出构成贪吃蛇的双向链表中各节点的构成:2.贪吃蛇的移动,本质上就是对链表中各个节点的重新定位。换句话说,除非贪吃蛇吃到食物,否则无论怎样移动,都不会对双向链表的整个结构(节点数)产生影响,唯一受影响的就只是各个节点中 (x,y) 这对定位数据。由此,我们可以试着设计出实现贪吃蛇移动的功能函数,本节所用的实现思想分为 2 步:从蛇尾(双向链表尾节点)开始,移动向前遍历,过程中依次将当前节点的 (x,y) 修改为前驱节点的 (x,y),由此可实现整个蛇身(除首元节点外的其它所有节点)的向前移动;接收用户输入的移动指令,根据用户指示贪吃蛇向左、向右、向上还是向下移动,首元节点中的 (x,y) 分别做 x-1、x+1、y-1 和 y+1 运算。如下所示,move() 函数就实现了贪吃蛇的移动:注意,此段代码中还调用了 SnakeDeath() 函数,此函数用于判断贪吃蛇移动时是否撞墙、撞自身,如果是则游戏结束。3. 当贪吃蛇吃到食物时,贪吃蛇需要增加一截,其本质也就是双向链表增加一个节点。前面章节中,已经详细介绍了如何在双向链表中增加一个节点,因此实现这个功能唯一的难点在于:如何为该节点初始化 (x,y)?
本节所设计的贪吃蛇游戏,针对此问题,提供了最简单的解决方案,就是不对新节点 x 和 y 做初始化。要知道,贪吃蛇是时刻移动的,而在上面的 move() 函数中,会时刻修正贪吃蛇每个节点的位置,因此当为双向链表添加新节点后,只要贪吃蛇移动一步,新节点的位置就会自行更正。
也就是说,贪吃蛇吃到食物的实现,就仅是给双向链表添加一个新节点。如下即为实现此功能的代码:其中,Food 结构体用来表示食物,其内部仅包含能够定位食物位置的 (x,y) 即可。另外,此段代码中,还调用了 FoodeInSnake() 函数,由于食物的位置是随机的,因此极有可能会和贪吃蛇重合,所以此函数的功能就是:如果重合,就重新生成食物。FoodInSnake() 函数的实现很简单,这里不再赘述:4.贪吃蛇游戏界面的显示,最简单的制作方法就是:贪吃蛇每移动一次,都清除屏幕并重新生成一次。这样实现的问题在于,如果贪吃蛇的移动速度过快,则整个界面在渲染的同时,会掺杂着光标,并且屏幕界面会频繁闪动。因此,在渲染界面时,有必要将光标隐藏起来,这需要用到头文件,实现代码如下:同时,为了给整个界面渲染上颜色,也需要引入头文件,并使用如下函数:5.需要注意的一点是,由此结束后,一定要手动释放双向链表占用的堆空间:无论是静态链表还是动态链表,有时在解决具体问题时,需要我们对其结构进行稍微地调整。比如,可以把链表的两头连接,使其成为了一个环状链表,通常称为循环链表。只需要将表中最后一个结点的指针指向头结点,链表就能成环儿需要注意的是,虽然循环链表成环状,但本质上还是链表,因此在循环链表中,依然能够找到头指针和首元节点等。循环链表和普通链表相比,唯一的不同就是循环链表首尾相连,其他都完全一样。约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(分别用编号 1,2,3,…,n 表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 开始,还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,直到圆桌上剩余一个人。如图 2 所示,假设此时圆周周围有 5 个人,要求从编号为 3 的人开始顺时针数数,数到 2 的那个人出列:俄罗斯轮盘是一个残忍的游戏,具体规则为:游戏的道具是一把左轮手枪,其规则也很简单:在左轮手枪中的 6 个弹槽中随意放入一颗或者多颗子弹,在任意旋转转轮之后,关上转轮。游戏的参加者轮流把手枪对着自己,扣动扳机:中枪或是怯场,即为输的一方;坚持到最后的即为胜者。
本节实践项目同轮盘赌类似,游戏规则:n 个参加者排成一个环,每次由主持向左轮手枪中装一颗子弹,并随机转动关上转轮,游戏从第一个人开始,轮流拿枪;中枪者退出赌桌,退出者的下一个人作为第一人开始下一轮游戏。直至最后剩余一个人,即为胜者。要求:模拟轮盘赌的游戏规则,找到游戏的最终胜者。决类似的问题,使用线性表的顺序存储结构和链式存储结构都能实现,根据游戏规则,在使用链式存储结构时只需使用循环链表即可轻松解决问题。运行结果示例:以上就是“C语言单双线性及循环链表怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。

相关推荐: 怎么在vue中更优雅的封装第三方组件

本篇内容主要讲解“怎么在vue中更优雅的封装第三方组件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么在vue中更优雅的封装第三方组件”吧!实际开发的时候,为了减少重复造轮子,提高工作效率,节省开发时间成本, 免…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/02 10:16
下一篇 06/02 11:13

相关推荐