约瑟夫环问题

来源:互联网 发布:淘宝上好看的手机壳店 编辑:程序博客网 时间:2024/05/16 04:50

约瑟夫问题如下:已知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;}


原创粉丝点击