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. "); 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 ",p->num); 39 return 0; 40 }