大白话讲数据结构和算法__番外 约瑟夫问题的循环链表实现

著名犹太历史学家 Josephus有过以下的故事:

在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,请你设计一个程序,使得Josephus和他的朋友能够逃过了这场死亡游戏。

实现代码如下:

//n个人围圈报数,报m出列,最后剩下的是几号?
#include <stdio.h>
#include <stdlib.h>
//定义一个结点结构体
typedef struct node
{
    int data;
    struct node *next;
}node;

//根据n来创建一个循环列表

node * create(int n)
{
    node *p=NULL,*head,*s;
    head=(node *)malloc(sizeof(node));
    p=head;
    int i= 1;
    if(n!=0)
    {
        while (i<=n)
        {
            s=(node *)malloc(sizeof(node));
            s->data=i++;
            p->next=s;
            p=s;
        }
        s->next=head->next;

    }
    free(head);
    return s->next;


}

int main()
{
    int n=41,m=3,i;
    node *p=create(n);
    node *temp;
    m%=n;
    while (p!=p->next)
    {
        for(i=1;i<m-1;i++)
        {
          p=p->next;
        }

        printf("%d->",p->next->data);
        temp=p->next;
        p->next=temp->next;
        free(temp);
        p=p->next;

    }
    printf("%d\n",p->data);//输出最后一个节点
    return 0;
}

假如有不懂的可以发邮件到[email protected]咨询或者在下方评论

猜你喜欢

转载自blog.csdn.net/qq_41686130/article/details/81483472