使用链表实现Josephus环问题

分析:先创建一个有total个结点的链表,然后头尾相连,构成一个环形链表。从第一个结点开始数到第m个结点,从链表中删除对应结点,表示小孩出圈。然后再从被删除结点的下一个结点重新开始计数,直到链表中剩下最后一个结点。

#include  < stdlib.h >
#include 
< stdio.h >
#define  LEN sizeof(struct child)
struct  child 
{
    
int  num;
    
struct  child  * next;
};

void  main()
{
    
struct  child  * create( int  num);
    
int  count( struct  child  * head, int  total, int  m);
    
struct  child  * head;
    
int  total,m,n;
    printf(
" please input total and start: " );
    
do  
    {
        scanf(
" %d%d " , & total, & m);
    } 
while (total < 2 || m < 2 || m > total);
    head
= create(total);
    n
= count(head,total,m);
    printf(
" \nThe left child is %d\n " ,n);
}

struct  child  * create( int  num)
{
    
struct  child  * p1, * p2, * head;
    
int  i;
    p1
= ( struct  child  * )malloc(LEN);
    p1
-> num = 1 ;
    head
= p1;
    
for  (i = 2 ;i <= num;i ++ )
    {
        p2
= ( struct  child  * )malloc(LEN);
        p2
-> num = i;
        p1
-> next = p2;
        p1
= p2;
    }
    p1
-> next = head;                     // 头尾相连
     return  head;
}

int  count( struct  child  * head, int  total, int  m)
{
    
struct  child  * p = head, * old;
    
int  i,j;
    
for  (i = 1 ;i < total;i ++ )             // 循环次数
    {
        
for  (j = 1 ;j < m;j ++ )             // 循环个数
        {
            old
= p;
            p
= p -> next;
        }
        printf(
" %3d " ,p -> num);
        old
-> next = p -> next;
        free(p);
        p
= old -> next;
    }
    
return  p -> num;
}

转载于:https://www.cnblogs.com/qixin622/archive/2008/07/08/1238204.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值