繁体   English   中英

分段故障(核心已转储)堆栈

[英]Segmentation fault (core dumped) 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;

}

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

我了解我正在查找不存在的ID,但我不知道为什么?

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

推送中:

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;

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

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

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

z->next = z;

这使z圆形,如下所示: z->z->z->z->...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM