约瑟夫问题

来源:互联网 发布:sql 镜像服务器 编辑:程序博客网 时间:2024/06/06 21:39
#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; } 
原创粉丝点击