约瑟夫环问题 数据结构C语言描述

约瑟夫环问题

约瑟夫问题的一种描述为:编号1,2,…,n的n 个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个报数上限值m, 从第一个人开始顺时针自1开始顺序报数,报到m 时停止报数。报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。

例如m 的初值为20;n=7,7个人的密码依次是:3,1,7,2,4,8,4, 出列顺序为6,1,4,7,2,3,5。

【解答】:

#include

#include

typedef struct Node

{

int password;

int num;

struct Node *next;

}Node,*Linklist;

void Josephus()

{

Linklist L;

Node *p,*r,*q;

int m,n,C,j;

L=(Node*)malloc(sizeof(Node));/*初始化单向循环链表*/

if(L==NULL){printf("\n链表申请不到空间!");return;}

L->next=NULL;

r=L;

printf("请输入人数n 的值(n>0):");

scanf("%d",&n);

for(j=1;j

{

p=(Node*)malloc(sizeof(Node));

if(p!=NULL)

{

printf("请输入第%d个人的密码:",j);

scanf("%d",&C);

p->password=C;

p->num=j;

r->next=p;

r=p;

}

}

r->next=L->next;

printf("请输入第一个报数上限值m(m>0):");

scanf("%d",&m);

printf("*****************************************\n");printf("出列的顺序为:\n");

q=L;

p=L->next;

while(n!=1)/*计算出列的顺序*/{

j=1;

while(j

q=p;/*q为当前结点p 的前驱结点*/p=p->next;

j++;

}

printf("%d->",p->num);

m=p->password;/*获得新密码*/n--;

q->next=p->next;/*p出列*/

r=p;

p=p->next;

free(r);

}

printf("%d\n",p->num);

}

int main()

{

Josephus();

return 0;

}

约瑟夫环问题

约瑟夫问题的一种描述为:编号1,2,…,n的n 个人按顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个报数上限值m, 从第一个人开始顺时针自1开始顺序报数,报到m 时停止报数。报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号。

例如m 的初值为20;n=7,7个人的密码依次是:3,1,7,2,4,8,4, 出列顺序为6,1,4,7,2,3,5。

【解答】:

#include

#include

typedef struct Node

{

int password;

int num;

struct Node *next;

}Node,*Linklist;

void Josephus()

{

Linklist L;

Node *p,*r,*q;

int m,n,C,j;

L=(Node*)malloc(sizeof(Node));/*初始化单向循环链表*/

if(L==NULL){printf("\n链表申请不到空间!");return;}

L->next=NULL;

r=L;

printf("请输入人数n 的值(n>0):");

scanf("%d",&n);

for(j=1;j

{

p=(Node*)malloc(sizeof(Node));

if(p!=NULL)

{

printf("请输入第%d个人的密码:",j);

scanf("%d",&C);

p->password=C;

p->num=j;

r->next=p;

r=p;

}

}

r->next=L->next;

printf("请输入第一个报数上限值m(m>0):");

scanf("%d",&m);

printf("*****************************************\n");printf("出列的顺序为:\n");

q=L;

p=L->next;

while(n!=1)/*计算出列的顺序*/{

j=1;

while(j

q=p;/*q为当前结点p 的前驱结点*/p=p->next;

j++;

}

printf("%d->",p->num);

m=p->password;/*获得新密码*/n--;

q->next=p->next;/*p出列*/

r=p;

p=p->next;

free(r);

}

printf("%d\n",p->num);

}

int main()

{

Josephus();

return 0;

}


相关内容

  • 〈数据结构〉上机实验指导
  • 数据结构实验指导书 陈宏明 张亚红 寇海洲编 淮阴工学院计算机系 二OO 五年九月 目 录 实验一 线性表及其应用----- --------2 实验二 实验三 实验四 实验五 实验六 栈和队列及其应用-------------5 二叉树及其应用--------------7 图及其应用------ ...

  • [数据结构课程设计]课程设计方案
  • <算法与数据结构课程设计>方案 Course Design of Data Structure 适用专业:计算机科学与技术专业 本科 课程代码:B08233004 一.课程设计的性质和目的 软件设计能力培养对学生是很重要.通过数据结构的学习,使学生对软件编程能力有一定的提高.数据结构学习 ...

  • 约瑟夫·海勒小说中的后现代主义艺术手法研究
  • 摘要:约瑟夫・海勒的代表作<第二十二条军规>一经推出便轰动了美国社会,打破了当时美国文坛的沉闷局面,被称作是"黑色幽默"派文学的代表作品,并且也是后现代主义文学的先驱作品之一.海勒小说中的人物通常是荒诞不经.离奇古怪的,而作品中蕴含的深刻寓意和强烈的对现实的批判又使他 ...

  • 2011中考记叙文阅读方法
  • 记叙文阅读 1. 记叙文的文体知识 (1).记叙文的概念 记叙文是以记人.叙事.写景.状物为主要内容,以记叙.描写为主要表达方式,兼以议论.抒情.说明来表达中心的一种文体.如小说.散文.寓言.童话.故事.通讯.游记.传记.回忆录等. (2).记叙文的分类 按写作的内容可以分为:写人记叙文.叙事记叙文 ...

  • 从思维方式角度谈"李约瑟难题"
  • 摘 要:李约瑟的巨著<中国之科学与文明>使中国人对科学与工艺方面的成就,以及对西方文明的影响大白于世,然而由于他对"科学"与"技术"的分际不清引发了学术界对"李约瑟难题"长久的讨论.要回答这一难题,首先必须厘清"科学& ...

  • [画里画外]的后现代历史观及其叙事策略
  • 国别文学研究 <画里画外>的后现代历史观及其叙事策略 王祖友 内容提要:<画里画外>是海勒的唯一一部长篇历史小说,小说中存在一种特殊 的处理历史事件和历史小说叙事的策略,显示了历史作为"历史"的叙事和历史作为"小说"的叙事的关系.纷乱的 ...

  • 计算机科学家介绍
  • 1. 理查德·马修·斯托曼(Richard Matthew Stallman, RMS, 1953~),自由软件运动的精神领 袖.GNU计划以及自由软件基金 会(Free Software Foundation) 的创立者.著名黑客.他的主要 成就包括Emacs及后来的GNU Emacs,GNU C ...

  • 管理信息系统知识要点
  • 管理信息系统 第一章 管理信息系统的基本概念 现代信息技术:计算机技术.通信网络技术.多媒体技术 三大资源/三大支柱产业:信息.物质.能源 MIS 的基础:现代信息技术.管理科学.系统科学 1.信息:是从记录客观事物的运动状态和运动方式的数据中提取出来的,对决策提供帮助的一种特定形式的数据. 特征: ...

  • 约瑟夫问题
  • [编辑本段]约瑟夫问题的来历 这是17世纪的法国数学家加斯帕在<数目的游戏问题>中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直 ...