【问题标题】:Push Item into Stack with C使用 C 将项目推入堆栈
【发布时间】:2017-06-16 05:55:32
【问题描述】:

这是我的 push 函数,它接受一个 stack 和一个 int a 参数,将 int 转换为 stackNode 的一部分并返回一个带有添加的新节点的新堆栈(StackNode 和 Stack 已经正确初始化):

Stack push(Stack stk,int data){
    struct StackNode *top = stk.top;
    struct StackNode *node;
    node->data = data;
    node->nextNode = top;
    stk.top = node;
    stk.count++;
    return stk;
}

我遇到的问题是,每次我运行 push 函数时,它都会将堆栈中的其他 StackNode 项作为我运行的参数覆盖。

例如:

push(stk, 3): stack output = 3 //good so far
push (stk, 4): stack output= 4 4//the correct output would be 3 4!
push(stk, 56): stack out put= 56 56 56 //what's going on!

我做错了什么,请帮忙

【问题讨论】:

    标签: c pointers stack push singly-linked-list


    【解决方案1】:

    您没有为节点分配内存。添加内存分配。

    Stack push(Stack stk,int data){
        struct StackNode *top = stk.top;
        struct StackNode *node = malloc( sizeof( struct StackNode ) );
    
        node->data = data;
        node->nextNode = top;
        stk.top = node;
        stk.count++;
    
        return stk;
    }
    

    或者您可以添加一个成功分配的检查。

    Stack push(Stack stk,int data){
        struct StackNode *top = stk.top;
        struct StackNode *node = malloc( sizeof( struct StackNode ) );
    
        if ( node != NULL )
        {
            node->data = data;
            node->nextNode = top;
            stk.top = node;
            stk.count++;
        }
    
        return stk;
    }
    

    我假设最初Stack 类型的对象的数据成员top 被初始化为NULL。

    【讨论】:

    • 非常感谢您对我的帮助! malloc 的事情奏效了!你能给我解释一下吗?我的教授教得不好
    • @ashadeka 您需要分配一个节点,您将在其中存储变量数据的值以及对下一个节点的引用。该列表是由指针连接的节点链。
    【解决方案2】:

    这是一个替代解决方案: //可以假设函数调用传递的是:一个指向栈顶节点的指针的地址,以及一个整数。离子:例如推 (&stackpointer, 5) // 插入一个数据值为 5 的节点到栈顶

    void fun(StackNodePtr *topPtr, int info)  
    { 
       StackNodePtr  *newPtr = malloc(sizeof(StackNode));
    
    
       if (newPtr != NULL) {           
          newPtr->data = info;           
         newPtr->nextPtr = *topPtr;
          *topPtr = newPtr;              
       }                     
       else { // no space available
          printf("%d not inserted. No memory available.\n", info);
       } 
    }
    

    }

    【讨论】:

    • CoderGirl94是不是意味着你是第94届Coder的女朋友?:)
    • 你是在调情我的问题
    【解决方案3】:

    我是这样读你的代码的

    struct StackNode *node;
    node->nextNode = stk.top;
    stk.top = node;
    

    看起来你添加了一个节点,但 next 上的引用总是在它自己上。

    编辑:

    struct StackNode *top = stk.top;
    struct StackNode *node = malloc(sizeof(struct StackNode));
    node->data = data;
    top->nextNode = node;
    stk.top = node;
    stk.count++;
    return stk;
    

    编辑2:

    抱歉忘记解释了,

    你写的

    node->nextNode = top;
    

    我替换为

    top->nextNode = node;
    

    您的代码已添加新节点并将当前顶部作为下一个节点,然后将新节点设置为顶部,这意味着当您调用堆栈时,开始节点是您最后放入堆栈的节点并将其自身称为下一个节点,因此输出如下:

    push(stk, 3): stack output = 3 //good so far
    push (stk, 4): stack output= 4 4//the correct output would be 3 4!
    push(stk, 56): stack out put= 56 56 56 //what's going on!
    

    我的代码将其更改为,如果您将新节点放入堆栈,则新节点将定义为当前顶部节点的下一个节点,然后再将新节点定义为新顶部节点。

    【讨论】:

    • 非常感谢您对我的帮助! malloc 的事情奏效了!你能给我解释一下吗?我的教授教得不好
    • top->nextNode = node; :销毁列表。
    猜你喜欢
    • 2023-04-03
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 2020-05-27
    相关资源
    最近更新 更多