约瑟夫问题(用尾插法建立循环链表)

 代码如下

#include<stdio.h>  
#include<stdlib.h>  
typedef struct node  
{  
    int num;  
    struct node *next;  
}circle;  
circle  *Create(circle *head,int n)  
{  
  
    int i;  
    head=(circle*)malloc(sizeof(circle));  
head->num =1;  
    head->next=head;  
    circle *tail,*p;  
    tail=head;  
    for(i=2;i<=n;i++)  
    {  
        p=(circle*)malloc(sizeof(circle));  
        p->num =i;  
        p->next =tail->next ;  
        tail->next =p;  
        tail=p;  
          
    }  
    p->next =head;  
    return head;//必须要return head  
      
}  
  
  
  
int main()  
{  
    int n,k,m,data,i;  
    int sum;  
    sum=0;  
    circle *head,*p,*q,*temp;  
    scanf("%d,%d,%d",&n,&k,&m);  
    data=n;  
    if(k>n)  
    printf("k should not bigger than n.\n");  
    else if(n<1||k<1||m<1)  
    {  
        printf("n,m,k must bigger than 0.\n");  
    }  
    else   
    {  
        head=Create(head,n);  
        p=head;  
        for(i=2;i<=k;i++)  
        {  
            p=p->next ;  
        }  
        q=p;//q表示要出列的人  
        while(data>=1)  
        {  
        //当链表里的元素大于等于1  
            for(i=2;i<m;i++)  
            {  
                q=q->next ;  
                  
            }  
            temp=q->next ;  
            q->next =temp->next ;  
            if(data>1)  
            {  
                
               //判断一下一行有没有十个  
                if(sum==9)  
               {  
                   printf("%d\n",temp->num);  
                   sum=0;  
               }  
               else if(sum<9)  
                {  
                     printf("%d ",temp->num );sum++;  
                }  
                
            }  
          
            else if(data==1)  
            printf("%d\n",temp->num );  
            free(temp);  
            q=q->next ;  
            data--;  
          
          
        }     
              
      
    }  
      
      
}  

AC 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值