约瑟夫环问题

约瑟夫问题如下:已知n个人(n>=1)围坐一圆桌周围,从1开始顺序编号。从序号为1的人开始报数,顺时针数到m的那个人出列。他的下一个人又从1开始报数,数到m的那个人又出列。依此规则重复下去,直到所有人全部出列。请问最后一个出列的人的编号。


//C Version  One-way circular linked list(单向循环链表)

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

typedef struct Circular_List
{
        int data;
        struct Cirular_List *next;
}CList;

CList* init_CList(int *num)
{
              int i;
              printf("Please input the number of nodes:");
              scanf("%d",num);
              //Circle_Queue *q=(Circle_Queue*)malloc(num*sizeof(Circle_Queue));
              CList *p=(CList*)malloc(sizeof(CList));
              CList *head=p;
              for(i=1;i<*num;++i)
              {
                                //q->data=(i+1);
                                p->data=i;
                                p->next=(CList*)malloc(sizeof(CList));
                                p=p->next;
              }
              p->data=*num;
              p->next=head;
              
              return head;
}

int del_CList(CList *p, int N)
{
     int m;
     int i,j;
     printf("Please input the m you want to delete:");
     scanf("%d",&m);
     //while(p!=null)
     for(i=1;i<N;++i)
     {
                   for(j=1;j<(m-1);++j)
                       p=p->next;
                   CList *q=p->next;
                   p->next=q->next;
                   printf("The dequeued one is number %d\n",q->data);
                   free(q);    
                   //q->next=NULL;
                   //p->next=p->next->next;
                   //free(p->next);
                   p=p->next; 
     }
     return p->data;
}
     
int main()
{
    int total, last;
    CList *list;
    list=init_CList(&total);
    last=del_CList(list,total);
    printf("The last one dequeued is %d",last);
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值