弹出堆栈的唯一成员

时间:2013-04-22 20:50:53

标签: c stack

我使用双向链表在C中构建了一个堆栈结构,当弹出列表的最后一个元素时,我遇到了一个段错误。这是pop方法和一些相关的全局变量:

typedef struct node {

    int value;
    struct node *prev;
    struct node *next;

} node;

node *head = NULL;
node *tail = NULL;
int stackSize = 0;

int removeFromStack(){
    node *tempNode = head;

    if(stackSize <= 0){
        emptyStackError();
    }

    int val = head->value;

    if(stackSize == 1){
        head = NULL; //Segfaults here
        tail = NULL;
    }

    else{
        head = head->next;
        head->prev = NULL;
    }

    free(tempNode);
    stackSize--;
    return val;
}

很明显,我不应该只是将头部和尾部设置为null。我应该做什么呢?

1 个答案:

答案 0 :(得分:1)

错误可能不在你说的地方。您只需为指针赋值。我的猜测是它来自上面的两行。

在:

int val = head->value;

请添加:

assert(head != NULL && "Oops, the counter is messed up");

并尝试再次运行您的代码。

如果断言触发,则跟踪stackSize的所有使用情况。如果不是,则不一定意味着指针不是随机的,或者指向解除分配的空间。在此函数中注释head->value以外的所有内容。然后尝试创建一个列表,按下一个元素,然后尝试调用removeFromStack。然后尝试按两个元素,弹出一个元素并再次尝试removeFromStack

我的猜测是你的计数器在另一个函数的某个地方被破坏了。