数据结构试验
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到只剩下一个人为止。
输入:n,m (m < n)
输出:剩下最后一个人的编号
#include<iostream>
using namespace std;
typedef struct LNode
{
int data;
struct LNode *next;
}LNode ,*LinkList;
int main()
{
//建立循环链表
LNode *L,*r,*s;
L = new LNode;
r =L;
int n,m,a;
cout <<"请输入数到几出列、总人数和从编号几开始报数:" <<endl;
cin>>m;
cin>>n;
cin>>a;
int k = m;
for(int i = 1;i<=n;i++) //尾插法建立链表
{
s = new LNode;
s->data = i;
r->next = s;
r= s;
}
r->next =L->next; //让最后一个结点指向第一个有数据结点
LNode *p;
p = L->next;
for(i = 1;i<a;i++)
{
p = p->next;
}
delete L; //删除第一个空的结点
cout<<"前"<<n-1<<"个出列的分别是:"<<endl;
while(p->next != p)
{
for(i = 1;i<k-1;i++)
{
p = p->next;
}
cout<<p->next->data<<endl;
p->next = p->next->next; //将该节点从链表上删除
p = p->next;
}
cout<<"最后一个人编号为:"<<p->data<<endl;
return 0;
}