我正在尝试实现一个简单的堆栈,但我遇到了分段问题:
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;
}
给出的错误是:分段错误(核心转储)
我明白我正在寻找一个不存在的身份,但我找不到原因?
有人知道为什么吗? 谢谢 最好的问候
答案 0 :(得分:3)
推送:
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;
我们正在做的是将当前头部复制到t
,这样我们就不会丢失它,然后下一行是弹出堆栈的实线(将头部改为指向堆栈下面的元素。)
我真的建议您在编写代码之前将其绘制在纸上。它会帮助你更快地学习。
最后但并非最不重要的是,您需要调用此stackinit
函数来正确初始化所有内容,但您并未调用它。在那里,我不确定z
应该做什么,但这肯定是不正确的:
z->next = z;
这使得z
循环,如下所示:z->z->z->z->...