约瑟夫环问题(C语言、数据结构版)

一、问题描述

N个人围城一桌(首位相连),约定从1报数,报到数为k的人出局,然后下一位又从1开始报,以此类推。最后留下的人获胜。(有很多类似问题,如猴子选代王等等,解法都一样)

二、思路分析

  (1)可将人的顺序简单编号,从1到N;

  (2)构造一个循环链表,可以解决首位相连的问题,同时如果将人的编号改为人名或者其他比较方便

  (3)将人的编号插入到结构体的Data域;

  (4)遍历人的编号,输出参与的人的编号;

  (5)开始报数,从头报数,报到k的人出局(删除次结点),(输出出局的人更人性化)避免浪费,可释放次结点。直到人数只有一个人时,退出循环。输出获胜的人。

  (6)注意:在写删除删除结点的函数时都是针对K>=2的情况处理,所以要考虑k=1的情况,要是出局的密码为1时则最后一个获胜。

三、算法实现

(1)构造结构体

typedef struct Node{
int Num;//Data域
struct Node *next;
}JoseNode, *PNode, *HNode;//PNode为指针变量,HNode为头结点

(2)得到头结点

HNode h = ((HNode)malloc(sizeof(JoseNode)));

  (3)初始化循环单链表

 int JoseInit(HNode *h)
{
if (!h)
{
printf("初始化链表错误!\n");return ; }
(*h)->next = (*h);//循环单链表
return ;
}

(4)插入算法

 int JoseInsert(JoseNode *h, int pos, int x)
{
PNode p=h,q;
int i=;if (pos == )/*尾插法*/
{
p->Num = x;
p->next = p;
return ;
}
while(i<pos-)
{
p=p->next;
i++;
}
q=(PNode)malloc(sizeof(JoseNode));
q->Num=x;
q->next=p->next;
p->next=q;
return ;
}
for (i = ; i <=N; i++)
{
JoseInsert(h, i, i);
}

(4)遍历算法

void TraverseList(HNode h, int M)

{

int i = 0;

PNode p = h;

printf("参与的人的编号为:\n");

while (i<M)

{

printf("%d\t", p->Num);

p = p->next;

i++;

}

printf("\n");

}

(5)找到出局的人,并删除(删除算法)

  if(k > 1)//考虑出局密码为1时的情况

JoseDelete(h, N, k);

else

{

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

printf("出局的人为:%d号\n",i);

printf("***************获胜者为:%d号***************",N);

}

int JoseDelete(HNode h, int M, int k)

{       int i;

PNode p=h,q;

while(M>1)//循环终止条件,只剩一个人时

{

for(i=1;i<k-1;i++)//此处为i<k-1,因为要找到的是出局的人的前一个结点①

{

p=p->next;

}

q=p->next;

p->next=q->next;

printf("出局的人为:%d号\n",q->Num);

free(q);//释放次结点

p=p->next;//与①处的相对应,①处找到的只是出局的人的前一个结点

M--;

}

printf("***************获胜者为:%d号***************",p->Num);

return 1;

}

四、完整代码

  

 #include <stdio.h>
#include <malloc.h> /*构建结构体*/
typedef struct Node{
int Num;
struct Node *next;
}JoseNode, *PNode, *HNode; /**********初始化循环单链表*********/
int JoseInit(HNode *h)
{
if (!h)
{
printf("初始化链表错误!\n");
return ;
}
(*h)->next = (*h);//循环单链表
return ; } /*************单链表插入操作**********/
int JoseInsert(JoseNode *h, int pos, int x)
{
PNode p=h,q;
int i=;
if (pos == )/*尾插法*/
{
p->Num = x;
p->next = p;
return ;
}
while(i<pos-)
{
p=p->next;
i++;
}
q=(PNode)malloc(sizeof(JoseNode));
q->Num=x;
q->next=p->next;
p->next=q;
return ;
} /*遍历*/
void TraverseList(HNode h, int M)
{
int i = ;
PNode p = h;
printf("参与的人的编号为:\n");
while (i<M)
{
printf("%d\t", p->Num);
p = p->next;
i++;
}
printf("\n");
}
/**************出局函数****************/ int JoseDelete(HNode h, int M, int k)
{ int i;
PNode p=h,q;
while(M>)
{
for(i=;i<k-;i++)
{
p=p->next;
} q=p->next;
p->next=q->next;
printf("出局的人为:%d号\n",q->Num);
free(q); p=p->next;
M--;
}
printf("***************获胜者为:%d号***************",p->Num);
return ;
} /***************************************/
int main()
{
int i;//计数器
int N;//参与的人数
int k;//报数密码
printf("请输入参与人数:");
scanf("%d",&N);
printf("请输入出局密码:");
scanf("%d",&k); /**************得到头结点****************/
HNode h = ((HNode)malloc(sizeof(JoseNode))); /***************初始化单链表************/
JoseInit(&h); /******将编号插入到循环单链表中******/
for (i = ; i <=N; i++)
{
JoseInsert(h, i, i);
}
/**************遍历单链表***************/
TraverseList(h,N); /***************出局函数************/
if(k > )
JoseDelete(h, N, k);
else
{
for(i = ; i < N; i++)
printf("出局的人为:%d号\n",i);
printf("***************获胜者为:%d号***************",N);
} printf("\n");
printf("\n");
return ;
}
五、实验验证

  

