急!!帮忙解读一个C++数据结构的问题,要求详细一点~~我要写实验报告,而且后天就要交~~各位,跪求帮忙~

这个是利用树型结构解决约瑟夫环问题
程序如下:
#include<iostream>
#include"LinkList.h"
using namespace std;

void Creat(LinkList &y,int &n){
int a1,a2,i;
cout<<"请输入"<<n<<"个密码:"<<endl;
for(i = 1; i<=n; i++){
cin>>a1;
a2 = i;
y.Append(a1,a2);
}
}
int main(){
LinkList y;
int j,n,m;
cout<<"请输入参与人数n:"<<endl;
cin>>n;
cout<<"请输入第一个上限m:"<<endl;
cin>>m;
Creat(y,n);
y.Delete(m);
system("pause");
return 0;

头文件LinkList.h的文件如下
#ifndef _LinkLIST_
#define _LINKLIST_
//#include<iostream>
using namespace std;

struct LinkNode
{
int data, num;
LinkNode *next;
};

class LinkList
{
public:
LinkList();
bool Append(int,int);
bool Delete(int);
private:
LinkNode *tail;
} ;

/*构造函数*/

LinkList::LinkList()
{
tail = NULL;
}

/*尾部插入模板,用于输入数据的保存*/

bool LinkList::Append(int e1,int e2)
{ LinkNode *p = new LinkNode;
p->data = e1;
p->num = e2;
if (tail== NULL){
tail = p;
tail->next = tail;
}
else {
p->next = tail->next;
tail->next = p;
tail = p;
}
return true;
}

/*删除函数模板,用于保存编号、密码和删除*/

bool LinkList::Delete(int m)
{
LinkNode *p = tail,*q;
while(p != p->next){
for(int k=1;k<m;k++)
p = p->next ;
q = p->next;
p->next = q->next;
cout<<q->num<<" ";
m = q->data;
delete q;
}
cout<<p->num<<" ";
delete p;
};
#endif

就是希望可以详细点,最好每一句都有注释……我知道很麻烦,所以采纳后我至少给加30个积分,如果好,我可以加更多,100封顶。写我邮箱可以么? [email protected] 如果不方便,就直接写这儿吧……现在这儿谢过了~

//这个是带密码的约瑟夫环问题,并且的确是用链表做的0.0
//有不懂的请在问题补充里说明
//个人理解,如有不当还请见谅
#include<iostream>
#include"LinkList.h"
using namespace std;

void Creat(LinkList &y,int &n) //构造约瑟夫环y,人数为n
{ //每个人包含两个信息:一个是他的密码,一个是他的序号,即他是第几个人
int a1,a2,i; //a1为密码,a2表示这是第几个人;i是临时变量,用于下面的for循环
cout<<"请输入"<<n<<"个密码:"<<endl;
for(i = 1; i<=n; i++) //循环n次,每次读取下一个人的信息
{
cin>>a1; //读入密码
a2 = i; //读入序号
y.Append(a1,a2); //将这个人加入到约瑟夫环中,其中a1是他的密码,a2是他的序号
}
}

int main()
{
LinkList y; //y为约瑟夫环
int j,n,m; //n为人数,m为第一个上限
cout<<"请输入参与人数n:"<<endl; //这句你看的懂吧?输出提示信息
cin>>n; //读入人数n
cout<<"请输入第一个上限m:"<<endl;//输出提示信息
cin>>m; //读入m
Creat(y,n); //调用Creat构造约瑟夫环y,人数为n
y.Delete(m); //第一个上限为m,以此调用Delete对约瑟夫环y逐个删除
system("pause"); //暂停一下好让你看清结果
return 0;
}

//头文件LinkList.h的文件如下
#ifndef _LinkLIST_
#define _LINKLIST_
//#include<iostream>
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<m;k++) //从k=1开始往后数,数到第m-1个人
p = p->next ; //p一直往后移,相当于一直往后数
q = p->next; //q为p的下一个人,即要删的人
p->next = q->next; //p指向q的下一个人,相当于p指向p的下两个人
cout<<q->num<<" "; //输出q的序号
m = q->data; //m设为q的密码
delete q; //把q删了
} //}删到只剩一个人
cout<<p->num<<" "; //输出此人序号
delete p; //删之
};
#endif
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-28
哥 这个不是 用 循环链表做的么 不是树形的啊追问

是么 0.0
可是这个就是数啊……这个程序是在树型结构程序示例里面的
那哥你能帮我读么,崩管他是什么

相似回答