用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出

用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出


// 用户输入M,N值,从1至N开始顺序
// 循环数数,每数到M输出该数值,
// 直至全部输出
#include  <stdio.h >

// 节点
typedef  struct node
{
     int data ;
    node * next ;
}node ;

// 创建循环链表
void createList (node *& head , node *& tail ,  int n )
{
     if (n < 1)
     {
        head  =  NULL ;
         return  ;
     }
    head  =  new node ();
    head ->data  =  1;
    head ->next  =  NULL ;
    
    node * p  = head ;
     for ( int i = 2; i <n + 1; i ++)
     {
        p ->next  =  new node ();
        p  = p ->next ;
        p ->data  = i ;
        p ->next  =  NULL ;
     }
    
    tail  = p ;
    p ->next  = head ;
}

// 打印循环链表
void Print (node *& head )
{
    node * p  = head ;
    
     while (&& p ->next !=head )
     {
        printf ( "%d " , p ->data );
        p =p ->next ;
     }
     if (p )
     {
        printf ( "%d/n" , p ->data );
     }
}

// 用户输入M,N值,从1至N开始顺序
// 循环数数,每数到M输出该数值,
// 直至全部输出
void CountPrint (node *& head , node *& tail ,  int m )
{
    node * cur  = head ;
    node * pre  = tail ;
    
     int cnt  = m - 1;
     while (cur  && cur !=cur ->next )
     {
         if (cnt )
         {
            cnt --;
            pre  = cur ;
            cur  = cur ->next ;
         }
         else
         {
            pre ->next  = cur ->next ;
            printf ( "%d " , cur ->data );
             delete cur ;
            cur  = pre ->next ;
            cnt  = m - 1;
         }    
     }
    
     if (cur )
     {
        printf ( "%d " , cur ->data );
         delete cur ;
        head  = tail  =  NULL ;
     }
    printf ( "/n" );
}

int main ()
{
    node * head ;
    node * tail ;
     int m ;
     int n ;
    scanf ( "%d" ,  &n );
    scanf ( "%d" ,  &m );
    createList (head , tail , n );
    Print (head );
    CountPrint (head , tail , m );
     return  0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值