分段故障(核心转储)STACK

时间:2015-05-06 14:39:58

标签: c stack

我正在尝试实现一个简单的堆栈,但我遇到了分段问题:

struct node {
    int key;
    struct node *next;
};
static struct node *head, *z, *t;

int main(int argc, char** argv) {
    push(5);
    push(9);
    push(8);
    push(pop()+pop());
    push(4);
    push(6);
    push(pop()*pop());
    push(pop()*pop());
    push(7);
    push(pop()+pop());
    push(pop()*pop());
    printf("%d\n", pop());
    return (EXIT_SUCCESS);
}

stackinit() {
    head = (struct node*) malloc(sizeof *head);
    z = (struct node*) malloc(sizeof *z);
    head->next = z;
    head->key = 0;
    z->key = 0;
    z->next = z;
}

stackempty() {
    return head->next == z;
}

int pop() {
    int x;
    t = head->next;
    head->next = t->next;
    x = t->key;
    free(t);
    return x;
}

push(int v) {
    t = (struct node*) malloc(sizeof *t);
    t->key = v;
    t->next = head->next;
    head->next = t;

}

给出的错误是:分段错误(核心转储)

我明白我正在寻找一个不存在的身份,但我找不到原因?

有人知道为什么吗? 谢谢 最好的问候

1 个答案:

答案 0 :(得分:3)

推送:

t->next = head->next
head->next = t;

应该是:

t->next = head;
head = t;

你想要做的是首先假装t是新头,所以你设置下一个指针指向当前头部。如果我们认为headA且堆叠中的下方元素为B,则我们首先将t搁浅在旁边:

t = new_node;
-- t  A(head)->B->...->NULL

第一行将t挂钩到头部,如下所示:

t->next = head;
-- t->A(head)->B->...

然后第二个使t成为新头。

head = t;
-- t(head)->A->B->...->NULL

现在你的流行音乐也存在一些问题:

t = head->next;
head->next = t->next;

这应该是:

t = head;
head = head->next;

我们正在做的是将当前头部复制到t,这样我们就不会丢失它,然后下一行是弹出堆栈的实线(将头部改为指向堆栈下面的元素。)

我真的建议您在编写代码之前将其绘制在纸上。它会帮助你更快地学习。

最后但并非最不重要的是,您需要调用此stackinit函数来正确初始化所有内容,但您并未调用它。在那里,我不确定z应该做什么,但这肯定是不正确的:

z->next = z;

这使得z循环,如下所示:z->z->z->z->...