还有一个或许好一点的方法:使用环形链表
成员:
int id变量,标记第id个人(你也可以使用char *来显示人名)id的初始化的值可以是0到14(char* 的人名各不相同即可)
结构体类型* next指针,指向下一个结构体,初始化方法是:第id项的指针指向第(id+1)%15项,如果使用char*类型,就自己安排顺序,是环形链表即可
算法:
使用初始化为NULL的结构体指针*scan,*save和*drop,当前总剩余项目数survivor;
scan的初始化值为第0项,save和drop初始化为null,survivor=15
扫描时scan和counter依次前进:scan前进的方式时scan=scan->next,counter=counter+1;
当counter为2时,save=scan
当counter为3时,drop=scan;save.next=drop.next;然后释放掉drop指向的空间,并把drop设为null;leave=leave-1,这段代码的目的是锁定干掉的项,先把它前一项的next指针与干掉项的后一项挂钩,然后干掉它,幸存者数目减1
当leave=1时循环结束,最后留下的这一项就是要输出的,输出它的标记的id的值
写得不是很仔细,欢迎指正 |