#include <iostream>
using namespace std;
#include<stdlib.h>
template <class DT>
struct LNode //链表结点
{
DT data; //数据域,存储数据元素值
LNode *next; //指针域,指向下一个结点
};
template <class DT>
bool *CreatList(int n) //创建有n个结点的循环链表
{
int i;
LNode<DT> *head=NULL; //开始存放第一个编号
LNode<DT> *p;
LNode<DT> *q;
p=(LNode<DT>*)malloc(sizeof(LNode<DT>));
head=p;
p->data=1;
for(i=2;i<=n;i++)
{
q=(LNode<DT>*)malloc(sizeof(LNode<DT>)); //为每一个结点存放一个数据编号
q->data=i;
p->next=q;
p=q;
}
p->next=head; //最后一个结点指向头部,形成循环链表
return head;
}
template <class DT>
bool PrintList(LNode<DT> *head,int k,int m) //结点的输出和删除
{
int i;
LNode<DT> *p=head;
LNode<DT> *temp=p; //用temp临时保留创建的结点数
while(p->data!=k) //从第k个结点开始报数
p=p->next;
if(m==1){
while(p->next!=p)
{
temp=p->next;
cout<<"%d,"<<temp->data<<endl;
p->next=temp->next;
delete temp; //报到数的人退出
}
}
else{
while(p->next!=p) //链表存在最后一个结点时退出循环
{
for(i=1;i<m;i++)
{
temp=p;
p=p->next;
}
printf("%d,",p->data);
temp->next=p->next;
free(p); //被叫到号数结点出列释放内存空间
p=temp->next; //链表中存在两个及两个以上结点时继续报数
}
}
cout<<"%d\n"<<p->data<<endl;
free(p);
}
int main()
{
int n,m,k;
LNode<int> *head;
cout<<"请输入人数,约定编号,密码:"<<endl;
cin>>n>>k>>m;
PrintList(CreatList(n),k,m);
return 0;
}