问题描述

围绕着山顶有n个圆形排列的洞,狐狸要吃兔子,兔子说:”可以,但必须找到我,我就藏于这n个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,第二次隔2个洞(即6号洞)找,以后如此类推,次数不限.”但狐狸从早到晚进进出出了m次,仍没有找到兔子.问:兔子究竟藏在那个洞里?

问题分析

这实际上是一个反复查找循环链表的过程.

定义一个循环链表,用户自己输入洞的个数n和查找次数m,用具有n个元素的循环链表来表示这n个洞.每个元素表示围绕山顶的一个洞,下标为洞的编号.对所有洞设置初始标志为0,然后通过m次循环,对每次所进之洞修改标志为1,最后输出标志为0的洞,即兔子藏身的洞.

解决问题

typedef int Status;
typedef int ElemType;                            //结构体里洞的编号和标志为整型
typedef struct LNode
{ElemType data;     //洞的编号ElemType flag;        //洞的标志,1表示狐狸进过此洞,0表示狐狸没有进过此洞struct LNode *next;
}*LinkList,LNode;

构造一个循环链表,并给n个洞编号,设置洞的初始标志为0.

LinkList InitList(int n)
{//构造一个循环链表Lint i;LinkList p,L;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;p=L;for(i=1;i<=n;i++){p->data=i;p->flag=0;if(i!=n){p->next=(LinkList)malloc(sizeof(LNode));p=p->next;}if(i==n){p->next=L;}}return L;
}

遍历链表,分别输出洞的编号和标志.

Status traverselist(LinkList L,int n)
{//遍历链表LinkList p;p=L;int i;printf("洞的编号:");for(i=0;i<n;i++){printf("%3d",p->data);p=p->next;}printf("\n");printf("洞的标志:");for(i=0;i<n;i++){printf("%3d",p->flag);p=p->next;}printf("\n");return OK;
}

狐狸开始找兔子,将进入过的洞标志改为1,寻找m次结束 。最后输出标志仍为0的洞,即兔子可能藏身地点。

Status Search(LinkList L,int m,int n)
{int i,j;LinkList p;p->flag=1;for(i=1;i<=m;i++){for(j=1;j<=i+1;j++){p=p->next;}p->flag=1;}printf("兔子可能存在的位置为:");p=L;for(i=0;i<n;i++){if(p->flag==0){printf("%3d",p->data);}p=p->next;}printf("\n\n");return OK;
}

全部代码

#include<stdio.h>
#include<stdlib.h>
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct LNode
{ElemType data;     //洞的编号ElemType flag;        //洞的标志,1表示狐狸进过此洞,0表示狐狸没有进过此洞struct LNode *next;
}*LinkList,LNode;LinkList InitList(int n)
{//构造一个循环链表Lint i;LinkList p,L;L=(LinkList)malloc(sizeof(LNode));L->next=NULL;p=L;for(i=1;i<=n;i++){p->data=i;p->flag=0;if(i!=n){p->next=(LinkList)malloc(sizeof(LNode));p=p->next;}if(i==n){p->next=L;}}return L;
}Status traverselist(LinkList L,int n)
{//遍历链表LinkList p;p=L;int i;printf("洞的编号:");for(i=0;i<n;i++){printf("%3d",p->data);p=p->next;}printf("\n");printf("洞的标志:");for(i=0;i<n;i++){printf("%3d",p->flag);p=p->next;}printf("\n");return OK;
}Status Search(LinkList L,int m,int n)
{int i,j;LinkList p;p->flag=1;for(i=1;i<=m;i++){for(j=1;j<=i+1;j++){p=p->next;}p->flag=1;}printf("兔子可能存在的位置为:");p=L;for(i=0;i<n;i++){if(p->flag==0){printf("%3d",p->data);}p=p->next;}printf("\n\n");return OK;
}int main()
{int m,n;printf("请输入查找次数和洞的个数;");scanf("%d%d",&m,&n);printf("\n");LinkList L;L=InitList(n);printf("初始:\n\n");traverselist(L,n);printf("\n******************************************\n\n");Search(L,m,n);printf("寻找%d次,结果为:\n\n",m);traverselist(L,n);return 0;
}

