【问题标题】:C linked list stack and pointersC链表堆栈和指针
【发布时间】:2012-05-13 17:54:26
【问题描述】:

我是 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'

它似乎在 push 中工作正常,但是我在 topPtr 指向的节点上调用 printf(),并改为打印出 topPtr 的值(在本例中为“p”)。就我所做的狩猎而言,它看起来和感觉都是正确的,我不知道我错过了什么。

可能是我在topPtr = &sNP;做过的地方吗?

任何朝着正确方向的“推动”都是好的推动……

【问题讨论】:

    标签: c pointers reference stack


    【解决方案1】:
    topPtr = &sNP;      // Just assigned it???
    

    此分配在函数之外不可见。 topPtr 是按值传递的,即制作它的副本并将其传递给函数。因此,分配不同的值只会修改副本;原始参数仍然指向旧的内存位置。

    如果您需要以这种方式修改参数,则需要另一个间接级别,即采用StackNodePtr**

    另外,我假设StackNodePtrtypedef 对应StackNode*。我说得对吗? typedef 这个指针类型有充分的理由吗?通常它只会使事情复杂化。我会建议 typedef' 仅在指针类型确实是不透明类型(即 Windows 上的 HANDLE)时才使用它。

    【讨论】:

    • 是的,您对 typedef 的看法是正确的,感谢您解释它为什么不起作用。我有一种感觉,这与能见度有关,但至于原因是什么,尚不清楚。至于我为什么要这样做,这正是对我的要求,但现在我应该能够处理剩下的事情了。谢谢!
    【解决方案2】:

    应该是

      *topPtr = sNP;
    

    这样,调用者将指针传递给原始头,即成为新头的下一个头,被正确“覆盖”,并且调用者拥有指向新头的正确指针。

    【讨论】:

    • 我几乎可以肯定,我在玩它的最后几个小时内尝试过,而且效果也很好。谢谢!
    【解决方案3】:
    topPtr = &sNP;      // Just assigned it???
    

    不,你没有。您将值分配给指针的本地副本。您更改topPtr 本身的值,它不会向外。相反,您应该写入它指向的位置:

    *topPtr = sNP;
    

    【讨论】:

      【解决方案4】:

      它看起来像错误在这里: topPtr = &sNP; // 刚刚赋值???

      而不是 push 返回 void。 更改它以返回堆栈的新头部。 返回sNp;

      【讨论】:

        【解决方案5】:

        您的函数 push 正在修改指针 topPtr。由于 C 是按值传递的,因此头部作为值传递,传递的副本在推送中被修改。因此,要修改指针本身,您需要将指针传递给指针。此外,需要更正函数 push() 签名以传递指向指针的指针。最后需要修正push中的topPtr赋值,如代码sn-p所示。

        进行以下更改:

        push(&(s.head), 'r'); // pass pointer to pointer, assuming head is pointer, it should be fine
        
        void push(StackNodePtr **topPtr, char value){  // make first argument pointer to pointer. 
        
        StackNodePtr sNP;
        sNP = malloc(Node_Size);
        sNP->data = value;                       
        sNP->nextPtr = *topPtr; 
        
        *topPtr = &sNP;     <------*topPtr needs to be assigned. 
        }
        

        【讨论】:

          猜你喜欢
          • 2016-08-18
          • 2013-04-28
          • 2021-09-17
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          • 2013-01-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多