约瑟夫环

来源:互联网 发布:怎么看自己的mac 编辑:程序博客网 时间:2024/04/24 12:57
数据结构上机作业,约瑟夫环问题
     编号为1,2,3.......n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值 ,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止.试设计一个程序,求出列顺序.
     利用单向循环链表作为存储结构模拟此过程,按照出列顺序打印出各人的编号.
     例如m的初值为20;n=7,7个人的密码依次是3,1,7,2,4,8,4,出列顺序为6,1,4,7,2,3,5.
    
     我的C程序如下:
#include<stdio.h>
typedef struct node
{
 
    int data;
    int number;
    struct node *next;
 }Node,*LinkList;
 
 
   LinkList CreateJoseph(int n)
 {
    int i=1;
    Node *p,*r;
    LinkList L=NULL;
    L->next=NULL;
    if(n<1) exit(0);
    for(i=1;i<=n;i++)
     {
        r=(Node*)malloc(sizeof(Node));
        printf("/n please input %d'password:",i);
        scanf("%d",&r->data);
        r->number=i;
        if(i==1)
          {
            L=r;
            p=r;
          }
        else
           {
            p->next=r;
            p=r;
           }
      }
 
      p->next=L;
      return L;
 }
 
 void DestoryJoseph(LinkList L,int m)
   {
 
      Node *p,*q;
      int j=1;
      printf("/n Sequence:");
      p=L;
      while(p->next!=p)
      {
 
          while(j!=m-1)
          {
            p=p->next;
            j++;
          }
          q=p->next;
          p->next=p->next->next;
          printf("%d",q->number);
          m=q->data;
          free(q);
          j=0;
      }
      printf("%d",p->number);
      free(p);
      getch();
   }
 
 
   int main()
   {
     int n,m;
     LinkList L;
     printf("total number of the Joseph ring :");
     scanf("%d",&n);
     L=CreateJoseph(n);
     printf("/n initial the up-limit m:/n");
     scanf("%d",&m);
     DestoryJoseph(L,m);
   }
 



没有用头结点,反而更方便些.
原创粉丝点击