保研练习题(2)

N 个人围成一圈顺序编号,从 1 号开始按 1、2、3 顺序报数,报 3 者退出圈外,其余的人再从 1、2、3 开始报数,报 3 的人再退出圈外,依次类推。

请按退出顺序输出每个退出人的原序号。要求使用环行链表编程。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 //    链表节点
 5 typedef struct node
 6 {
 7     int num;
 8     struct node *next;
 9 }LNode;
10 
11 int main()
12 {
13     int n,i;
14     printf("Please input number of people.\n");
15     scanf("%d",&n);
16     LNode *head,*p,*q;
17     p = (LNode *)malloc(sizeof(LNode));
18     p->num = 1;
19     head = p;
20     for (i=2; i<=n; i++){
21         p->next = (LNode *)malloc(sizeof(LNode));
22         p = p->next;
23         p->num = i;
24     }
25     // 链表尾指回头指针 形成循环链表
26     p->next = head;
27     p = head;
28 
29     printf("Sequence: ");
30     while (p->next != p){    // 链表中不是只剩下一个节点
31         q = p->next;
32         p = q->next;
33         printf("%d ",p->num);
34         q->next = p->next;
35         delete(p);
36         p = q->next;
37     }
38     printf("%d\n",p->num);
39     return 0;
40 }

posted on 2013-09-14 23:52  RAUL_AC  阅读(233)  评论(0编辑  收藏  举报

导航