【问题标题】:Pop head element in stack C堆栈 C 中的弹出头元素
【发布时间】:2016-06-29 12:50:21
【问题描述】:

我在实现从堆栈中删除第一个元素的函数时遇到问题。 (我确定堆栈至少有两个元素)

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

【问题讨论】:

  • 为什么你要传递 **st 而不是 *st ?
  • 代码看起来不错(因为不应该导致段错误)。问题可能出在创建堆栈的代码中。
  • @JoulinRouge 这是学校作业,我不能修改函数的定义
  • 可能问题出在程序的其余部分,您是否尝试过调试?它到底停在哪里?
  • 可能传递了 Stack**,因为这个 Stack 定义可能基于单链表的定义,在这种情况下,处理指向指针的指针会在许多情况下产生非常优雅的代码案例。

标签: c pointers segmentation-fault stack


【解决方案1】:

第一种方法似乎是正确的,但为什么要将一个指向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
    }
}

【讨论】:

  • @PetruGurita:如果原型是固定的,那么您的第一个代码片段看起来是正确的,问题出在其他地方,可能在Stack 创建或推送代码中。
【解决方案2】:

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 是无关紧要的。

【讨论】:

    猜你喜欢
    • 2018-05-02
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2016-09-05
    • 2015-10-03
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多