已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,循 环 链 表,2,循环链表,例:猴子选大王。 n只猴子围成一圈,顺时针方向从1到n编号。之后从1号开始沿顺时针方向让猴子从1,2,m依次报数,凡报到m的猴子,都让其出圈,取消候选资格。然后不停地按顺时针方向逐一让报出m者出圈,最后剩下一个就是猴王。,3,起始位置,猴 王,1,2,3,4,5,6,7,8,3,6,1,5,2,8,4,猴子被淘汰的顺序,演示:n=8, m=3,4,说明: 如图1所示有8只猴子围成一圈,m=3。从1#猴的位置开始,顺时针1至3报数,第一个出圈的是3#;第二个出圈的是6#,第3个出圈的是1#;第4个出圈的是5#;第5个是2#,第6个是8#;第7个是4#。最后剩下一个是7#,它就是猴王。 我们用循环链表来模拟这个选择过程。,5,1、定义一个名为mon的结构 struct mon int num; / 整数,表示猴子的编号 struct mon *next; / 指针,指向相邻的下一只猴子 2、将链表的头指针head定义为全局变量。 struct mon*head; 3、主函数 用键盘输入猴子数n,输入数m,调用函数create建立一个循环链表,模拟众猴围成一圈的情况。该函数的实参为n。调用函数select,模拟1至m报数,让n-1只猴子逐一出列的过程。即在具有n个结点的循环链表按报数m删除结点的过程。该函数的实参为m,最后输出猴王的编号。,6,4、建立循环链表的函数create(int nn) 其中nn为形式参数。要从编号1到编号nn。思路是 (1)先做第1个结点,让其中的数据域p-num赋值为1,让指针域赋值为null。之后让链头指针head指向第1个结点。利用指针q记住这个结点,以便让指针p去生成下面的结点。 (2)利用一个计数循环结构,做出第2个结点到第nn个结点。并将相邻结点一个接一个链接到一起。 (3)最后一个结点要和头结点用下一语句链接到一起 tail = q; tail-next = head;,head,tail,q,7,5、删结点的函数select(int mm) mm为形式参数,从1至m报数,凡报到mm者删除其所在的结点。 设计两个指针p和q。一开始让q指向链表的尾部q=tail。让p指向q的下一个结点。开始时让p指向1#猴所在的结点。用一个累加器x,初始时x=0,从1#猴所在结点开始让x=x+1=1,如果mm是1的话,1#猴所在的p结点就要被删除。有三条语句 printf(“被删掉的猴子号为%d号n”,p-num); q-next = p-next; free(p);,head,tail,q,p,演示,8,这里free(p)是释放p结点所占用的内存空间的语句。如果mm不是1而是3,程序会在do-while循环中,让x加两次1,q和p一起移动两次,p指向3#所在结点,q指向2#所在结点,之后仍然用上述三条语句删去3#所在的结点。,head,q,p,q,p,p,q,演示,9,这个do-while循环的退出条件是q=q-next。即当只剩下一个结点时才退出循环。当然猴王非其莫属了。这时,让头指针head指向q,head是全局变量,在主程序最后输出猴王时要用head-num。,参考程序如下:,head,q,10,#include / 预编译命令 #include / 内存空间分配 #define null 0 / 定义空指针常量 / 定义常量,表示结构长度 #define LEN sizeof(struct mon) struct mon / 结构声明 int num; / 整型数,用于记录猴子号 struct mon *next; / mon结构指针 ; struct mon *head, *tail; / mon结构指针,全局变量,11,void create(int nn) / 被调用函数 / 函数体开始 int i; / 整型变量i,用于计数 struct mon *p,*q; / 声明mon结构指针p,q / 为p分配内存空间 p=(struct mon *) malloc(LEN); p-num=1; / 初始化p结点num域为1 p-next=null; / 初始化p结点next域为空 head=p; / 链表头指针head赋值为p q=p; / q赋值为p,12,for(i=2;inum=i; / 初始化p结点num域为i,表示猴子号 q-next=p; / 将p结点加到链表尾部 q=p; / 让q指向链表尾部结点 p-next=null; / 链表尾部指向空 / 循环体结束 tail = q; / 链表尾 tail-next=head; / 链表尾部指向链表头, / 形成循环链表 / 函数体结束,13,/ 被调用函数select,mm表示结点删除间隔 void select(int mm) / 函数体开始 int x=0; / 声明整型值x,并初始化为0 struct mon *p,*q; / 声明结构指针p,q q=tail; / q赋值为tail,指向循环链表尾部 do / 直到型循环,用于循环删除指定间隔的结点 / 循环体开始 p=q-next; / p赋值为q相邻的下一个结点 x=x+1; / x加1 if(x % mm=0) / x是否整除mm, / 表示是否跳过指定间隔 / 输出被删掉的猴子号 printf(“被删掉的猴子号为%d号n“,p-num); q-next=p-next; / 删除此结点 free(p); / 释放空间 else q=p; / q指向相邻的下一个结点p while(q!=q-next); / 剩余结点数不为1,则继续循环 head = q; / head指向结点q,q为链表中剩余一个结点 / 函数体结束,14,v
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年海归人才岗位招聘面试参考题库及参考答案
- 2025年盘点分析师岗位招聘面试参考试题及参考答案
- 7 工笔花卉(说课稿)人教版(2012)美术六年级下册
- Unit 2 No RulesNo Order (Pronunciation-2f)说课稿 2025年人教版英语七年级下册
- 四川公务员遴选笔试真题2024
- 3说课稿-2025年高中语文选择性必修下册统编版(部编版)
- 4.2《农业》说课稿2023-2024学年人教版地理八年级上册
- 国家网络安全宣传周知识竞赛题目及答案
- 校长在高三备考工作会议上的讲话:凝心冲刺攻坚2026高考梦想成真
- 4 化工工业防火常识
- 党的二十届四中全会精神丨线上知识有奖竞答题库
- 2026云南云天化石化有限公司校园招聘9人考试笔试备考题库及答案解析
- 海域云:2025年中国户用储能行业出海研究报告
- 社交礼仪知识互动试题及答案
- 职业生涯规划计划书(34篇)
- 2025-2030中国眼视光行业现状态势与未来前景预测报告
- 撬装加油站管理制度
- 2023年定陶县广播电视台(融媒体中心)招聘笔试模拟试题及答案解析
- 自主游戏中教师观察分析的要领
- 项目三 金属的塑性变形与再结晶
- 初中信息技术-《初识3DOne软件》教学教学课件
评论
0/150
提交评论