我的问题是基于指针,我想知道如何在函数printStack()中传递堆栈顶部,以便我可以访问堆栈的所有节点。我在数组中存储元素,同时推入堆栈。< / p>
这个代码在执行时我没有打印任何内容。
这里是我的代码
#include<stdio.h>
struct stack
{
int data;
struct stack *next;
};
typedef struct stack s;
s *top=NULL,*neu;
//push data into stack
void push(int data)
{
neu = (s *)malloc(sizeof(s));
neu->data= data;
neu->next = NULL;
if(!top)
{
neu=top;
}
else
{
neu->next = top;
top = neu;
}
}
//pop data and move top to top->next
void pop()
{
s *temp = top;
top = top->next;
free(top);
}
//print data present in stack
void printStack(s *top)
{
while(top)
{
printf("%d ",top->data);
pop();
}
}
int main()
{
int i=0,A[3],d;
for(i=0;i<3;i++)
{
scanf("%d",&A[i]);
push(A[i]);
}
printStack(top);
return 0;
}
答案 0 :(得分:1)
这里有一个简单的错误:
void pop()
{
s *temp = top;
top = top->next;
free(top);
}
而不是释放Top,你可能意味着free(temp);
此外,请考虑尽早养成良好习惯。不要将malloc()
归还给C.而且,不要认为malloc()
有效;检查它是否返回NULL以外的其他内容。
答案 1 :(得分:1)
所以有3个问题: -
您在top
释放temp
而不是pop()
。
您正在更改为printStack
中传递的本地变量。
只需将此printSack();
称为功能签名void printStack()
。
同样在创建节点时
if(!top)
{
neu=top;
^^^^
}
这将是top=neu;
使用调试器。了解如何使用它。
不要投放malloc
的返回值。
检查malloc
和scanf
的返回值。
您使用了太多全局变量 - 涉及大量全局变量的代码往往难以调试。你可以在这里轻松避免它。
例如: -
if( scanf("%d",&A[i])!= 1){
fprintf(stderr,"Error in input");
exit(EXIT_FAILURE);
}
如果是malloc
neu = malloc(sizeof(s));
if(neu == NULL ){
perror("Malloc failed");
exit(EXIT_FAILURE);
}
主要的是 - 你的代码基本上什么也没做。创建那些与数据紧密相连的方法甚至是无用的。我们使用函数使代码变为模块化,并且每个函数都应该是可重用的。(至少在某种程度上)。在这里你错过了那部分。