#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" );
}
代码还需继续改正!

评论