2

我正在尝试使用循环链表来解决约瑟夫斯问题。但是在创建函数中,我得到了一个关于指向链表节点的 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;
}
4

1 回答 1

2

你的问题就在这里:

llptr L, F;

LF指向什么?截至目前,它们都是Wild Pointers。也就是说,你没有任何保证。因此,当您将它们传递给create()并检查if(!L)时,它将是错误的,因为L它不是 nullptr。

因此,您将尝试取消引用L. L->ptr = F;但同样,L指向一些垃圾地址。这是未定义的行为。

确保将所有指针初始化为nullptr.

于 2021-01-04T15:52:23.060 回答