问题
六一儿童节到了,学校给桐桐班级(总共30人)分配了15个草莓蛋糕和15个冰激凌。为了公平起见,老师将30位同学围成一个圈,从第一个人开始依次报数,数到9的人出列并给他一个冰激凌;他的下一个人再从1开始报数,同样数到9的人出列并给他一个冰激凌;依此规律重复下去,直到还剩15个人为止。剩下的15个人每人给一个草莓蛋糕。
问题分析
该问题中说“将30位同学围成一个圈”,因而可以构造一个单链环来表示。
30位同学分别用编号1~30表示。声明一个结构体类型来构造单链环,链表中的每个结点都有两个成员,其中数值域存放同学的编号,指针域则指向其下一位同学。数值域存放30的结点的指针域指向头指针(即数值域存放1的结点),这样就构成了一个完整的单链环。
设置两个计数器i和left,left表示链表中的结点数。从head结点开始遍历链表,每遍历一个结点i的值增加1,到第9个结点时输出该结点数值域中的编号,并将其从链表中删除,left减小1;之后,计数器i归0,继续从下一个结点开始遍历链表……直到left的值为15(即还剩余15个结点)为止。已经输出的15个编号的同学就是得到冰激凌的同学。最后再输出剩余链表中的15个编号,这15个编号的同学就是得到草莓蛋糕的同学。
代码清单10.10 约瑟夫问题