237 views

约瑟夫环问题

约瑟夫环
编号为1,2,3,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,直到所有人全部出列为止。编程打印出列顺序。


#include<stdio.h>
#include<stdlib.h>

typedef struct people
{
    int key;
    int number;
    people *pre,*aft;
   
}*list;

list header ;
int curKey;

list create(int m)
{
    int n = 0,key=0;
    list p,tail;
    tail= (list)malloc(sizeof(list));
    tail->number = 1;
    printf("请输入第1个人的密码: ",n);
    scanf("%d",&tail->key);
    p = tail;
    header = tail;
    for (n=2;n<=m;n++)
    {
        tail= (list)malloc(sizeof(list));
        tail->number = n;
        printf("请输入第%d个人的密码: ",n);
        scanf("%d",&tail->key);
        p->aft = tail;
        tail->pre = p;
        tail->aft = header;
        header->pre = tail;
        p = tail;
    }
    return header;
}
list delete_p(int out,list cur)
{
    list p;
    int key=0;
    p = cur;
    while (-out)
        p = p->aft;
       
    printf("%d",p->number);
    curKey = p->key;
    p->pre->aft = p->aft;
    p->aft->pre = p->pre;
    p = p->aft;
    return p;
}

int main()
{
    int m,n,out;
    list cur;
    printf("请输入人数: ");
    scanf("%d",&m);
    header = create(m);
    printf("请输入第一个上限值: ");
    scanf("%d",&n);

    printf("出列顺序为: ");
    cur = delete_p( n % m ,header);
    while (m!=1)
    {
        m-;
        out = curKey;
        cur = delete_p(out,cur);
    }
    system("pause");
}

无觅相关文章插件,快速提升流量

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>