循环链表的应用: 约瑟夫环问题
一、实验目的:
熟悉循环链表的定义,建立方法及相关基本操作,理解循环链表的基本思想。
二、实验要求:
算法完善,考虑时间复杂度。
三、实验内容:
已知n个人(以编号1, 2, 3...n 分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到只剩下一个人为止。
输入:n,m(m<n)
输出:剩下最后一个人的编号
#include <iostream>
using namespace std;
//循环链表的定义
typedef struct LNode {
int data;//结点的数据域
LNode* next;//结点的指针域
}LNode, *LinkList;//LinkList为指向结构体LNode的指针类型
//创建循环链表
void Create_LinkList(LinkList& L) {
int n;
cout << "请输入循环链表结点数:" << endl;
cin >> n;//所要创建表的结点数
LNode* r = L;
for (int i = 1; i <= n; i++) {
LNode* p = new LNode;
cout<<"所要输入第"<<i<<"个数据:";
cin>>p->data;
p->next = NULL;
r->next = p;
r = p;//r指向新的尾结点*p
}
r->next = L->next;
LNode *p=L->next;
for(int c=1;c<=n;c++){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//循环链表的输出
void LinkList_output(LinkList L){
LNode *p=L->next;
while(p){
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void LinkList_operate(LinkList& L) {
int m;
cout << "请输入出列的数‘m’:" << endl;
cin >> m;
int i = 1;
LNode* p = L->next;
while (p != p->next) {
if (i == m-1) {
LNode* s = p->next;
p->next = s->next;
cout<<"依次出列的人为:"<<endl;
cout<<s->data<<endl;
delete s;
i = 0;
}
i++;
p = p->next;
}
cout<<"最后留下的人是:"<<p->data;
}
int main()
{
LNode* L=new LNode;
L->next = NULL;
Create_LinkList(L);
LinkList_operate(L);
return 0;
}
运行结果
以上结果均可以。