围一圈报数...

本文介绍了一个简单的环形链表实现,并通过约瑟夫问题来演示其使用方法。代码中创建了一个环形链表并实现了淘汰机制,最终找到链表中的幸存者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随便写了个. 但求容易阅读...

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

  3. struct LoopLink
  4. {
  5.     int id;
  6.     struct LoopLink *next;
  7. };
  8. int loopNum = 0;

  9. struct LoopLink *Create( int num )
  10. {
  11.     struct LoopLink *ret = NULL; //这里ret其实就是将要返回的"头"节点, 但环形的东西叫"头"总是很别扭的.
  12.     if ( num > 0 )
  13.     {
  14.         int i;
  15.         
  16.         ret = ( struct LoopLink * ) malloc( sizeofstruct LoopLink ) );
  17.         ret->id = 1;
  18.         ret->next = NULL;

  19.         struct LoopLink *p = ret;
  20.         for ( i = 1;i < num;i++ )
  21.         {
  22.             p->next = ( struct LoopLink * ) malloc( sizeofstruct LoopLink ) );
  23.             p->next->id = i + 1;
  24.             p->next->next = NULL;

  25.             p = p->next;
  26.         }
  27.         p->next = ret; //串起来, 最后一个节点指向"头"节点.
  28.     }
  29.     loopNum = num;
  30.     return ret;
  31. }

  32. void PrintLoop( struct LoopLink *p )
  33. {
  34.     int i;
  35.     for ( i = 0;i < loopNum;i++ )
  36.     {
  37.         printf( "%4d", p->id );
  38.         p = p->next;
  39.     }
  40.     printf( "/n" );
  41. }

  42. void KickOutTheOneAfter( struct LoopLink *p )
  43. {
  44.     struct LoopLink *thePoorOne = p->next;
  45.     p->next = thePoorOne->next;
  46.     free( thePoorOne );
  47.     loopNum--;
  48. }

  49. struct LoopLink *StartGame( struct LoopLink *p, int interval )
  50. {
  51.     while ( loopNum > 1 )
  52.     {
  53.         int i;
  54.         //bug when interval == 1
  55.         for ( i = 1;i < interval - 1 ;i++ )
  56.         {
  57.             p = p->next;
  58.         }
  59.         KickOutTheOneAfter( p );

  60.         p = p->next;
  61.         PrintLoop( p );
  62.     }
  63.     return p;
  64.     //returning the last one.
  65. }

  66. int main( void )
  67. {
  68.     struct LoopLink *myLoop = Create( 13 );
  69.     PrintLoop( myLoop );

  70.     struct LoopLink *theLastOne;
  71.     theLastOne = StartGame( myLoop, 3 );

  72.     free(theLastOne);

  73.     return 0;
  74. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值