狐狸逮兔子——链式存储方式相关推荐

  1. 【数据结构 C描述】有两个整数集合 A 和 B 分别用两个线性表 LA 和 LB 表示,求:一个新的集合A=A∪B,A仍然为纯集合,线性表采用链式存储方式。【单链表】

    这是我的作业题,作业写完后再附到博客中,可能代码写得很烂.虽然是C语言写的,但是我在其中加入了C++的写法,例如cout.我懒得写printf的格式控制符,所以用cout来输出内容,这样我感觉简便多了 ...

  2. 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

    一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...

  3. 线性表的链式存储结构及代码实现(单链表,双链表,循环链表)

      在上一篇博文中介绍了线性表的顺序存储方式,它最大的缺点就是在插入和删除操作时会移动大量的元素,这显然会耗费很多时间.后来人们便想到了用链式存储方式来解决上面这一问题.链式存储线性表时,不需要使用地 ...

  4. 二叉树的存储方式【顺序储存(数组)、链式存储、邻接表存储等】

    其他二叉树知识!二叉树知识汇总 目录 前言: 1.顺序存储结构 2.链式存储结构 3.二维数组直接存储 4.邻接表存储 前言: 顺序存储和链式存储是经典讲解的内容,本文做简单理论介绍,而对于后两种:二 ...

  5. 数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序、中序、后序、层次)和线索二叉树

    二叉树每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,其次序不能任意颠倒. 1. 二叉树 二叉树一般采用链式存储结构,用链表节点来存储二叉树中每个节点.在二叉树 ...

  6. 狐狸逮兔子实验 c++

    实验描述 狐狸逮兔子实验 (一)问题描述 围绕着山顶有10个圆形排列的洞,互利要吃兔子,兔子说:"可以,但必须找到我,我就藏于这10个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,第二 ...

  7. 线性表-链式存储结构

    3.6 线性表的链式存储结构 3.6.1 顺序存储结构不足的解决办法 前面我们讲的线性表的顺序存储结构.它是有缺点的,最大的缺点就是插入和删除时需要移动大量元素,这显然就需要耗费时间.能不能想办法解决 ...

  8. 综合实验一 狐狸逮兔子

    一)问题描述 围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:"可以,但必须找到我,我就藏于这10个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,第二次隔2个洞(即6号洞)找,以 ...

  9. 综合实验:狐狸逮兔子

    实验要求:(一)问题描述 围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:"可以,但必须找到我,我就藏于这10个洞中,你先到1号洞找,第二次隔1个洞(即3号洞)找,第二次隔2个洞(即6 ...

  10. 数据结构与算法(6-2)二叉树的存储结构(顺序存储、链式存储)

    目录 一.二叉树的顺序存储 存储方式 总代码 二.二叉树的链式存储(二叉链表) 1.存储结构 2.创建二叉树 总代码 一.二叉树的顺序存储 存储方式 //树的顺序存储 typedef struct { ...

最新文章

  1. 如何利用大数据指导市场营销
  2. 浅析SAAS数据模型设计(Oracle)
  3. excel python 形状_何使用Python操作Excel绘制柱形图
  4. 乐山市2021年高考成绩查询,四川乐山2021年普通高考报名人数 实际高考参考人数...
  5. 下一代防火墙信息收集(概念篇)
  6. 仅输入单张图片,就能“看”出物体材质!这篇图形学论文已被SIGGRAPH 2021收录...
  7. Google公开C++编码规范
  8. 嘿,运维!你与VXLAN有场约会……
  9. anguarjs 上传图片预览_前端图片上传那些事儿
  10. 配置VS2008本地调试.NETFRAMEWORK源代码
  11. 最近和很多创业者和中小企业老板沟通
  12. maven私服搭建及应用
  13. 前端数据可视化echarts.js使用指南
  14. 使用微软MediaCreationTool21H1.exe制作u盘windous10启动盘
  15. VoxelMorph运行时遇到的问题
  16. QT开发(九)—— Qt实现应用内动态切换语言,使用Qt语言家编译字体包
  17. axios的简单封装处理
  18. linux 消息队列最大值,linux 消息队列的限制
  19. 百度地图android去除logo,百度地图 Android版 隐藏logo
  20. KGB知识图谱开创技术应用新渠道

热门文章

  1. JeecgBoot集成DataV组件库
  2. 关于用ADS设计PA中电容的选择
  3. Windows2003下运行JSP,环境配置教程(J2SDK+Tomcat5+IIS)
  4. pgm概率图模型_概率图形模型(PGM)算法| 机器学习
  5. 树莓派学习笔记——串口与摄像头
  6. linux 合并视频文件,Linux下转换视频格式与合并视频
  7. 吴裕雄--天生自然 诗经:临江仙·滚滚长江东逝水
  8. PostgreSQL的学习心得和知识总结(十九)|数据库游标详细使用说明及特性总结(全网最精细最详尽 仰望星空也要脚踏实地)
  9. 数据可视化的方法、工具和应用
  10. jxl 冻结单元格_如何在Word中冻结表格中单元格的大小