正文

循环链表(用来实现报数)2007-02-03 22:03:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/flyprogram/23092.html

分享到:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define TYPE struct stu

/* 有n给人站成一圈,分辨编号1``n,以k报数, 每报到k的人退出队列,然后继续从下一人开始报数,依次循环*/
/*  知道剩下的人等于k-1,求最后剩下的人的原来编号  */

struct stu
{
      
       int flag;
       struct stu *next;

};

/* f函数功能:建立循环链表! */
TYPE *f ( int k, int *n )  
{
   
    TYPE *p1,*p2,*head;     //定义头指针及结点指针
   
    int i;                //控制数
   
    head = NULL;           //表头置空
   
    for( i = 1 ; i <= k ; i++ )   //循环创建
    {
     
        p2 = ( TYPE * ) malloc ( sizeof(TYPE) );  //分配空间
       
        p2 -> flag = i;           
       
        if( head == NULL )     //连接表头
        
           head = p2;
       
        else                  //连接结点元素
       
           p1 -> next = p2;
       
        p1 = p2;          
       
        *n = *n + 1;          //统计结点数
           
    }
   
    p1 -> next = head;          //表尾指针域存放表头指针
   
    return head;
    
}

/* 读表 */
void print ( TYPE *head , int *n )
{

     int i;
    
     TYPE *p;   
    
     p = head;
    
     for( i = 1 ; i <= *n ; i++ )
     {
    
          printf( "%4d " , p -> flag );
         
          p = p -> next;       //结点后移
    
     }    
         
}

/* 循环删除链表结点元素:可视为报数 */
void fun ( TYPE *head , int k , int *n )
{

     TYPE *p1,*p2;
    
     int count;
   
     p1 = head;
   
     while( *n >= k )           //循环,当结点元素少于报数数k时结束循环
     {
    
         for( count = 1 ; count < k ; count++ )  //报数
         {
        
              p2 = p1;
             
              p1 = p1 -> next;              //报数移动
        
         }
        
         p2 -> next = p1 -> next;          //实现排除
        
         free( p1 );                   //释放结点空间
      
         p1 = p2 -> next;                 //后移
        
         *n = *n - 1;                  //结点减员
    
     }

}

int main()
{
   
    TYPE *head ;                      
  
    int i , j , n = 0 ;
   
    printf( "input the numbers:\n" );
   
    A:
   
    scanf( "%d" , &i );
   
    if( i > 0 )
   
       head = f( i, &n );
   
    else
    {
   
       printf("plz input ture numbers:\n");
      
       goto A;
   
    }    
   
    printf( "input:\n" );
   
    B:
    scanf( "%d" , &j );
   
    if( j <= 1 )
    {
      
       printf("the number is empty or input error:\n");
   
       goto B;
      
    }
   
    else if( j > 1 )
    {
   
       fun( head, j, &n );
   
       print( head, &n );
   
    }
   
    printf("\n");
   
    system( "pause" );

}

代码还需继续改正!

阅读(2787) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册