我正在尝试创建一个在 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);
}
我得到的输出是这样的:
The stack is empty
ERROR, the stack is emptyThe stack is empty
ERROR, the stack is emptyThe stack is empty
ERROR, the stack is emptyThe stack is empty
The stack is empty
RUN SUCCESSFUL (total time: 227ms)
我相信我应该传递一个指向堆栈的指针,我尝试实现它,但它抛出了一堆错误。
如果没有给我完整的答案,我将不胜感激。
最佳答案
除了这个问题之外,关于按值调用到top_node
,由iharob和Cherubim Anand识别>,还有其他问题:
- 所有必须修改
top_node
的函数都必须使用node **
获取传入的地址,display
除外,因为它只读取top_node
,无需修改它。 - 对此类修改函数的调用必须传入
top_node
的地址,使用&
运算符,如pop(&top_node);
,而不是像display(top_node);
这样的display
函数那样传递其值。 - 在此类函数中使用
top_node
必须使用*
运算符(如*top_node
)进行一级解引用,但中除外显示
,其中仅传递值。 - 在
display
函数中,temp = top_node -> ptr;
行始终将temp
设置为导致循环迭代的第二个元素永远。它应该是temp = temp->ptr;
。 (struct node **) malloc(1*sizeof(struct node));
不正确,应更改为(struct node* )malloc(sizeof(结构节点));
.任何数字乘以1
保持不变。destroy
函数中的最后两条语句是错误的,必须删除以保留正确的功能。
push
中的 修改后的代码如下:
#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;
}
}
关于c - 指针和堆栈实现的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37626146/