传递堆栈的顶部指针作为参数

时间:2018-01-02 17:07:05

标签: c pointers data-structures

我的问题是基于指针,我想知道如何在函数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;
}

2 个答案:

答案 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的返回值。

  • 检查mallocscanf的返回值。

  • 您使用了太多全局变量 - 涉及大量全局变量的代码往往难以调试。你可以在这里轻松避免它。

例如: -

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);
}

主要的是 - 你的代码基本上什么也没做。创建那些与数据紧密相连的方法甚至是无用的。我们使用函数使代码变为模块化,并且每个函数都应该是可重用的。(至少在某种程度上)。在这里你错过了那部分。