c语言编程题:m个人围成一圈,每数n个人就踢出一个直到剩下一个人,n个人围成一圈,从第s个人开始数,顺时针数m个人,让其出列,从下一个开始依旧是第m个人出列,直到n个人全部出列,把它们最开始的顺序按出...

#include

#include

#include

#define LEN sizeof( struct LNode )

typedef struct LNode

{

int num; //位置

struct LNode *next;

}*LinkList;

//定义全局变量

int n;     //表示总的人数

//建立链表

void Creat_list( LinkList &L )

{

LinkList p, r;

int i = 1;

printf("输入人的总数:");

scanf("%d", &n);

p = (LinkList) malloc (LEN);

if( !p )

{

printf("没有空间可分配!\n");

return ;

}

p->num = 1;

p->next = NULL;

r = L = p;

for( i = 2; i<=n; i++ )

{

p = (LinkList) malloc (LEN);

p->num = i;

p->next = NULL;

r->next = p;

r = p;

}

r->next = L;

}

//输出链表

void Output_list( LinkList &L )

{

LinkList p = L;

int i=0;

for( ; i

{

printf("%d ", p->num);

p = p->next;

}

printf("\n");

}

//进行查找 输出 数组结果

void Search_list( LinkList &L )

{

int s, m;

LinkList p = L;

int *d , i, j;

d = (int *) malloc (n*sizeof(int));

lop:printf("输入从第几个人开始数:");

scanf("%d", &s );

if( s>n )

{

printf("s 输入有误!\n");

goto lop;

}

printf("输入数几个人后出列一个人:");

scanf("%d", &m );

while( (p->num) != s )

p = p->next;

for( i = 1; i<=n-2; i++ )

{

for( j=1; j

p = p->next;

*(d++) = p->next->num;

p->next = p->next->next;

p = p->next->next;

}

if( m%2 == 1 )

{

*(d++) = p->next->num;

*(d++) = p->num;

}

else

{

*(d++) = p->num;

*(d++) = p->next->num;

}

d = d-n;

for( i=0; i

printf("%d ", *(d++) );

printf("\n");

}

void main()

{

LinkList L;

Creat_list( L );

Output_list( L );

Search_list( L );

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值