韩磊的向天再借五百年:求助(c++改错)我写的约瑟夫问题

来源:百度文库 编辑:高校问答 时间:2024/04/26 22:04:07
#include<iostream.h>

class node;
class list;

class node
{
friend list;
int a;
node *next;
};

class list
{
node *h;
int size;
public:
list(void){h=new node;h->a=1;h->next=h;size=1;};
~list(void){clearlist();};
node *create(int n);
void clearlist(void);
void josephus(int m);
};

node *list::create(int n)
{
node *t=h;
size=n;
int i;
for(i=2;i<=n;i++)
{
node *s=new node;
s->next=h;
s->a=i;
t->next=s;
t=t->next;
}
return h;
}

void list::clearlist()
{
node *p=h;
node *q=p->next;
while(q!=h)
{
delete p;
p=q;
q=q->next;
}
delete p;
size=0;

}

void list::josephus(int m)
{
int i,j;
node *p=h;
while(p!=p->next)
{
for(i=1;i<m-1;i++)
{
p=p->next;
}
cout<<"out"<<p->next->a<<endl;
p->next=p->next->next;
p=p->next;
}
cout<<"out"<<p->a<<endl;
return;
}

void main()
{
list b;
b.create(7);
b.josephus(20);
}

运行后可以得出结果,但弹出对话框“Debug Assertiong Failed”

老实说,用一个数组就行了,干嘛要用链表呢,看得头都昏了。
我简单地调试了下,发现josephus函数有问题,执行后得到的是一个有3个结点的链表,且第一个为1,第二个为2,第三个为4,而且第三个的指针指向了自身,这样,在clear时就会出错了

C++程序员不可能无视资源开销