这是我的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!
我做错了什么,请帮忙
答案 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!
我的代码更改为,如果您在堆栈上放置一个新节点,则在将新节点定义为新顶级节点之前,将新节点定义为当前顶级节点的下一个节点。