用C++编程 猴子选大王
有M个猴子围成一圈,每个有一个编号,编号从1到M。打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一个开始,每隔N个,数到的猴子出圈,最后剩下来的就是大王。要求...
有M个猴子围成一圈,每个有一个编号,编号从1到M。打算从中选出一个大王。经过协商,决定选大王的规则如下:从第一个开始,每隔N个,数到的猴子出圈,最后剩下来的就是大王。
要求:使用单链表循环,从键盘输入M,N,编程计算哪一个编号的猴子成为大王。 展开
要求:使用单链表循环,从键盘输入M,N,编程计算哪一个编号的猴子成为大王。 展开
2个回答
展开全部
#include <iostream>
using namespace std;
template <class datatype> class LinkList;
template <class datatype>
class Node
{
friend class LinkList<datatype>;//友元类
private:
datatype data;//计猴子号
Node<datatype> *next;
};
template <class datatype>
class LinkList
{
public:
LinkList();
void monkey(int m); //建立有m个元素的单链表
datatype Get(int a); //取单链表中第i个结点的元素值
datatype Delete(int n); //在单链表中删除第n个结点
private:
Node<datatype> *head,*tail; //单链表的结构指针
};
template <class datatype>
LinkList<datatype>:: LinkList( )
{head=new Node<datatype>; head->next=NULL;}
template <class datatype>
void LinkList<datatype>::monkey(int m)
{
int i;//整型变量i,用于计数
Node<datatype> *p,*q;//声明结构指针
p=new Node<datatype>;//为p分配空间
p->data=1; //初始化p结点data域为1
p->next=NULL;//初始化p结点next域为空
head=p;//链表头指针head赋值为p
q=p; //q赋值为p
for (i=2; i<=m; i++) //用循环结构构造链表
{
p=new Node<datatype>;//为p配内存空间
p->data=i; //初始化p结点data域为i,表示猴子号
q->next=p; //将p点加到链表尾部
q=p; //让指向链表尾部结点
p->next=NULL; //链表尾部为空
}
tail=q;//链表尾
tail->next=head;//链表尾部指向链表头,形成循环链表
}
template <class datatype>
datatype LinkList<datatype>::Delete(int n)
{
Node<datatype> *p,*q;
int j=0;
q=tail; //指向循环链表尾部
cout<<"被删除的猴子号码依次为:"<<endl;
while (q!=q->next) //剩余结点数不为1,则继续循环
{
p=q->next;//p赋值给下一个相邻结点
j++;
if(j%n==0)
{
cout<<p->data<<ends;
q->next=p->next;//删除此结点
delete p;//释放空间
p=NULL;
}
else q=p;//q指向相邻的下一个结点p
}
cout<<endl;
head=q;//head指向结点q,q为链表中剩余的一个结点
return head->data;
}
template <class datatype>
datatype LinkList<datatype>::Get(int a)
{
Node<datatype> *p;
int j;//计数器
p=head->next; j=1; //或p=head; j=0;
while (p && j<a)
{
p=p->next; //工作指针p后移
j++;
}
if (!p) throw "a值不合法";
else return p->data;
}
void main()
{
int m,n;
LinkList<int>mon;
cout<<"请输入猴子的总数:"<<endl;
cin>>m;
cout<<"请输入要删除猴子的所报的数:"<<endl;
cin>>n;
mon.monkey(m);
mon.Delete(n);
cout<<"猴王是:"<<mon.Get(1)<<"号"<<endl;
}
using namespace std;
template <class datatype> class LinkList;
template <class datatype>
class Node
{
friend class LinkList<datatype>;//友元类
private:
datatype data;//计猴子号
Node<datatype> *next;
};
template <class datatype>
class LinkList
{
public:
LinkList();
void monkey(int m); //建立有m个元素的单链表
datatype Get(int a); //取单链表中第i个结点的元素值
datatype Delete(int n); //在单链表中删除第n个结点
private:
Node<datatype> *head,*tail; //单链表的结构指针
};
template <class datatype>
LinkList<datatype>:: LinkList( )
{head=new Node<datatype>; head->next=NULL;}
template <class datatype>
void LinkList<datatype>::monkey(int m)
{
int i;//整型变量i,用于计数
Node<datatype> *p,*q;//声明结构指针
p=new Node<datatype>;//为p分配空间
p->data=1; //初始化p结点data域为1
p->next=NULL;//初始化p结点next域为空
head=p;//链表头指针head赋值为p
q=p; //q赋值为p
for (i=2; i<=m; i++) //用循环结构构造链表
{
p=new Node<datatype>;//为p配内存空间
p->data=i; //初始化p结点data域为i,表示猴子号
q->next=p; //将p点加到链表尾部
q=p; //让指向链表尾部结点
p->next=NULL; //链表尾部为空
}
tail=q;//链表尾
tail->next=head;//链表尾部指向链表头,形成循环链表
}
template <class datatype>
datatype LinkList<datatype>::Delete(int n)
{
Node<datatype> *p,*q;
int j=0;
q=tail; //指向循环链表尾部
cout<<"被删除的猴子号码依次为:"<<endl;
while (q!=q->next) //剩余结点数不为1,则继续循环
{
p=q->next;//p赋值给下一个相邻结点
j++;
if(j%n==0)
{
cout<<p->data<<ends;
q->next=p->next;//删除此结点
delete p;//释放空间
p=NULL;
}
else q=p;//q指向相邻的下一个结点p
}
cout<<endl;
head=q;//head指向结点q,q为链表中剩余的一个结点
return head->data;
}
template <class datatype>
datatype LinkList<datatype>::Get(int a)
{
Node<datatype> *p;
int j;//计数器
p=head->next; j=1; //或p=head; j=0;
while (p && j<a)
{
p=p->next; //工作指针p后移
j++;
}
if (!p) throw "a值不合法";
else return p->data;
}
void main()
{
int m,n;
LinkList<int>mon;
cout<<"请输入猴子的总数:"<<endl;
cin>>m;
cout<<"请输入要删除猴子的所报的数:"<<endl;
cin>>n;
mon.monkey(m);
mon.Delete(n);
cout<<"猴王是:"<<mon.Get(1)<<"号"<<endl;
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询