Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1353234
  • 博文数量: 370
  • 博客积分: 10654
  • 博客等级: 中将
  • 技术积分: 4396
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 15:44
文章分类

全部博文(370)

文章存档

2012年(36)

2011年(195)

2010年(139)

分类: C/C++

2011-04-20 15:49:39

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

#include
#include

#define LENGTH sizeof(MEN)

struct men  
{
     int   number;   //人数
int   code;     //密码
struct men *next;
};

typedef struct men MEN;                                           

int main(int argc, char *argv[])
{
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("头结点空间分配出错!\n");
return EXIT_FAILURE;
}
// 初始这个链表,对头结点进行赋值
     pHead->number = 1;
printf("请输入第1位的密码:");
scanf("%d", &pHead->code);
for (client = 2; client <= NUMBER; client++)
{
pOne = (MEN *)malloc(LENGTH);
if(pOne == NULL)
{
printf("空间分配出错!\n");
return EXIT_FAILURE;
}
pOne->number = client;
printf("请输入第%d位的密码:", client);
scanf("%d", &pOne->code);
pTwo->next = pOne;
pTwo = pOne;
}
pOne->next = pHead;

printf("\n被选出的次序:");
     // 进行操作
pTwo = pHead;
pOne = pTwo->next;
while(pOne->next != pTwo)
{
for(client = 0; client < NEXT - 2; client++)
{
pTwo = pOne;
pOne = pOne->next;
}
    pTwo->next = pOne->next;

         // 释放不用的结点
printf("%d ", pOne->number);
    NEXT = pOne->code;
pOne = NULL;
free(pOne);
  
pOne = pTwo->next;
pOne = pOne->next;
pTwo = pTwo->next;//保持初始状态
}
printf("%d", pTwo->number);
printf("\n最后留下的是:%d\n", pOne->number);

return EXIT_SUCCESS;
}

阅读(1536) | 评论(2) | 转发(0) |
0

上一篇:马鞍点

下一篇:网络块设备 - NBD

给主人留下些什么吧!~~

riribi2011-04-20 18:22:59