我正在尝试使用链接列表实现堆栈。我遇到了pop()
函数的问题。它编译好了,但是当我尝试运行代码时,它在tmp=tmp->head;
上崩溃了,我不明白为什么。我试过谷歌,但没有找到答案。这是完整的代码:
struct node{ //kreiram stog
struct node* head;
struct node* next;
int broj;
}node;
void push_onto(int broj){ // dodajem na glavu
struct node* novi;
novi=(struct node*)malloc(sizeof(struct node));
//novi=novi->head;
if (novi== NULL)
printf("Smth is wrong,Jose!\n");
else
novi->broj=broj;
novi->next=novi->head;
novi->head=novi;
}
int pop()// skidam sa stoga
{
struct node* temp;
temp=temp->head;
int br;
if (temp->next==NULL)
return -1;
else
br=temp->head;
temp=temp->next;
free(temp);
return br;
}
void top(){ //koji je element na stogu
struct node* tmp;
printf("Trenutni element na stogu je %d",tmp->broj);
}
void is_empty(){
struct node* tmp;
tmp=tmp->head;
if (tmp->head ==NULL)
printf("List is empty!\n");
}
void print_elem(){
struct node* tmp;
tmp=tmp->head;
if (tmp->head==NULL)
printf("Smth gone wrong!\n");
while (tmp!=NULL)
{
printf("Number is: %d",tmp->broj);
tmp=tmp->next;
}
printf("\n");
}
int main(void){
push_onto(15);
push_onto(10);
push_onto(20);
push_onto(12);
//print_elem();
printf("The element removed is : %d",pop());
//print_elem();
return 0;
}
这不是我的功课,虽然看起来如此。这只是我试图找出一些基本算法的尝试。 提前致谢! :)
答案 0 :(得分:3)
struct node* temp;
temp=temp->head;
您从未为temp
分配任何内容。它只是一个未初始化的指针。
目前还不清楚你想要弹出什么。您的pop()
函数不带参数,它不访问全局变量。同样,我看到你的大多数功能都存在同样的问题。它们应该在某种堆栈对象上运行,但它们实际上都不会将这样的对象作为参数。
答案 1 :(得分:2)
我认为你接近“得到它”。我记得在开始时理解结构和指针对我来说有点困难。但是一旦你“得到它”,你就没事了。
您似乎正在尝试使用简单链接列表构建堆栈。我会尝试提供一些建议。
我要修改的第一件事是你的node
结构。确实,你需要保持
跟踪头节点,但通常您不需要在每个节点上执行此操作。因此,我们将从您的节点定义中删除它。
struct node{ //kreiram stog
struct node* next;
int broj;
};
现在,您需要跟踪列表的头节点。这可以通过一个全局变量完成,我将称之为:
struct node* head = NULL;
我正在将它初始化为null,因为它是空的。空头指针总是意味着 你的堆栈是空的。 尝试操作列表的所有代码都需要启动 用这个头节点。这是你的定位点。
然后到push_onto()
函数
void push_onto(int broj){ // dodajem na glavu
// this bit is fine
struct node* novi;
novi=(struct node*)malloc(sizeof(struct node));
if (novi== NULL)
printf("Smth is wrong,Jose!\n");
else { //I'm adding the bracket, you require it to enclose more than one statement
//in the else section
novi->broj = broj; // store the number to be pushed on the stack
novi->next = head; // link the list, remember head will
// be NULL if the stack was empty
head = novi; // make the new node the current head node
}
}
让我们修改pop()函数
int pop()// skidam sa stoga
{
struct node* temp;
int result;
// first we will check if the head node is NULL (stack is empty)
if( head == NULL ) {
printf("Stack is empty\n");
return -1;
} else {
// hold a temporary value to current head pointer, so we can modify the head node
// and still refer to it
temp = head;
// Head node should now point to the next node on the list (will become NULL when
// popping the last value. This is what actually "pops" the value from our list
head = head->next;
// place in temporary variable the result we are popping. This is so because
// it's not a good idea to reference the node after we free the memory it is using
result = temp->broj;
// release the memory occupied by the node we're popping
free(temp);
return result;
}
}
最后,我将向您展示如何修复使用堆栈的一些函数
void top(){ //koji je element na stogu
if( head == NULL ) {
printf("Stack is empty\n");
} else {
printf("Trenutni element na stogu je %d",head->broj);
}
}
void print_elem(){
struct node* tmp;
// As you can see, we're initializing tmp to head, since head will always point
// to the top element of your stack.
tmp = head;
if (tmp==NULL) {
printf("Stack is empty!\n");
return;
}
while (tmp!=NULL)
{
printf("Number is: %d",tmp->broj);
tmp=tmp->next;
}
printf("\n");
}
希望事情现在更清楚了。头节点作为全局变量保持分开,正如我之前所说,它是开始操作列表的锚点。如果您仍然感到困惑,请随时问我。
=)