约瑟夫问题

杀人过程 杀第四个

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];

}`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值