圆圈中最后剩下的数字--约瑟夫环问题

用环形链表实现约瑟夫环问题

 1 typedef struct node
 2 {
 3     int data;
 4     struct node * next;
 5 }Node, *Link;
 6 
 7 Link create(int n) //生成环形链表
 8 {
 9     Link head, rear ;
10     Link p = new Node; //第n个节点
11     p->data = n;
12     head = rear = p;
13     for( int i=n-1; i>0; i-- ) //从前面插入n-1个节点,注意,单项链表是便于逆向顺序构成的。 
14     {
15         p = new Node;
16         p->data = i;
17         p->next = head;
18         head = p; //每插入一个节点,头指针前移一个
19     }
20     rear->next = head ; //n节点指向头节点,构成环形链表
21     return h;
22 }
23 
24 int joseph( int m, Link h ) //找出最后一个
25 {
26     Link p = h;
27     int i=0;
28     while( p->next != p ) //只有一个节点时结束循环
29     {
30         i++;
31         if( i == m-1) //数了m-1个节点
32         {
33             Link q = p->next ; //删除下一个,即第m个
34             p->next = q->next ;
35             delete q;  //因为结点都是new出来的内存堆区域里的空间,所以必须delete才能收回
36             i = 0;  //删除一个节点,计数器置为0
37         }
38         p =p->next ;
39     }
40     int last= p->data ;
41     delete p;   //删除最后一个节点,避免内存泄露
42     return last;
43 }

posted on 2012-04-07 09:20  NLP新手  阅读(618)  评论(0编辑  收藏  举报

导航