数据结构练习:约瑟夫问题——循环链表的建立与使用

1.约瑟夫问题

描述:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入:输入包含两个整数,第一个是n,第二个是m (0 < m,n <=300)。

输出:输出包含一行,即最后猴王的编号。

 

样例输入

12 4

样例输出

1

#include
#include   //存放malloc,calloc,realloc,free函数
using namespace std;
typedef int ElemType;

typedef struct DNode   //结点类型
{
    int data;                    //数据域
    struct DNode *next; //指针域
}DNode;  //DNode为结构体类型的变量名。
int main()
{
    DNode *L,*r,*s,*p;
    int i,n,k;
    scanf("%d%d",&n,&k);
    L = (DNode *)malloc(sizeof(DNode));
    r = L;
    for(i = 1; i <= n; i++)    //尾插法建立链表,插入数据
    {
        s = (DNode *)malloc(sizeof(DNode));
        s->data = i;
        r->next = s;
        r = s;
    }
    p = L->next;
    s->next = p;   //连接首尾元素,使链表成环。
    free(L);     // 释放头结点
    while(p->next != p)
    {
        for(i = 1; i< k-1; i++)
        {
            p = p->next;
        }
        p->next = p->next->next;    //将第k只猴子淘汰
        p = p->next;
    }
    printf("%d\n",p->data);

    return 0;
}

你可能感兴趣的:(数据结构上机练习)