我正在尝试创建一个在C中实现堆栈的程序。
目前,我的堆栈显示为空。
我认为这是因为我传递了堆栈而不是指向堆栈的指针。
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int info;
struct node * ptr;
}node;
//create
//push
//pop
//destroy
//display
void push(int, node * top_node);
void pop(node * top_node);
void destroy(node * top_node);
void display(node * top_node);
int main(int argc, char** argv)
{
node * top_node = NULL;
push(1, top_node);
push(5, top_node);
push(55, top_node);
display(top_node);
pop(top_node);
display(top_node);
pop(top_node);
display(top_node);
pop(top_node);
display(top_node);
push(1, top_node);
display(top_node);
destroy(top_node);
return (EXIT_SUCCESS);
}
void display(node * top_node)
{
node * temp = top_node;
if(top_node == NULL)
{
printf("The stack is empty\n");
return;
}
while(temp != NULL)
{
printf("%d\n ", temp-> info);
temp = top_node -> ptr;
}
}
void push(int data, node * top_node)
{
if(top_node == NULL)
{
top_node = (struct node **) malloc(1*sizeof(struct node));
top_node ->ptr = NULL;
top_node -> info = data;
}
else
{
node * temp = (struct node *) malloc(1*sizeof(struct node));
temp -> ptr = top_node;
temp -> info = data;
top_node = &temp;
}
}
void pop(node * top_node)
{
node * new_top = top_node;
if(new_top == NULL)
{
printf("\nERROR, the stack is empty");
return;
}
else
{
new_top = new_top -> ptr;
printf("popped value = %d", top_node -> info);
free(top_node);
top_node = new_top;
}
}
void destroy(node * top_node)
{
node * temp = top_node;
while(temp != NULL)
{
temp = top_node -> ptr;
free(top_node);
top_node = temp;
temp = temp->ptr;
}
free(temp);
}
我得到的输出是:
堆栈是空的 错误,堆栈是空的。堆栈是空的 错误,堆栈是空的。堆栈是空的 错误,堆栈是空的。堆栈是空的 堆栈是空的
RUN SUCCESSFUL(总时间:227ms)
我相信我应该将指针传递给堆栈,我尝试实现它但是却发现了一堆错误。
在没有给出完整答案的情况下朝着这个方向迈出的任何一步都将不胜感激。
答案 0 :(得分:1)
在top_node
中分配给push()
无效,因为该指针是在本地声明的,并且只存在于push()
函数本身的堆栈帧中。相反,您可以将指针传递给main()
函数中声明的指针,如此
void
push(int data, node **top_node)
{
if (*top_node == NULL)
{
*top_node = malloc(sizeof(**top_node));
if (*top_node == NULL)
return; // maybe warn about the error or abort the whole program
(*top_node)->ptr = NULL;
(*top_node)->info = data;
}
else
// append the node
}
否则,分配的空间将永远丢失,从而导致内存泄漏,因为当函数返回时,持有它的加法器的指针将被销毁。
答案 1 :(得分:1)
除了 iharob 和 Cherubim Anand 所识别的按价值调用到top_node
之外,还有还有其他问题:
top_node
的函数必须使用node **
除display
之外的地址传递其地址,因为它只需读取top_node
而无需修改它。top_node
&
运算符传递pop(&top_node);
的地址,而不是像{{display
那样传递其值。 1}}功能类似于display(top_node);
。top_node
的使用必须使用*
运算符(*top_node
除去display
之外的display
运算符进行一级解除引用,其中temp = top_node -> ptr;
只传递值。 temp
函数中,行temp = temp->ptr;
将始终将(struct node **) malloc(1*sizeof(struct node));
设置为第二个元素,从而导致循环永远迭代。它应该是push
。(struct node*)malloc(sizeof(struct node));
中的1
不正确,应更改为destroy
。任何数字乘以#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int info;
struct node *ptr;
}node;
//create
//push
//pop
//destroy
//display
void push(int, node ** top_node);
void pop(node ** top_node);
void destroy(node ** top_node);
void display(node * top_node);
int main(int argc, char** argv)
{
node *top_node = NULL;
push(1, &top_node);
push(5, &top_node);
push(55, &top_node);
display(top_node);
pop(&top_node);
display(top_node);
pop(&top_node);
display(top_node);
pop(&top_node);
display(top_node);
push(1, &top_node);
display(top_node);
destroy(&top_node);
return (EXIT_SUCCESS);
}
void display(node * top_node)
{
node * temp = top_node;
if(top_node == NULL)
{
printf("The stack is empty\n");
return;
}
while(temp != NULL)
{
printf("%d\n", temp->info);
temp = temp->ptr;
}
}
void push(int data, node ** top_node)
{
if(top_node == NULL)
{
*top_node = (struct node*)malloc(sizeof(struct node));
(*top_node)->ptr = NULL;
(*top_node)-> info = data;
}
else
{
node * temp = (struct node*)malloc(sizeof(struct node));
temp -> ptr = *top_node;
temp -> info = data;
*top_node = temp;
}
}
void pop(node ** top_node)
{
node * new_top = *top_node;
if(new_top == NULL)
{
printf("ERROR, the stack is empty\n");
return;
}
else
{
new_top = new_top -> ptr;
printf("Popped value = %d\n", (*top_node)-> info);
free(*top_node);
*top_node = new_top;
}
}
void destroy(node ** top_node)
{
node * temp = *top_node;
while(temp != NULL)
{
temp = (*top_node)-> ptr;
free(*top_node);
*top_node = temp;
}
}
都保持不变。clusters:
test:
tag_cl: tag0
mtest:
tag_cl: tag1, tag12
ctest3:
tag_cl: tag2, tag22
函数中的最后两个语句是错误的,必须删除才能保留正确的功能。以下是修改后的代码:
tag_cl