//这个是带密码的约瑟夫环问题,并且的确是用链表做的0.0
//有不懂的请在问题补充里说明
//个人理解,如有不当还请见谅
#include
#include"LinkList.h"
using namespace std;
void Creat(LinkList &y,int &n) //构造约瑟夫环y,人数为n
{ //每个人包含两个信息:一个是他的密码,一个是他的序号,即他是第几个人
int a1,a2,i; //a1为密码,a2表示这是第几个人;i是临时变量,用于下面的for循环
cout<<"请输入"<
{
cin>>a1; //读入密码
a2 = i; //读入序号
y.Append(a1,a2); //将这个人加入到约瑟夫环中,其中a1是他的密码,a2是他的序号
}
}
int main()
{
LinkList y; //y为约瑟夫环
int j,n,m; //n为人数,m为第一个上限
cout<<"请输入参与人数n:"<
cout<<"请输入第一个上限m:"<
Creat(y,n); //调用Creat构造约瑟夫环y,人数为n
y.Delete(m); //第一个上限为m,以此调用Delete对约瑟夫环y逐个删除
system("pause"); //暂停一下好让你看清结果
return 0;
}
//头文件LinkList.h的文件如下
#ifndef _LinkLIST_
#define _LINKLIST_
//#include
using namespace std;
struct LinkNode //设置约瑟夫环中的基本单元LinkNode,或者说,每个LinkNode代表一个人
{
int data, num; //每个人包括密码,序号
LinkNode *next; //以及指向下一个人的指针
};
class LinkList //LinkList类:约瑟夫环
{
public: //公共变量声明
LinkList(); //构造函数(用于初始化)
bool Append(int,int); //函数Append用于加人
bool Delete(int); //Delete用于删人
private: //private变量声明
LinkNode *tail; //tail为尾指针,指向约瑟夫环中的最后一个人
} ;
/*构造函数*/
LinkList::LinkList()
{
tail = NULL; //初始化:将尾指针tail指针置为空
}
/*尾部插入模板,用于输入数据的保存*/
bool LinkList::Append(int e1,int e2)//函数Append用于加人
{
LinkNode *p = new LinkNode; //新建一个人p
p->data = e1; //将这个人的密码设为e1
p->num = e2; //序号设为e2
if (tail== NULL) //如果尾指针tail为空,说明p是第一个人
{
tail = p; //将尾指针指向p
tail->next = tail; //tail是尾指针,tail->next表示头指针,即约瑟夫环的起始点,即约瑟夫环中的第一个人
//指向自己,即p的下一个人还是p。因为目前只有一个人所以这么设置,方便后续操作
}
else //尾指针tail不为空时
{ //tail表示最后一个人
p->next = tail->next; //p-指向起始点,即p的下一个人是第一个人
tail->next = p; //tail指向p,即tail的下一个人是p
tail = p; //tail变为p,即p变成最后一个人
}
return true;
}
/*删除函数模板,用于保存编号、密码和删除*/
bool LinkList::Delete(int m) //删除函数用于删人
{
LinkNode *p = tail,*q; //新建p,p初始化为最后一个人,q为临时变量
while(p != p->next) //当p的下一个人不是他自己时,即当约瑟夫环中的人数大等2时
{ //{
for(int k=1;k
q = p->next; //q为p的下一个人,即要删的人
p->next = q->next; //p指向q的下一个人,相当于p指向p的下两个人
cout<
m = q->data; //m设为q的密码
delete q; //把q删了
} //}删到只剩一个人
cout<
delete p; //删之
};
#endif
哥 这个不是 用 循环链表做的么 不是树形的啊