2013-04-22 67 views
0

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

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; 
} 

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

+0

堆栈大小为1的头部和尾部应该等于堆叠上的单个物体 – brendosthoughts 2013-04-22 20:53:14

+0

@brendanmorrison:它是流行音乐之前的一个*,所以这看起来很好。 – Roddy 2013-04-22 20:54:53

+0

@brendanmorrison:将'head'和'tail'设置为'NULL'的子句在'if'中,它在检查'stackSize'之前会减少以指示最后一个对象已被删除。该代码将列表清空,而不是将其设置为具有一个对象。 – 2013-04-22 20:55:04

回答

1

错误不可能是你说的。你只需要给一个指针赋值。我的猜测是它来自上面两行。

前:

int val = head->value; 

请加:

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

,并尝试再次运行代码。

如果断言发生火灾,请跟踪stackSize的所有用法。如果不是,则不一定意味着指针不是随机的,或者指向取消分配的空间。在此功能中,除head->value之外的所有内容都可以注释。然后尝试创建一个列表,按一个元素,然后尝试拨打removeFromStack。然后尝试按两个元素,弹出一个并再次尝试removeFromStack

我的猜测是你的计数器在另一个函数的某处被损坏。