数据结构--约瑟夫问题

来源:互联网 发布:centos挂载u盘 fat32 编辑:程序博客网 时间:2024/06/05 05:19

约瑟夫问题
(上课结束,大家听说第一周没有编程题目,立刻就被鄙视了,为了纠正这个错误,咱们本周就来做点简单题目。本题要求用循环链表实现)
约瑟夫问题是一个经典的问题。已知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
http://online.bit.edu.cn/moodle/mod/programming/view.php?id=65676

约瑟夫问题,简单循环链表应用,回忆一下链表就好。

#include<stdio.h>#include<string.h>#include<stdlib.h>const int N = 1000;int m, n, i, j, k;typedef struct people{    int id;    people *next;}people;people head;void creat(people *head){    people *p, *q, *end;    p = (people*)malloc(sizeof(people));    p->id = n;    head->next = p;    p->next = head;    end = p;    for(int i = n - 1; i >= 1; i--)    {        q = p;        p = (people*)malloc(sizeof(people));        p->next = q;        head->next = p;        p->id = i;    }    end->next = p;}void dele(people *p, people *q){    q->next = p->next;    free(p);}int main(){    while(~scanf("%d%*c%d%*c%d", &n, &k, &m))    {        if (n < 1 || k < 1 || m < 1)        {            printf("n,m,k must bigger than 0.\n");            continue;        }        if (k > n)        {            printf("k should not bigger than n.\n");            continue;        }        creat(&head);        people *p, *q;        p = head.next;        while(p->id != k) p = p->next;        int cot = 1;        for(i = 1; i <= n; i++)        {            for(j = 1; j < m; j++)            {                q = p;                p = p->next;            }            if (i == n || (cot++) % 10 == 0) printf("%d\n", p->id);            else if (i != n) printf("%d ", p->id);            people *pq = p->next;            dele(p, q);            p = pq;        }    }    return 0;}
原创粉丝点击