经过验证,实验成功!如果有不足的地方,请大家指出来,一起探讨!写得不清楚的可以与我联系。

约瑟夫环(N个人围桌,C语言,数据结构)的更多相关文章

  1. 数据结构7: 循环链表(约瑟夫环)的建立及C语言实现

    链表的使用,还可以把链表的两头连接,形成了一个环状链表,称为循环链表. 和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,就形成了一个环. 图1 循环链表 循环链表和动态链表相比,唯一的不 ...

  2. C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

    尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...

  3. C语言链表实现约瑟夫环问题

    需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...

  4. 约瑟夫环问题 --链表 C语言

    总共有m个人在圆桌上,依次报名,数到第n个数的人退出圆桌,下一个由退出人下一个开始继续报名,循环直到最后一个停止将编号输出 #include <stdio.h>#include <s ...

  5. 约瑟夫环的C语言数组实现

    约瑟夫环问题的具体描述是:设有编号为1,2,……,n的n个(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,才从他的下一个人起重新报数,报到m时停止报数,报m的出圈, ...

  6. Java数据结构之单向环形链表(解决Josephu约瑟夫环问题)

    1.Josephu(约瑟夫.约瑟夫环)问题: 设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m ...

  7. 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用

    什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...

  8. 14.约瑟夫环问题[JosephusProblem]

    [题目] n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后,从被删除数字的下一个继续删除 ...

  9. 简单约瑟夫环的循环单链表实现(C++)

    刚刚接触C++以及数据结构,今天做了第一次尝试用C++和数据结构解决问题,问题是基于约瑟夫环问题的简单版. 先来看看约瑟夫环问题的介绍: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.. ...

随机推荐

  1. codeforces 631A Interview

    A. Interview time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  2. Android流量监控 思路,想法

    1,开启一个服务,每5分钟跑动一次更新流量,用于能够准确记录流量         每一个小时,更新一次流量,用于清除非本月的流量 2,保存流量的时候,进行判断         a,若是数据库中保存的 ...

  3. Codeforces Round #359 (Div. 2) C. Robbers' watch (暴力DFS)

    题目链接:http://codeforces.com/problemset/problem/686/C 给你n和m,问你有多少对(a, b) 满足0<=a <n 且 0 <=b &l ...

  4. SQL Select的执行顺序

    1.FROM 2.ON 3.JOIN 4.WHERE 5.GROUP BY 6.WITH CUBE or WITH ROLLUP 7.HAVING 8.SELECT 9.DISTINCT 10.ORD ...

  5. hadoop数据[Hadoop] 实际应用场景之 - 阿里

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.明天在这里和大家一起学习一下hadoop数据 Hadoop在淘宝和支付宝的应用从09年开始,用于对海量数据的离线处置,例如对日志的分析,也涉及内 ...

  6. Excel设置数据有效性实现单元格下拉菜单的3种方法(转)

    http://blog.csdn.net/cdefu/article/details/4129136 一.直接输入: 1.选择要设置的单元格,譬如A1单元格: 2.选择菜单栏的“数据”→“有效性”→出 ...

  7. hdu1428漫步校园( 最短路+BFS(优先队列)+记忆化搜索(DFS))

    Problem Description LL最近沉迷于AC不能自拔,每天寝室.机房两点一线.由于长时间坐在电脑边,缺乏运动.他决定充分利用每次从寝室到机房的时间,在校园里散散步.整个HDU校园呈方形布 ...

  8. C++中使用union的几点思考(转)

    C++中使用union的几点思考 大卫注:这段时间整理旧资料,看到一些文章,虽然讲的都是些小问题,不大可能用到,但也算是一个知识点,特整理出来与大家共享.与此相关的那篇文章的作者的有些理解是错误的,我 ...

  9. HDU 5235 Friends (2015 Multi-University Training Contest 2 搜索+剪枝)

    题目链接:pid=5305">传送门 题意: n个人给定m个关系.每一个关系为x,y表示x,y是朋友.可是可能是online friends,也可能是offline friends. ...

  10. RapeLay(电车之狼R)的结局介绍 (隐藏结局攻略)

    RapeLay(电车之狼R)的结局介绍 (隐藏结局) 必备知识要让MM怀孕非常easy.起初刚进入调教模式后.仅仅要H一次 MM就開始有时期状态. 生理(连上有红晕) ->不详状态(闭目第一次) ...