[英]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
为新头,因此您将下一个指针设置为指向当前头。 如果我们假设head
是A
,而堆栈中下面的元素是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.