约瑟夫环:将编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个开始按顺时针方向自1开始报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。设m的初值为20,密码为:3,1,7,2,4,8,4。
得用c++类编写
谢谢!
template <class
T>
struct Node
{
T data;
Node<T> *next;
};
① 循环链表的基本操作:
LinkList(T a[], int
n)
{
1、生成头节点
2、尾指针初始化
3、根据传入元素个数建立循环
3.1、为每个数组元素建立一个节点
3.2、插入到终端节点后
4、循环链表建立完毕,将终端指针指向头节点
5、将起点指针指向头节点
}
LinkList()
{
1、初始化p
2、循环链表循环一圈
2.1、暂存被释放节点
2.2、p指向被释放节点的后继节点
2.3、释放节点
}
T Delete(int i)
{
1、计数器j设为1 //因为要指向要删除节点的前一个节点
2、建立指针p、q,p指向起点指针Temp
3、建立暂存被删除数据的元素temp
4、查找被删除节点的前一个节点
4.1、若p指向不是倒数第二个节点即p的下下个节点不是头节点,p指向p的下 一个节点
否则p指向头节点
4.2、计数器j自增
5、若p指向的不是头节点
5.1、暂存被删节点和被删元素值
5.2、将p的后继节点指向被删节点的后继节点
否则
5.1、暂存被删节点和被删元素值
5.2、将头节点的后继节点指向被删节点的后继节点
6、释放被删节点
7、若p的后继节点不是头节点,起点指针指向p节点
否则起点节点指向头节点
8、返回被删元素值
}
void PrintList()
{
1、 初始化p
2、 循环链表循环一圈
2.1、输出节点数据
2.2、p指向p的后继
}
② 主程序:
void main()
{
1、 建立顺序数组iOrder[100]和密码数组iPsw[100]
2、 提示用户输入初始密码上限
3、 建立密码上限iMax、密码iWord以及计数器j,初始化j=0
4、 输入iMax
5、 若iMax不大于30,iMax值不变,否则iMax为30
6、 提示用户输入依次密码
7、 输入iWord
8、 若iWord不满足结束条件或计数器j小于100,循环
8.1、给密码数组iPsw[j]赋值
8.2、给顺序数组iOrder[j]赋值
8.3、计数器j自增
8.4、输入iWord
9、建立暂存密码的psw和暂存返回值的x
10、建立循环列表对象a并用顺序数组iOrder初始化
11、输出循环链表初始顺序
12、建立计数器i为0并以i<j循环
12.1、调用循环链表的删除元素函数Delete(int i)并将返回值赋给x
12.2、输出x为出列顺序
12.3、设置新密码
}