用C将项目推入堆栈

时间:2017-01-30 22:40:25

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

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

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!

我做错了什么,请帮忙

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

这是另一种解决方案:   //您可以假设函数调用传递指向堆栈顶部节点的指针地址和整数。离子:例如推(&amp; 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);
   } 
}

}

答案 2 :(得分:-1)

我用这种方式读你的代码

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;

EDIT2:

忘了解释,

你写了

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!

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