约瑟夫环的循环链表实现

原创 2004年08月06日 23:33:00

#include <stdio.h>
#include <stdlib.h>

#define NUMBER 13  //可以通过输入确定人的个数
#define NEXT 8    //确定报数的间隔数 
#define LENGTH sizeof(MEN)
#define NULL 0

struct men 
{
     int number;
     struct men *pMen;
};

typedef struct men MEN;

/********************************************/
/* 约瑟夫环的循环链表实现                                       */
/********************************************/
void main()
{
     MEN *pOne = NULL, *pTwo = NULL, *pHead =NULL;
     int client;

 /*
  * 创建环形链表
  */
     pHead = pOne = pTwo = (MEN *)malloc(LENGTH);
     pHead->number = 1;
     for (client = 2; client <= NUMBER; client++)
     {
          pOne = (MEN *)malloc(LENGTH);
          pTwo->pMen = pOne;
          pOne->number = client;
          pTwo = pOne;
     }
     pOne->pMen = pHead;
     /*
      * 进行操作
      */
     pTwo = pHead;
     pOne = pTwo->pMen;
     while(pOne->pMen != pTwo)
     {
          for(client = 0; client < NEXT - 2;client++)
         {
              pTwo = pOne;
              pOne = pOne->pMen;
          }
//  if(pOne == pHead)//对于单向链表的头指针删除问题已经不存在
//   pHead = pOne->pMen;
//  else
      pTwo->pMen = pOne->pMen;
      pOne = NULL;
      free(pOne);
      pOne = pTwo->pMen;
      pOne = pOne->pMen;
      pTwo = pTwo->pMen;//保持初始状态
 }
 printf("%d/n", pOne->number);

}

对于每一位都有一个位权的实现:

#include <stdio.h>
#include <stdlib.h>

#define LENGTH sizeof(MEN)
#define NULL 0

struct men 
{
 int   number;
 int   code;
 struct men *pMen;
};

typedef struct men MEN;

//////////////////////////////////////////////////////////////////////////
// 约瑟夫环的循环链表实现                                             
//////////////////////////////////////////////////////////////////////////

void main()
{
 MEN  *pOne  = NULL,
   *pTwo  = NULL,
   *pHead = NULL;
 int  client;
 int  NUMBER = 13; //设置默认的人数
 int  NEXT = 3;     //选出的人数间隔的初始间隔数
 //
 // 输入人数
 //
 printf("请输入游戏的人数:");
 scanf("%d", &NUMBER);
 //
 // 创建环形链表
 //
 pHead = pOne = pTwo = (MEN *)malloc(LENGTH);
 if (pHead == NULL)
 {
  printf("头结点空间分配出错!");
  return;
 }
 //
 // 初始这个链表,对头结点进行赋值
 //
 pHead->number = 1;
 printf("请输入第1位的密码:");
 scanf("%d", &pHead->code);
 for (client = 2; client <= NUMBER; client++)
 {
  pOne = (MEN *)malloc(LENGTH);

  if(pOne == NULL)
  {
   printf("空间分配出错!");
   return;
  }
  
  pTwo->pMen = pOne;
  pOne->number = client;
  printf("请输入第%d位的密码:", client);
  scanf("%d", &pOne->code);
  pTwo = pOne;
 }
 pOne->pMen = pHead;

 printf("/n被选出的次序:/n");
 //
 // 进行操作
 //
 pTwo = pHead;
 pOne = pTwo->pMen;
 while(pOne->pMen != pTwo)
 {
  for(client = 0; client < NEXT - 2;client++)
  {
   pTwo = pOne;
   pOne = pOne->pMen;
  }
//  if(pOne == pHead)//对于单向链表的头指针删除问题已经不存在
//   pHead = pOne->pMen;
//  else
  pTwo->pMen = pOne->pMen;
  //
  // 释放不用的结点
  //
  printf(" %d ", pOne->number);
  NEXT = pOne->code;
  pOne = NULL;
  free(pOne);
  
  pOne = pTwo->pMen;
  pOne = pOne->pMen;
  pTwo = pTwo->pMen;//保持初始状态
 }
 printf("%d", pTwo->number);
 printf("/n最后留下的是:%d/n", pOne->number);
}

约瑟夫环问题(循环链表)

华为上机题,约瑟夫环,循环链表
  • wenhai_zh
  • wenhai_zh
  • 2013年07月29日 19:02
  • 18059

循环单链表实现约瑟夫环问题

问题: 编号为1,2,3,,,n的n个人按顺时针围坐一起,每人有一个正整数密码。一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针向自1开始顺序报数,报到m的停止,出列,并把出列的人手中的密码...
  • SAYA_
  • SAYA_
  • 2015年10月19日 13:40
  • 1586

java循环链表实现约瑟夫环问题

文章主要用循环链表实现了约瑟夫环问题。约瑟夫环问题详细问题可以百度。...
  • mz690048mz
  • mz690048mz
  • 2015年11月19日 19:44
  • 771

Java循环链表实现约瑟夫环

* 单向循环链表形成约瑟环
  • chx0501
  • chx0501
  • 2015年09月27日 17:03
  • 2009

用单向循环链表解决约瑟夫环(Joseph)问题

约瑟夫环(Joseph)问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始人选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数...
  • qq_23233049
  • qq_23233049
  • 2015年04月09日 15:29
  • 3492

循环链表解决约瑟夫环问题

约瑟夫环是一个经典的数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此...
  • jw903
  • jw903
  • 2014年08月31日 20:14
  • 3376

链表初解(三)——约瑟夫环之循环链表实现

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开 始报数,数到m的那个人又出列;依此规...
  • u012904198
  • u012904198
  • 2014年03月29日 01:54
  • 2000

Java循环链表实现约瑟夫环

问题描述: 约瑟夫环运作如下: 1、一群人围在一起坐成[2]  环状(如:N) 2、从某个编号开始报数(如:K) 3、数到某个数(如:M)的时候,此人出列,下一个人重新报数 4、一直循环,直...
  • wangshuang1631
  • wangshuang1631
  • 2016年10月11日 21:42
  • 2449

C语言实现约瑟夫环,使用循环单链表和循环数组2种方法

使用C语言实现约瑟夫环,循环单链表和循环数组2种方法。
  • fengjunwang1980
  • fengjunwang1980
  • 2016年06月21日 22:26
  • 1967

约瑟夫环的链表解法和数学解法

约瑟夫环(Josephus)问题是由古罗马的史学家约瑟夫(Josephus)提出的,他参加并记录了公元66—70年犹太人反抗罗马的起义。约瑟夫作为一个将军,设法守住了裘达伯特城达47天之久,在城市沦陷...
  • haishu_zheng
  • haishu_zheng
  • 2013年12月09日 11:42
  • 14108
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:约瑟夫环的循环链表实现
举报原因:
原因补充:

(最多只允许输入30个字)