【问题标题】:passing top pointer of stack as argument将栈顶指针作为参数传递
【发布时间】:2018-01-02 17:07:04
【问题描述】:

我的问题是基于指针,我想知道如何在函数 printStack() 中传递堆栈顶部,以便我可以访问堆栈的所有节点。我将元素存储在数组中并同时推入堆栈。

在这段代码中,当我执行它时不会打印任何内容。

这是我的代码

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

【问题讨论】:

  • 除非您的编辑修复了您最初在代码中出现的拼写错误(为什么首选复制和粘贴),否则您不应根据给出的答案编辑您的代码来修复它。这会通过改变给出答案的上下文来混淆这个问题的未来读者。如果其中一个答案解决了您的问题,请保留您的代码并接受该答案。

标签: c pointers data-structures


【解决方案1】:

所以有3个问题:-

  • 您正在释放 top 而不是 pop() 中的 temp

  • 您正在更改为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);
}

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

【讨论】:

    【解决方案2】:

    这里有一个简单的错误:

    void pop()
    {
        s *temp = top;
        top = top->next;
        free(top);
    }
    

    您可能不是想释放 Top,而是free(temp);

    此外,考虑尽早养成良好的习惯。不要在 C 中转换 malloc() 的返回值。此外,不要假设 malloc() 有效;检查它是否返回 NULL 以外的值。

    【讨论】:

    • 感谢@David Hoelzer,我一直在寻找我的指针中的一些问题。
    • 任何好习惯列表都应该包括不使用 expletive filters 全局变量作为首要项。
    • @n.m.我不反对(完全),但我发现一次用太多东西压倒人们并不是很好。
    猜你喜欢
    • 2012-01-24
    • 2018-08-19
    • 1970-01-01
    • 2018-05-14
    • 2020-11-08
    • 2012-06-05
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多