顺序淘汰问题

问题:

1
2
3
4
5
6
7
8
13个人围成一圈,从第1个人开始顺序报号1、2、3,凡报到3的人退出圈子。找出最后留在圈子里的人原来的序号。要求用结构体编程实现。



***输出提示:"\n出圈成员及顺序:"
***输出格式:"%3d"
***输出提示:"\n最后的成员是:"
***输出格式:"%3d"

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
int num;
struct node *next;

}Node;

int main()
{
Node *head,*p,*q;//设置指针,用来索引链表
int i,j;
head=malloc(sizeof(Node));
head->num=1;
p=head;
//初始化链表
for(i=2;i<=13;i++)
{
q=malloc(sizeof(Node));
p->next=q;
p=p->next;
p->num=i;
}
p->next=head;//将链表连成环
p=head;//将索引指针指向链表头
printf("\n出圈成员及顺序:");
for(i=1;i<=12;i++)//进行12次循环,淘汰12名选手
{
for(j=1;j<3;j++)//从第一个开始,连续跳两次相当于就数到了三
{
q=p;
p=p->next;
}
printf("%3d",p->num);
q->next=p->next;//将报三的数前后连接,使链表跳过三
free(p);//将数到三的成员free掉
p=q->next;//重新指向下一位
}
printf("\n最后的成员是:");
printf("%3d",p->num);
return 0;
}

链表的基本运用。