#include <iostream>
using namespace std;
struct Node //循环节点的定义
{
int data; //编号
Node *next;
};
int main()
{
int m,n,i;
Node *p,*q,*first,*tail;//first,tail为单循环链表的头尾指针,p,q工作指针
cout << "请输入报数人数 n: ";
cin >> n ;
while (n < 1)//异常处理
{
cout << "输入有误,请输入正整数:";
cin >> n ;
}
cout << "请输入所报密码 m: ";
cin >> m ;
while (m < 1)//异常处理
{
cout << "输入有误,请输入正整数:";
cin >> m ;
}
first = new Node;//动态分配一个开始节点firs
first -> data = 1;//赋值为1
first -> next = NULL;//指向空
tail = first;//尾指针始终指向尾
for (i = 2;i <= n; ++i)//创建一个单链表
{
p = new Node;//工作指针
p -> data = i;//赋值
p -> next = NULL;//指向空
tail -> next = p;//在单链表中添加新节点
tail = p;//尾指针始终指向尾
}
tail -> next = first;//尾指针指向头指针,形成单循环链表
q = tail;//工作指针,指向尾指针
cout <<endl<< "出列顺序:" <<endl<<endl;
for (i = 1;i < n; ++i)//输出 n-1个节点的值
{
int j = 1;
while (j < m)//q指向第 m个节点的前驱
{
q = q -> next;
++j;
}
//输出 q的后继元素的值
cout << " 号数:" << q -> next -> data << " " << endl;
p = q -> next;
q -> next = p -> next;//从链表中删除 p节点
delete p;//释放 p节点的内存
}
cout << " 号数:" << q->data <<endl<<endl;//输出 最后一个节点的值
delete q;//释放 q节点的内存
system("pause");
return 0;
}