C ++链接列表初始化

时间:2013-11-29 21:50:51

标签: c++ pointers linked-list

我认为这不是很难,但我看不出自己的错。 我有一个链接列表,我想初始化。 有两件事需要考虑:

  1. 指针*堆栈必须是全局的
  2. 需要使用附加功能 create

    初始化(设置全局指针= NULL)
    struct StackElement {
        int digit;
        StackElement *predecessor;
    }; 
    
    StackElement *stack;
    
    void create (StackElement *anyStack) {
        anyStack->predecessor = NULL;
    }
    
    int main () {
        create(stack);
        return 0;
    }
    
  3. 不幸的是,运行程序导致:

      

    分段错误(核心转储)

    我认为错误必须在函数 create - 任何想法?


    非常感谢 - 大脑停止思考......

    通过编辑 create

    功能解决了问题
    void create (StackElement *anyStack)
        anyStack = new StackElement;
        anyStack->predeccesor = NULL;
    }
    

4 个答案:

答案 0 :(得分:0)

您应该在main函数中创建对象,然后将其地址传递给“create”函数。

喜欢:

int main () {
    StackElement se;
    create(&se);
    return 0;
}

答案 1 :(得分:0)

您忘了创建实际的堆栈对象。也许试试这个:

StackElement the_stack;
StackElement *stack = &the_stack;

int main()
{
    // ...
}

答案 2 :(得分:0)

您的*stack是指向尚未初始化的内存的指针。当您调用create(stack)时,函数create会尝试修改stack指向的内存,但您不拥有此内存(因为谁知道*stack指向的内存)。

您需要执行stack = new StackElementstack = malloc(...)之类的操作,但即便如此,我认为create不会做您想要的事情:特别是{{1}的价值}将不会被设置,并且您的“堆栈”将在其中包含未定义值的元素。所以我认为还有其他问题。

答案 3 :(得分:0)

全局变量'stack'已初始化为零或一些随机值。您必须在使用之前设置引用或检查它是否为零。

struct StackElement {
    int             digit;
    StackElement    *predecessor;
};

StackElement            *stack = 0;

void push(StackElement *anyStack) {
    anyStack->predecessor = stack;
    stack = anyStack;
}

StackElement* pop() {
    StackElement        *ret;

    ret = stack;
    if (stack) {
        stack = stack->predecessor;
}
return ret; 
}