问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据结构课程设计题目:猴子选大王问题

发布网友 发布时间:2022-04-25 14:51

我来回答

2个回答

热心网友 时间:2022-04-18 22:16

一:实验内容:
M只猴子要选大王,选举办法如下:所有猴子按1,2……n编号围成一圈,从第一号开始顺序1,2……m,凡是报m号的退出圈外,如此循环报数直到圈内只剩一只猴子时这只猴子就是大王。
二:实验要求:
利用单向循环链表模拟此过程,输出选出的大王编号。
三:程序的设计思想:
(1) 问题分析:“猴子选大王”问题是约瑟夫环问题的一个特例。由于本题目的数据元素个数不可知,所以可使用链表来动态的分配内存空间。而该问题又是一个不断的循环问题所以用循环链表来实现。
(2) 总体设计:首先生成一个空链表,并给n个结点分配空间,让单链表的表尾指针指向头结点则生成一个带有n个结点的循环单链表。再给每只猴子建立顺序的编号。现从第一个结点开始报数,依次顺序查找出报数为m的待出列的结点(猴子)通过q->next=p->next删除该结点后继续运行否则让q成为p的前驱指针。最后当p->next==p时停止运行,得到p所指向的结点即为猴子选出大王的编号。
四、源程序

#include <stdio.h>

#include <stdlib.h>

/* 定义链表节点类型 */

typedef struct node

{

int data;

struct node *next;

}linklist;

int main()

{

int i, n, k, m, total;

linklist *head, *p, *s, *q;

/* 读入问题条件 */

printf("Please enter the number of monkeys:");

scanf("%d", &n);

printf("Please enter from the monkeys began to count off the first of several:");

scanf("%d", &k);

printf("Please enter the number out:");

scanf("%d", &m);

/* 创建循环链表,头节点也存信息 */

head = (linklist*) malloc(sizeof(linklist));

p = head;

p->data = 1;

p->next = p;

/* 初始化循环链表 */

for (i = 2; i <= n; i++)

{

s = (linklist*) malloc(sizeof(linklist));

s->data = i;

s->next = p->next;

p->next = s;

p = p->next;

}

/* 找到第 k 个节点 */

p = head;

for (i = 1; i < k; i++)

{

p = p->next;

}

/* 保存节点总数 */

total = n;

printf("\nOut of sequence:");

q = head;

/* 只剩一个节点时停止循环 */

while (total != 1)

{

/* 报数过程,p指向要删除的节点 */

for (i = 1; i < m; i++)

{

p = p->next;

}

/* 打印要删除的节点序号 */

printf("[%d] ", p->data);

/* q 指向 p 节点的前驱 */

while (q->next != p)

{

q = q->next;

}

/* 删除 p 节点 */

q->next = p->next;

/* 保存被删除节点指针 */

s = p;

/* p 指向被删除节点的后继 */

p = p->next;

/* 释放被删除的节点 */

free(s);

/* 节点个数减一 */

total--;

}

/* 打印最后剩下的节点序号 */

printf("\n\n King of the Monkey is the No. [%d] \n\n", p->data);

free(p);

system("pause");

return 0;

}

热心网友 时间:2022-04-18 23:34

我使用了另一种方法,不需要构建环形链表也可以,只需要用一个数组标记已离开的猴子即可,相对比较简单。这个程序输出猴子离开的顺序,最后输出的即为大王。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

int main()
{
int m,n;
int *not_in;
int pos;
int i;
int j;

printf("m n = ");
scanf("%d%d", &m, &n);
assert(m > 0);
assert(n > 0);
not_in = (int *)malloc(sizeof(int)*(m + 1));
memset(not_in, 0, sizeof(int)*(m + 1));

pos = m;
for (i = 1; i <= m; i++)
{
for (j = 1; j <= n; j++)
{
do
{
pos++;
if (pos == m + 1)
pos = 1;
}
while (not_in[pos]);
}
printf("%d ", pos);
not_in[pos] = 1;
}
printf("\n");

return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
黄山门户网主要栏目 壹家居品牌简介 湖南乐享生活家居有限公司一站式毛坯房解决方案 服务器出租 电脑上的时间日期不同步怎么办 台式电脑时间不同步怎么解决? 关于清明节的小学作文400字 微信怎么查询自己名下的微信 如何查看微信实名认证了几个账号 轿车120时速撞击力有多大? 安卓手机qq 什么都很正常 就是一点进群对话马上闪退 刚刚还好好的 重启了也没用 在线等解决方法 东方卫视《加油2008》女主持人是谁啊?有她的个人资料吗? 上海东方卫视女主持人何捷的出生年月? 谁知道东方卫视看东方主持人尹红的个人资料 东方卫视主持人 这个人是谁 求简介 东方卫视看东方节目的这女主持人叫什么名字? 东方卫视主持人丹丹近况如何? 东方卫视的女主持人有哪些? 上海女主持人有哪些? 我想问下上海电视台的丹丹,贝贝,万蒂妮都是几几年出生的啊? 东方卫视有几位女主持人 她们叫什么? 陈蓉房海燕暂时无法出镜,单位里还有哪些当红的女主持人? 唐嫣将主持东方卫视春晚,她的主持功底如何? 陈蓉正式转为幕后人员,东方卫视的五大女主持人,谁将成为新一姐?_百度... 正常性生活多少时间最佳!! 东方卫视主持人陈蓉的资料 性生活一般多久算正常? 东方卫视主持人名单女 性生活多长时间正常 做爱一般多少分钟算正常 一道数据结构课程设计题目 我的数据结构课程设计!!! 数据结构课程设计题目 1. 运动会分数统计   任务:参加运动会有n个学校,学校编号为1……n。比赛分成m个 《数据结构》课程设计题目急急!!! 《数据结构》课程设计 几个数据结构的课程设计题目 数据结构课程设计题:链表操作 一、 设计目的 1.掌握线性表的在顺序结构和链式结构实现。 2.掌握线性表 数据结构课程设计题 数据结构课程设计题目,图的建立以及遍历。 数据结构课程设计,求大神,只做其中一题 紧急!数据结构课程设计 题目:哈夫曼树的建立(由键盘输入各个节点,并建立二叉树,能实现对二叉树的查询 《数据结构》的课程设计,题目是请设计一个算法,把二叉树的叶子结点按从左到右的顺序连成。 求《数据结构》课程设计(题目:算术表达式求值) 求问!!!数据结构课程设计题:病毒测试程序。(c语言) 数据结构-课程设计:二叉排序树的实现 怎样洗螃蟹和做螃蟹 为什么QQ中有一个群只要点开QQ就会闪退 ACA电烤箱顶部的煎烤盘要一直放着么? ACA烤炉上配的那个煎烤盘可以干嘛啊 ACA烤箱ATO-MF24C烤盘能直接放在加热管上吗