一、实验目的
使用队列数据结构,模拟Josephus排队问题,根据输入的总人数和间隔数,求出最后一位幸存者,并在屏幕上可视化输出出来。
二、实验思路
采用链队列模拟排队,根据总人数初始化并创建链队。当在队里的总人数大于1个人时,遍历链队里所有节点。每访问一个就让它出队,如果它满足继续排队的条件,再让它进队插在队尾(即这个节点的序号不是循环间隔的倍数),反映到实际问题上就是这个人还可以存活。如此反复进行下去,直到链队里还剩下最后一个节点。
频繁的出队和入队是这种算法的缺点,但是由于队列“先进先出”的性质,无法在队列里查找待出队的元素,然后使其前驱指针指向其后继。所以如果这个实验不用队列,而用其他数据结构,比如操作不受限的链表,可能效率会更高。
因为频繁地出队和入队,所以不适合用顺序结构实现此实验。
三、链队定义
根据业务要求,链队中每个节点需要包括的成员为:int num,double x,double y,void *object,QNode *next. 其中,num是每个节点的序号,x,y是每个节点在屏幕上的位置,object是下文为实现动态绘制与消除所定义的一个void型指针变量,next是指向下一个节点的QNode型指针变量。