我是 C 的新手,正在尝试使用链表实现堆栈。当前设置堆栈,到目前为止一切正常。当我尝试将新节点推送到列表时,问题就出现了。 我目前有
在 main()
中,push()
被调用:
push(&(s.head), 'r');
函数push
是:
void push(StackNodePtr *topPtr, char value){
printf("topPtr value %c", (*topPtr)->data); // - Is currently 'p'
StackNodePtr sNP;
sNP = malloc(Node_Size);
sNP->data = value; // - Is currently 'r'
sNP->nextPtr = *topPtr;
printf("\nsNP value - %c", sNP->nextPtr->data); // Prints p... cool
topPtr = &sNP; // Just assigned it???
printf("\ntopPtr at end of push = %c", (*topPtr)->data); // prints r... cool
// WHY YOU NO REFERENCE sNP LATER!?!?
}
同时,回到主界面:
printf("\non the stack...%c", stackTop(s.head)); // prints 'p'
它似乎在推送中工作正常,但是我在 topPtr
指向的节点和 topPtr
的值上调用了 printf()
过去常常打印出来(在本例中为“p”)。就我所进行的狩猎而言,它看起来和感觉都是正确的,我不知道我错过了什么。
会不会是我做topPtr = &sNP;
的地方?
任何朝正确方向的“插入”都是好的插入...
最佳答案
topPtr = &sNP; // Just assigned it???
这个赋值在函数外是不可见的。 topPtr
按值传递,即制作它的副本并将其传递给函数。因此,分配不同的值只会修改副本;原始参数仍然指向旧的内存位置。
如果您需要以这种方式修改参数,则需要另一个间接级别,即采用 StackNodePtr**
。
此外,我假设 StackNodePtr
是 StackNode*
的 typedef
。我说得对吗? typedef
这个指针类型有充分的理由吗?通常它只会使事情复杂化。我会推荐 typedef
仅当指针类型确实是不透明类型时(即 Windows 上的 HANDLE
)。
关于C链表栈和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10573934/