约瑟夫环的循环链表实现
2004-08-06 23:33
232 查看
#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);
}
#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);
}
相关文章推荐
- java单向循环链表实现约瑟夫环
- 循环链表----约瑟夫环实现
- 单向循环链表的实现以及约瑟夫环的实现
- 约瑟夫环之循环链表实现
- 用单向循环链表实现约瑟夫环
- 单向循环链表实现约瑟夫环
- 约瑟夫环问题(不带头结点单循环链表实现和数组实现)
- 循环链表 CircleList的实现并解决约瑟夫环问题
- 循环链表 约瑟夫环问题实现
- 链表初解(三)——约瑟夫环之循环链表实现
- C++循环链表之约瑟夫环的实现方法
- 数据结构学习之双向循环链表的基本操作(非递归实现)
- 双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)
- 用C++实现单向循环链表的解决方法
- 单向循环链表的实现C++封装
- 数据结构学习系列三-单向循环链表(c++实现且应用模板)
- 数据结构(三)——单向循环链表的java实现
- 单循环链表(C语言实现)
- 2.3线性表的链式表示和实现——2.3.2 循环链表,2.3.3双向链表
- 数据结构三:循环链表解决约瑟夫问题实现