实验二 循环链表的应用:约瑟夫环问题
1.实验目的
熟悉单链表的定义,单链表的建立方法及相关基本操作,理解单链表的基本思想,能够根据实际情况选择合适的存储结构。
2.实验内容
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到只剩下一个人为止。
输入:n,m (m < n)
输出:剩下最后一个人的编号
3.正文部分
①什么是循环链表
在单链表的基础上,尾结点的指针指向链表的头结点。
在初始化一个普通单链表时,将其头指针指向表头,而不是指向NULL,这样就会成为一个闭环。
②创建循环链表
与创建单链表类似,只不过最后一个结点的next指向头结点。
void createlink()
{
Node* head = NULL, * p = NULL, * r = NULL;//初始化
head = (Node*)malloc(sizeof(Node));//申请空间给头结点
if (head == NULL)//若head为空,申请失败
{
printf("申请失败。");
return;
}
}
③如何指定从k开始报数而不是从1?
在这我设定了一个参数flag,初始化flag的值为1,设定当flag的值为1的时候执行程序,在程序的最后将flag的值设为0,这样就不会再执行这一段了。
while (flag == 1)//flag值为1时执行
{
for (int i = 0; i < k; i++)
{
r = p;
p = p->next;
}
flag = 0;//结束前赋值为0
}
上面这一段代码的意义是,在报数之前将指针指向指定位置,循环次数为k。
④完整源码
完整源码下载:数据结构——循环链表的应用:约瑟夫环问题