首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用C语言将项目推送到堆栈中

使用C语言将项目推送到堆栈中
EN

Stack Overflow用户
提问于 2017-01-31 06:40:25
回答 3查看 1.2K关注 0票数 1

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

代码语言:javascript
运行
复制
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项重写为我运行的参数。

例如:

代码语言:javascript
运行
复制
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!

我做错了什么,请帮帮我

EN

回答 3

Stack Overflow用户

发布于 2017-01-31 06:44:31

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

代码语言:javascript
运行
复制
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;
}

或者,您可以添加对成功分配的检查。

代码语言:javascript
运行
复制
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。

票数 3
EN

Stack Overflow用户

发布于 2017-01-31 06:54:41

下面是另一种解决方案://您可以假设函数调用传递了指向堆栈顶部节点的指针的: address和一个整数。ion:例如push (&stackpointer,5) //将数据值为5的节点插入堆栈顶部

代码语言:javascript
运行
复制
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);
   } 
}

}

票数 0
EN

Stack Overflow用户

发布于 2017-01-31 06:49:21

我是这样读你的代码的

代码语言:javascript
运行
复制
struct StackNode *node;
node->nextNode = stk.top;
stk.top = node;

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

编辑:

代码语言:javascript
运行
复制
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;

Edit2:

如果你忘了解释,

你写了

代码语言:javascript
运行
复制
node->nextNode = top;

我将其替换为

代码语言:javascript
运行
复制
top->nextNode = node;

你的代码已经处理了新的节点,并引用了当前的top作为下一个节点,然后将新的top作为top,这意味着当你调用堆栈时,起始节点是你放在堆栈上的最后一个节点,它引用它自己作为下一个节点,因此输出如下:

代码语言:javascript
运行
复制
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!

我的代码将其更改为,如果您将新节点放在堆栈上,则在定义新节点之前,新节点将被定义为当前顶级节点的下一个节点。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41946691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档