[高手赐教]约瑟夫有关问题:为什么小弟我的循环链表不能生成
[高手赐教]约瑟夫问题:为什么我的循环链表不能生成
#include <iostream.h>
template <class T> class circlist;
template <class T> class circlistnode{
friend class circlist <T> ;
public:
circlistnode(T d,circlistnode <T> * l):data(d),link(l){}
circlistnode(T d):data(d),link(NULL){}
private:
T data;
circlistnode <T> *link;
};
template <class T> class circlist{
public:
circlist(T value){first=new circlistnode <T> (value);last=first=first-> link;current=NULL;}
void firster(){current=first-> link;}
void insert(T & value);
void remove();
void prior();
void next();
T getdata();
void J(int n,int m);
private:
circlistnode <T> *first,*current,*last,*priorer;
};
template <class T> void circlist <T> ::insert(T & value){
if(current==NULL) //原表为空
current=first-> link=new circlistnode <T> (value,first); // <T> !!!!
else
{current-> link=new circlistnode <T> (value,current-> link); //not first
current=current-> link;
}
last=current;
}
template <class T> void circlist <T> ::remove(){
if(current!=NULL){
circlistnode <T> *tempptr=current;
current=current-> link;
priorer-> link=current;
delete tempptr;
if(current==first){
last=priorer;
current=current-> link;
}
}
}
template <class T> void circlist <T> ::prior(){
priorer=current;
}
template <class T> void circlist <T> ::next(){
current=current-> link;
if(current==first) current=current-> link;
}
template <class T> T circlist <T> ::getdata(){
return current-> data;
}
template <class T> void circlist <T> ::J(int n,int m){
firster();
for(int i=0;i <n-1;i++){
for(int j=0;j <m-1;j++){
next();
if(j==m-2) prior();
}
cout < < "delete person " < <getdata() < <endl;
remove();
}
}
void main(){
circlist <int> clist(0);
int n,m;
cout < < "请分别输入人数和报数数 " < <endl;
cin> > n> > m;
cout < < "请输入链表值 " < <endl;
for(int i=1;i <=n;i++){
clist.insert(i);
}
clist.J(n,m);
}
------解决方案--------------------
template <class T> class circlist{
public:
circlist(T value){first=new circlistnode <T> (value);last=first=first-> link;current=NULL;}
last=first=first-> link;改为 last=first-> link=first;即可生成循环链表
#include <iostream.h>
template <class T> class circlist;
template <class T> class circlistnode{
friend class circlist <T> ;
public:
circlistnode(T d,circlistnode <T> * l):data(d),link(l){}
circlistnode(T d):data(d),link(NULL){}
private:
T data;
circlistnode <T> *link;
};
template <class T> class circlist{
public:
circlist(T value){first=new circlistnode <T> (value);last=first=first-> link;current=NULL;}
void firster(){current=first-> link;}
void insert(T & value);
void remove();
void prior();
void next();
T getdata();
void J(int n,int m);
private:
circlistnode <T> *first,*current,*last,*priorer;
};
template <class T> void circlist <T> ::insert(T & value){
if(current==NULL) //原表为空
current=first-> link=new circlistnode <T> (value,first); // <T> !!!!
else
{current-> link=new circlistnode <T> (value,current-> link); //not first
current=current-> link;
}
last=current;
}
template <class T> void circlist <T> ::remove(){
if(current!=NULL){
circlistnode <T> *tempptr=current;
current=current-> link;
priorer-> link=current;
delete tempptr;
if(current==first){
last=priorer;
current=current-> link;
}
}
}
template <class T> void circlist <T> ::prior(){
priorer=current;
}
template <class T> void circlist <T> ::next(){
current=current-> link;
if(current==first) current=current-> link;
}
template <class T> T circlist <T> ::getdata(){
return current-> data;
}
template <class T> void circlist <T> ::J(int n,int m){
firster();
for(int i=0;i <n-1;i++){
for(int j=0;j <m-1;j++){
next();
if(j==m-2) prior();
}
cout < < "delete person " < <getdata() < <endl;
remove();
}
}
void main(){
circlist <int> clist(0);
int n,m;
cout < < "请分别输入人数和报数数 " < <endl;
cin> > n> > m;
cout < < "请输入链表值 " < <endl;
for(int i=1;i <=n;i++){
clist.insert(i);
}
clist.J(n,m);
}
------解决方案--------------------
template <class T> class circlist{
public:
circlist(T value){first=new circlistnode <T> (value);last=first=first-> link;current=NULL;}
last=first=first-> link;改为 last=first-> link=first;即可生成循环链表