首页 > 代码库 > 循环链表之约瑟夫问题

循环链表之约瑟夫问题

约瑟夫问题

(上课结束,大家听说第一周没有编程题目,立刻就被鄙视了,为了纠正这个错误,咱们本周就来做点简单题目。本题要求用循环链表实现)

约瑟夫问题是一个经典的问题。已知n个人(不妨分别以编号1,2,3,…,n 代表 )围坐在一张圆桌周围,从编号为 k 的人开始,从1开始顺时针报数1, 2, 3, ...,顺时针数到m 的那个人,出列并输出。然后从出列的下一个人开始,从1开始继续顺时针报数,数到m的那个人,出列并输出,…依此重复下去,直到圆桌周围的人全部出列。

输入:n, k, m

输出:按照出列的顺序依次输出出列人的编号,编号中间相隔一个空格,每10个编号为一行。

非法输入的对应输出如下

a)

输入::n、k、m任一个小于1
输出:n,m,k must bigger than 0.

b)

输入:k>n

输出:k should not bigger than n.

 

例:

输入:9,3,2

输出:4 6 8 1 3 7 2 9 5

#include <stdio.h>#include <stdlib.h>typedef struct node{    int No;    struct node * next;}N, *PN;int main(){    int n, k, m, i, j=1;    PN head, tmp, p, q;    head = (PN)malloc(sizeof(N));    head->next = NULL;    scanf("%d",&n);    getchar();    scanf("%d",&k);    getchar();    scanf("%d",&m);    if (n<1 || k<1 || m<1)    {        printf("n,m,k must bigger than 0.\n");        return 0;    }    if (k>n)    {        printf("k should not bigger than n.\n");        return 0;    }    for (i=0; i<n; i++)    {        tmp = (PN)malloc(sizeof(N));        if (i==0) q = tmp;        tmp->next = head->next;        head->next = tmp;        tmp->No = n-i;        if (tmp->No == k)            p = tmp;    }    q->next = head->next;    while (n--)    {        for (i=1; i<m; i++)        {            p = p->next;        }        printf("%d",p->No);        p->No = p->next->No;        if (n == 0 || ((j++)%10==0)) printf("\n");        else printf(" ");        q = p->next;        p->next = q->next;        free(q);    }    free(head);    return 0;}

 

循环链表之约瑟夫问题