单链表实现猴子选大王(约瑟夫环问题)

 

1.经典的约瑟夫环问题:

m个猴子围在一起,数到n的退出,最后剩下的一个就是猴子王--猴子选大王

 

#include<stdio.h>

 

#include<malloc.h>

struct Node

{

       int data;

       struct Node *next;

};//建立一个节点结构体

 

int main()

{

       struct Node *head, *s, *q, *t;

       int n, m, count=0, i;

       printf("input the monkey number m:");

       scanf("%d",&m);

       printf(" input the number n:");

       scanf("%d",&n);

 

       for(i=0; i<m; i++)

       {

              s=(struct Node *)malloc(sizeof(struct Node));

              s->data=i+1;

              s->next=NULL;

              if(i==0)

              {

                     head=s;

                     q=head;

              }

              else

              {

                     q->next=s;

                     q=q->next;

              }

       }//建立一个不带头结点的单链表

 

       q->next=head;//这里,将单链表组成环状,形成循环单链表

       printf("before:");

 

       q=head;

       while(q->next!=head)

       {

              printf("%d ",q->data);

              q=q->next;

       }//依次输出节点的值

 

       printf("%d ",q->data);

 

       q=head;

       printf(" ");

 

       do {

              count++;//计数器开始计数

              if(count==n-1)

              {

                     t=q->next;

                     q->next=t->next;//到n前面那个节点stop,然后删除第n个节点

                     count=0;//计数器复位

                     printf("%d ", t->data);//输出被淘汰的猴子的号码

                     free(t);//释放内存,防止内存泄露

              }

              q=q->next;

       }

       while(q->next!=q);//这句是关键,就是循环到只剩下一个节点了,如果说有难度的话应该是理解的难点了

       printf(" the king is: %d ",q->data);//输出king的号码

}

 

代码无错,我是在用fedora10中gcc编译的,VC中未试过。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值