堆栈C中的弹出头元素

时间:2016-03-14 13:00:35

标签: c pointers segmentation-fault stack

我无法实现从堆栈中删除第一个元素的函数。 (我确定堆栈至少有两个元素)

typedef struct Node {
    T value;
    struct Node *next;
} Node;

typedef struct Stack {
    Node *head;

} Stack;

void Pop(Stack **st) {
    if (!IsEmptyStack(*st)) {
        Node* aux = (*st)->head;
        (*st)->head = (*st)->head->next;

    }
}

但同样发生...... Segmentation fault.

如何修复弹出功能?

以下是我使用的其他功能:

void InitStack(Stack **st)
{
    (*st) = (Stack *) malloc(sizeof(Stack *));
    (*st)->head = NULL;

}

int IsEmptyStack (Stack *st)
{
    if (!st)
        return 1;
    else
        return 0;
}

2 个答案:

答案 0 :(得分:0)

第一种方法似乎是正确的,但为什么要将Stack的双指针传递给Pop?似乎可以通过这种方式简化Pop

typedef struct Node {
    T value;
    struct Node *next;
} Node;

typedef struct Stack {
    Node *head;
} Stack;

void Pop(Stack *st) {
    if (!IsEmptyStack(st)) {
        Node *aux = st->head;
        st->head = aux->next;
        ... // dispose of aux appropriately
    }
}

答案 1 :(得分:0)

IsEmptyStack错了..  而不是

int IsEmptyStack (Stack *st)
{
    if (!st)
        return 1;
    else
        return 0;
}

我必须使用

int IsEmptyStack (Stack *st)
{
    if (!st->head)
        return 1;
    else
        return 0;
}

那是因为我已经为st分配了内存..所以检查st是无关紧要的。