/*有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子
问最后剩下的是原来第几号的那位*/
#include <stdio.h>
#include <stdlib.h>
#define N 10
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
int main()
{
int j;
LinkList L,q,k;
L = (LinkList)malloc(sizeof(LNode));
L->data = 1;
L->next = L;
q = L;
//往循环链表里赋值,并没有写成一个函数
for(j = N;j > 1;j--)
{
LinkList p;
p = (LinkList)malloc(sizeof(LNode));
p->data = j;
p->next = q->next;
q->next = p;
}
while(1)
{
j = 1;
k = q;
while(k->next->next != k && j < 3)
{
k = k->next;
j++;
}
if(j != 3)
{
break;
}
while(q->next != k)
{
q = q->next;
}
q->next = k->next;
q = q->next;
}
printf("输出结果:");
for(j = 0;j < 2;j++)
{
printf("%d ",q->data);
q = q->next;
}
}
谭浩强C程序设计(第四版)p291第5题
我第一个想到的办法是用循环链表,如果用数组,数组元素移动起来会有点麻烦,用循环链表直接改变next的指向就可。