记得大一学数据结构的时候用节点构成了一个循环链做过这个题,前几天偶然想到,为什么不用数组来做呢?


用循环链做的

/*
 **********************************************************
 * 解法
 *
 * 使用一个循环链,其中包含两个元素,一个为指向下一个人的
 * 节点,一个为是否出列的标记
 *
 **********************************************************
 */
#include <stdio.h>
#define M 30	//假设有30个人围成一个圈
#define N 13	//出列13个
#define L 9		//第9个人出列

struct node
	{
		int nextp;	//指向下一个节点
		int in_out;		//是否出列的标志
	} link[M+1];	//M个人的数组,下标0未曾使用

main (void)
{
	int i, j, k;	//作为计数器

	printf ("The circle is: + mean in; - mean out \n");

	for (i = 1; i < M+1; i++)
	{
		link[i].nextp = i + 1;	//指向下一个节点
		link[i].in_out = 1;		//标志为1,表示都尚未出列
	}

	link[30].nextp = 1;		//最后一个指向第一个节点,形成一个循环链

	j = 30;		//从指向第一个节点的位置开始计数

	for (i = 0; i < N; i++)		//i:出列人数的计数器
	{
		for (k = 0; ;)	//k:出列人的计数器
		{
			if (k < L)		
			{
				j = link[j].nextp;		//修改指针,继续计数
				k += link[j].in_out;	//遍历查找出列的人。因为已出列的标记为零,所以可循环查找
			}
			else
				break;
		}

		link[j].in_out = 0;		//将出列的人标记为0
	}

	printf ("The result is:");
	for (i = 0; i < M; i++)	//输出结果
	{
		printf (" %c ", link[i+1].in_out ? '+': '-');
	}	
	printf ("\n");

	return 0;
}


运行之后


wKioL1VAic-TqOf5AAEDBpZ0Osg233.jpg


用数组做的感觉就清晰了很多

#include<stdio.h>

#define M 30	//假设有30个人围成一个圈
#define N 13	//出列13个
#define L 9		//第9个人出列

int main (void)
{
	int i, j, k,num,t;	//作为计数器
	int circus[30];

	printf ("The circle is: + mean in; - mean out \n");

	for (i = 0; i < M; i++)
		circus[i]=1;

	k=-1;
	for (i = 0; i < N; i++)		//i:出列人数的计数器
	{
		num=0;
		while(num<L)
		{
			k++;
			num+=circus[k%M];		
		}
		circus[k%M]=0;
	}

	printf ("The result is:");
	for (i = 0; i < M; i++)	//输出结果
	{
		printf (" %c ", circus[i] ? '+': '-');
	}	
	printf ("\n");

	return 0;
}


运行之后

wKiom1VAiMij11JhAAEDBpZ0Osg078.jpg