帮你改好了,头文件什么的自己再弄弄,我是放在一个CPP里面的
#include
//#include "StdAfx.h"
using namespace std;
class Cirlist;
class CirlistNode
{
friend class Cirlist;
private:
CirlistNode *link;
int data;
public:
CirlistNode(const int item, CirlistNode *p=NULL)
{
data=item;
link=p;
}
};
class Cirlist
{
private:
CirlistNode *first,*last;
public:
Cirlist()
{
first=last=NULL;
}
~Cirlist()
{
//既然是循环链表,那么你的while循环就不能这么写,因为你从first删除到last,
//然后又会回到first,但这是first已经不归这个程序管理了,对其进行访问会造成
//无法预料的错误
/*while(first!=NULL)
{
CirlistNode *p=first;
first=first->link;
delete p;
}*/
CirlistNode *p=NULL;
while(first!=last)
{
p=first;
first=first->link;
delete p;
p=NULL;
}
delete last;
first=NULL;
last=NULL;
}
void Joseph(int n,int m);
};
void Cirlist::Joseph(int n,int m)
{
int i;
//这里每次产生一个CirlistNode对象并把其地址赋给p1,p1对其进行初始化
//并将控制权转交给last,到下一次for循环产生一个新的p1和一个新的
//CirlistNode对象,然后last改变指向性,于是就内存泄露了。整个for
//循环结束后,造成了n-1次内存泄露,first为默认的NULL,last指向最后一次
//声明的CirlistNode对象,压根不存在链表。
/*for (i=0;i
CirlistNode *p1=new CirlistNode(1,NULL);
p1->data=i+1;
p1->link=NULL;
last=p1;
}*/
first=new CirlistNode(1,NULL);
last=first;
CirlistNode *p1=last;
for(i=2; i<=n; i++)
{
last=last->link;
last=new CirlistNode(i,NULL);
p1->link=last;//新建的节点一定要添加到链表中,要不就内存泄露了
p1=p1->link;
}
last->link=first;//构建循环
int left=n,bs=0;
CirlistNode *p2=first,*q=last;
while (left>1)
{
//摘链应该把p2的前一个节点指向其后一个节点,然后删除p2,
//所以遍历的话应该停在p2的前一个
bs=0;//要记得初始化
while (1)
{
bs+=1;
if (bs>=m-1)//既然有明确的循环结束条件,其判断最好放在循环头部
{
break;
}
p2=p2->link;
}
//q->link=p2->link;//上面把q指向last,其link就是头结点,这里为何用头结点
q=p2->link;
p2->link=q->link;
cout << q->data << endl;
delete q;
--left;
p2=p2->link;
}
cout<<"the king is:"<
}
//#include "stdafx.h"
#include
//#include"Cirlist.h"
void main()
{
int n,m;
Cirlist l;
cout<<"输入n和m的值:"<
l.Joseph(n,m);
}