这是我的推送函数,它接受一个堆栈和一个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!我做错了什么,请帮帮我
发布于 2017-01-31 06:44:31
您没有为节点分配内存。添加内存分配。
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。
发布于 2017-01-31 06:54:41
下面是另一种解决方案://您可以假设函数调用传递了指向堆栈顶部节点的指针的: address和一个整数。ion:例如push (&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);
}
}}
发布于 2017-01-31 06:49:21
我是这样读你的代码的
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;你的代码已经处理了新的节点,并引用了当前的top作为下一个节点,然后将新的top作为top,这意味着当你调用堆栈时,起始节点是你放在堆栈上的最后一个节点,它引用它自己作为下一个节点,因此输出如下:
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!我的代码将其更改为,如果您将新节点放在堆栈上,则在定义新节点之前,新节点将被定义为当前顶级节点的下一个节点。
https://stackoverflow.com/questions/41946691
复制相似问题