#include <stdio.h><stdio.h><br>#include <stdlib.h><stdlib.h></stdlib.h></stdio.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
{
intnumber;
intcode;
struct men *pMen;
};
typedef struct men MEN;
//////////////////////////////////////////////////////////////////////////
// 约瑟夫环的循环链表实现
//////////////////////////////////////////////////////////////////////////
void main()
{
MEN*pOne = NULL,
*pTwo = NULL,
*pHead = NULL;
intclient;
intNUMBER = 13;//设置默认的人数
intNEXT = 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);
}
分享到:
相关推荐
是最简单的约瑟夫环代码 结构简单易懂 保证你会满意的呀
循环链表 实现约瑟夫环 java 自己写的 测试通过 有注释
通过循环链表实现约瑟夫环问题,用c语言实现。属于数据结构部分内容
使用c语言中的循环链表及结构体实现约瑟夫环问题
约瑟夫环,用循环链表实现,语言为Java。假设数到三的数出列。程序输出1到10的出列顺序。
约瑟夫环的循环链表实现,这个程序比较完整,有需要做试验的请速速下载。
约瑟夫问题循环链表实现代码
用循环链表的方式实现约瑟夫环,下面是部分代码, typedef struct node { int key; int seatnum; struct node *next; }node,*linklist; void createlist(linklist&l,int n) { l=(linklist)malloc(sizeof(node));...
约瑟夫环的问题描述 ...一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针...利用单循环链表作为存储结构模拟此过程; ⑵.键盘输入总人数、初始报数上限值m及各人密码; ⑶.按照出列顺序输出各人的编号。
单向循环链表实现约瑟夫环.zip
约瑟夫环有很多种问法,这里举例了其中一种,不过都大同小异 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围, 每个人都有自己的一个密码。 从第一个人开始报数,数到m(初始设定)的那个人出列; 他的下...
一开始任选一个正整数作为报数上限值m,从第一个仍开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部...
数据结构问题,编程实现约瑟夫环,原题是严淑敏的《数据结构C语言版题集》实习一的第二题
Josephus约瑟夫问题的循环链表实现.cpp
单链表解决约瑟夫环问题
VC++采用单向循环链表实现约瑟夫环,希望和大家共勉。
程序源代码: #include typedef struct Node { int num; int pasword;
循环链表实现约瑟夫环问题 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又...