1. 程式人生 > >約瑟夫環迴圈連結串列實現

約瑟夫環迴圈連結串列實現

 1 #include <stdio.h>
  2 #include <stdlib.h>
  3 //約瑟夫環的實現:一群人圍成一圈,這群人共有 n個人,每個人身上都一個key,依次給這圈人編號:
  4 //1,2,n 一開始報數的上限值為m從第一個人(編號:1)自一開始報數報到m時停止報數,報到m的人出列,
  5 //將他的密碼做為新的m值,從他的順時針方向開始的下個人開始從新從一報數,如此下去,直至所有的人出列為止 
  6 typedef struct Node
  7 {
  8         int key;//每個人身上帶的key 
  9         int NUM;//每個人的編號 
 10
         struct Node *next;
 11 }Node;
 12 //=========================
 13 int n;//總共的人數 
 14 Node *L=NULL;//迴圈連結串列指標 
 15 //=========================
 16 void InitList(int x)//初始化第一個節點,這個節點有實際的意義 
 17 {
 18      
 19      L = (Node*)malloc(sizeof(Node));
 20      if(!L)
 21        { 
 22            printf("malloc fail\n");
 23
            system("PAUSE");    
 24            exit(1);   
 25        }
 26      L->NUM=1;
 27      L->key=x;
 28      L->next=L;
 29 }       
 30 //===========================================
 31 void DelNode(Node *p_front)//p_front指向的是p的前一個節點,刪除的卻是p 
 32 
 33 {
 34      Node  *tmp=p_front->next;
 35      p_front->next
 = tmp->next;
 36      free(tmp);
 37  } 
 38  //============================================
 39 void CreateList(void)//建立迴圈連結串列 
 40 { 
 41      printf("Players n=");
 42      scanf("%d",&n);
 43      while(n<1||n>30)
 44      {  
 45                   printf("n must >=1 && <=30\n");
 46                   printf("Players n=");
 47                   scanf("%d",&n);
 48      }
 49      int key_tmp;
 50      printf("NUM=1  key=");
 51      scanf("%d",&key_tmp);
 52      while(key_tmp<1||key_tmp>300)
 53      {
 54               printf("key must >0&&<=300\n");
 55               printf("NUM=1  key=");
 56               scanf("%d",&key_tmp);
 57      }
 58      InitList(key_tmp);
 59      int i;
 60      Node *s,*p=L;
 61      for( i=2;i<=n;i++)
 62      {
 63           s=(Node*)malloc(sizeof(Node));
 64           if(!s)
 65           {
 66                 printf("malloc error\n");
 67                 system("PAUSE");    
 68                 exit(1);
 69           }
 70           printf("NUM=%d  key=",i); 
 71           scanf("%d",&key_tmp);
 72           while(key_tmp<1||key_tmp>300)
 73      {
 74               printf("key must >0 && <=300");
 75               printf("\nNUM=%d  key=",i);
 76               scanf("%d",&key_tmp);
 77      }
 78           s->key=key_tmp;
 79           s->next=L;//構成迴圈連結串列的next指標賦值 
 80           p->next=s;
 81           s->NUM=i;
 82           p=s;//指標p往前移動 
 83      }
 84 }
 85 //=============================================
 86 void PlayGame(void)//開始遊戲!報數 
 87 {
 88      Node  *p=L;
 89      Node  *p_front=L;
 90      int m;
 91      printf("start  game !\n");
 92      printf("m=");
 93      scanf("%d",&m);
 94      while(m<1||m>300)
 95        {
 96                    printf("m must >0 && <=300\n m=");
 97                     scanf("%d",&m);
 98        }
 99      int i;
100      int count = n;
101      for(i=1;i<=m;i++)
102      {   
103         // printf("num =%d  key=%d\n",p->NUM,p->key);
104          
105          if(m==i)
106          {
107                 
108                  m=p->key;
109                  i=0;
110                  printf(" %d",p->NUM);
111                  DelNode(p_front);  
112                  p=p_front;
113                  count--;
114                  if(count==1)
115                      {       
116                              printf(" %d",p->NUM);
117                              //printf("num =%d  key=%d\n",p->NUM,p->key);
118                              printf(" all out !\n");
119                              system("PAUSE");    
120                              exit(0);
121                      }
122              
123          }
124          p_front=p;
125          p=p->next;
126          
127      }
128  }
129  //==================================================
130 int main(int argc, char *argv[])//運行遊戲! 
131 {
132   CreateList();
133   PlayGame();
134   system("PAUSE");    
135   return 0;
136 }
137