杀人过程 杀第四个
1 2 3 4 5
0 0 0 0 0
第一遍
1 2 3 4
1
第二遍
5 1 2 3
1
第三遍
5 1 2 5
1
第四遍
1 2 1 2
1
代码段`/*
*声明 此程序只做示例,
*没有考虑程序健壮性
*不能放到实际生产环境中
*作者:王胜平
*时间:2015/4/25
*/
#
include <stdio.h>
#include <stdlib.h>
typedef struct member
{
char isKilled;
/******以下三个成员是扩展成员************/
char one;
char two;
char three;
int post; //索引
struct member * next;
struct member * pre;
} Member ;
//根据成员人数 生成整个 约瑟夫圈,返回第一个人的节点
Member * CreateMembers(int memberCount);
void orderMember(Member * m);
Member * KillMember(Member * m,int n,int cnt);
int main(int argc, char *argv[])
{
int cnt = 5;
int killIndex = 4;
Member * head = CreateMembers(cnt);
printf("the post of the first member is %d\n",head->post);
orderMember(head);
Member * survival = KillMember(head,killIndex,cnt);
printf("the post of the survival is %d\n",survival->post);
system("pause");
return 0;
}
//执行杀人事件
//参数:n --> 从第一个人开始数,数到 n就杀死第n个人,然后从第n+1 个 人开始数,数到n 杀死那个人
//参数:cnt --> member 的总数, 总共有多少人
Member * KillMember(Member * member,int n,int cnt)
{
int i=1;
Member * m= member;
//让节点 指向第一个人;
while(m->post != 1)
{
m = m->next;
puts("一直找第一个人");
}
printf("杀人开始,杀第%d的人\n",n);
while(i<=n)
{
while(m->isKilled) //找出下一个没被杀的
{
m= m->next;
}
printf("member post =%d \n",m->post);
if(i==n) //执行杀人
{
//执行杀人时,检测下 当前member 是不是仅存的 唯一一个人;
int killCnt = 0;//被杀人的总数
Member * temp = m;
int j;
for(j=1;j<=cnt;j++)
{
if(temp->isKilled)
killCnt++;
temp=temp->next;
}
if(killCnt >=(cnt-1)){
return m;
}
printf("杀人 序号:%d \n",m->post);
m->isKilled = 1;
m=m->next;//指向下一个
i=1;
continue;
}
m=m->next; //指向下一个;
i++;
}
return NULL;
}
//遍历下 成员
void orderMember(Member * m)
{
int i =0;
while(i++<50)
{
printf("%d-",m->post);
m=m->next;
}
putchar('\n');
}
Member * CreateMembers(int memberCount)
{
int i=1;
const int cnt = memberCount;
Member * arr = (Member *)malloc(sizeof(Member) * (cnt + 1)); //定义 Member * 数组
for(;i<=cnt;i++)
{
Member * current = arr+i;
current->isKilled = 0;
current->post = i;
current->next = (arr+i+1);
current->pre = (arr+i-1);
if(1==i)
{
current->pre= (arr+cnt);
}
if(i==cnt)
{
current->next = (arr+1);
}
}
return &arr[1];
}`