约瑟夫环的循环链表实现

原创 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);
}

程序员面试宝典之数据结构基础----循环链表(约瑟夫环问题)

关于循环链表,即单链表的为指针指向头结点,当然在建立循环链表的时候可以将链表的为指针指向头结点,但本例用的是先建立一个只有一个节点的循环链表(即next指针指向自己结点),然后再在此循环链表中插入节点...
  • crazyer2010
  • crazyer2010
  • 2012-10-03 18:51:45
  • 4574

约瑟夫环算法(循环链表解决)

问题:约瑟夫环  有编号从1到N的N个人坐成一圈报数,报到M的人出局,下一位再从1开始,  如此持续,直止剩下一位为止,报告此人的编号X。输入N,M,求出X。 #include stru...
  • koudaidai
  • koudaidai
  • 2012-03-15 18:50:06
  • 950

约瑟夫环问题(循环链表实现C)

近日复习循环链表的时候忽然想到了约瑟夫环和循环链表都有相似之处,即都为一个圆,固尝试用循环链表写一下约瑟夫环,没想到成功了。 首先先把问题描述下吧: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已...
  • I_amSHm
  • I_amSHm
  • 2016-11-21 21:34:12
  • 504

Java循环链表实现约瑟夫环

* 单向循环链表形成约瑟环
  • chx0501
  • chx0501
  • 2015-09-27 17:03:53
  • 2228

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

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

【C语言】约瑟夫环(用单向循环链表解决)

约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围...
  • pointer_y
  • pointer_y
  • 2016-06-05 19:42:32
  • 5231

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

  • 2013年06月13日 16:07
  • 330KB
  • 下载

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

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

数据结构约瑟夫环

  • 2011年11月21日 20:52
  • 5KB
  • 下载

约瑟夫环问题(不带头结点单循环链表实现和数组实现)

Q:略         A:                   为了简化过程,类中只有3个函数即可,构造,增加,约瑟夫环解决函数    Ps:做这道题是为了巩固链表知识,在这过程中,this指...
  • ssk476079956
  • ssk476079956
  • 2012-06-13 16:26:05
  • 1403
收藏助手
不良信息举报
您举报文章:约瑟夫环的循环链表实现
举报原因:
原因补充:

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