我正在尝试使用循环链表来解决Josephus问题。但是在create函数中,我得到了一个关于指向链表节点的NULL指针的分段错误。有人能解释为什么会出现分割错误吗?非常感谢。
#include <iostream>
using namespace std;
struct llnode
{
int data;
bool life;
struct llnode *ptr;
};
typedef struct llnode *llptr;
int create(llptr &L, llptr F, int n, int c=1)
{
if(!L)
{
L = new(llnode);
if(c=1)
F = L;
L->data = c;
L->life = true;
L->ptr = NULL;
}
if(c==n)
{
L->ptr = F;
return 0;
}
create(L->ptr,F,n,1+c);
return 0;
}
int execution(llptr L,int n)
{
if(n==2)
{
cout<<"The Winner is: "<<L->data<<endl;
return 0;
}
L = L->ptr;
while(L->life == false)
L = L->ptr;
L->life = false;
while(L->life == false)
L = L->ptr;
execution(L,n-1);
return 0;
}
int main()
{
llptr L,F;
int n;
cout<<"Enter the Number of Players"<<endl;
cin>>n;
create(L,F,n,1);
execution(L,n);
return 0;
}
您的问题就在这里:
llptr L, F;
L
和F
指向什么?到目前为止,他们都是狂野的指针手。也就是说,你没有保证。因此,当您将它们传递给create()
并检查if(!L)
时,它将为false,因为L
不是nullptr。
因此,您将尝试用L->ptr = F;
取消引用L
。但是,L
再次指向某个垃圾地址。这是未定义的行为。
请确保初始化指向nullptr
的所有指针。