。。。

导航

约瑟夫问题

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode{
    int data;
    struct LNode *next;
}LNode,*LinkList;

LinkList Build(int n)//建立有n个结点的循环单链表 
{
    int i;
    LinkList head;
    head = (LinkList)malloc(sizeof(LNode));
    LinkList s,p = head;
    p->data = 1;
    for(i = 2; i <= n; i ++)
    {
        s = (LinkList)malloc(sizeof(LNode));
        s->data = i;
        p->next = s;
        p = s;
    }
    p->next = head;
    return head;
}
LinkList GetElem(LinkList p,int n)//找到从head开始的第n个结点 
{
    int i;
    LinkList s = p;
    for( i = 1; i < n; i ++)
    {
        s = s->next  ;
    }
    return s;
}
int Delete(LinkList p)//删除p的后继结点 
{
    int num;
    LinkList s;
    s = (LinkList)malloc(sizeof(LNode));
    s = p->next ;
    p->next = s->next ;
    num = s->data ;
    free(s);
    return num;
 } 
void CountOff(int n,int m,int k,LinkList head)//模拟循环报数全过程 
{
    int i,num;
    LinkList p  = head;

    for(i= n; i >= 1; i --)
    {
        p = GetElem(p,m-1);
        num = Delete(p);
        if( i <= k)
            printf("%d ",num);
        p = p->next ; 
    }
}
int main()
{
    int n,m,k;
    LinkList head;
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        head = Build(n);
        CountOff(n,m,k,head);
     } 
    return 0;
 } 

posted on 2017-06-22 07:05  大学僧  阅读(105)  评论(0编辑  收藏  举报