leiyahui

纸上得来终觉浅,绝知此事要躬行
线性表的应用举例

Josephu问题

Josephu问题:设标号为1,2,3....n的n个人围坐一圈,约定序号为K的人从1开始计数,数到m的那个人出列,他的下一位又开始计数,数到m的那个人又出列,以此类推,直到所有的人出列为止

算法分析:Josephu问题用一个不带头结点的单向循环链表处理起来会很容易实现

C语言代码实现

#include<stdio.h>
#include<malloc.h>
#include<conio.h>
typedef struct node
{
    int No;
    struct node* next;
}Node,*Link;

Link CreateRoute(int n)
{
    int i;
    Link tail=NULL;
    Link Head=NULL;
    for (i = 1; i <= n; i++)
    {
        if (i == 1)
        {
            Head=tail= (Link)malloc(sizeof(Node));
        }
        else
        {
            tail->next = (Link)malloc(sizeof(Node));
            tail = tail->next;
        }
        tail->No = i;
    }
    tail->next = Head;
    return Head;
}
void PrintLineByOrder(Link L, int n, int k, int m )
{
    int i,j;
    Link p = L;
    Link q=p;
    for (i = 1; i < k; i++)
    {
        p = p->next;
    }
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j < m; j++)
        {
            q = p;
            p = p->next;
        }
        q->next = p->next;
        printf("%d", p->No);
        p = p->next;
    }
}
void main()
{
    int n, m, k;
    Link Head = NULL;
    printf("Please input the Amount of person\n");
    scanf_s("%d", &n);
    printf("Plase input the number of the beginer\n");
    scanf_s("%d", &k);
    printf("Please input the number of where counting to\n");
    scanf_s("%d",&m);
    Head = CreateRoute(n);
    PrintLineByOrder(Head, n, k, m);
}

posted on 2015-11-14 19:57  雷大叔  阅读(1420)  评论(0)    收藏  举报