2013-02-21 141 views
0

我正在使用鏈接列表創建一個新堆棧。我不知道爲什麼TOP指針總是指向NULL。我認爲我沒有正確設置頂部指針,或者它在函數外部不可見。堆棧TOP指針始終爲空

#include "stdio.h" 
#include "stdlib.h" 

typedef struct StackItem 
{ 
     int itemValue; 
     struct StackItem* NextItemPtr; 
}StackItem; 

typedef struct Stack 
{ 
    struct StackItem *TOP; 
}Stack; 

int IsStackEmpty(StackItem *TOP) 
{ 
    if(TOP==NULL) 
     return 1; 

} 

void pushItem(StackItem *headPtr,int n) 
{ 
    StackItem* Newnode; 
    Newnode=(StackItem*)malloc(sizeof(StackItem)); 
    Newnode->itemValue=n; 
    printf("Checking Head TOP %d\n\n",IsStackEmpty(headPtr)); //Everytime it is giving 1 
    Newnode->NextItemPtr=IsStackEmpty(headPtr)?NULL:headPtr; 
    headPtr=Newnode; 
} 


int main() 
{ 
    Stack* stackptr; 
    stackptr=(Stack*)malloc(sizeof(Stack)); 
    stackptr->TOP=NULL; 
    pushItem(stackptr->TOP,3); 
    pushItem(stackptr->TOP,6); 
    return 0; 

} 
+1

您正在傳遞您的TOP指針。你應該通過地址傳遞它。 – WhozCraig 2013-02-21 17:15:14

+0

爲什麼人們在嘗試編寫操作系統之前沒有學習C ... – 2013-02-21 17:17:36

+1

我不敢相信這已經持續了10分鐘,沒有人評論malloc-cast。 Durp ... nm。或者系統包含開引號('#include「stdio.h」')而不是尖括號('#include ')。 – WhozCraig 2013-02-21 17:25:59

回答

3

這種說法無助呼叫者:

headPtr=Newnode; 

您可以:

  • 傳遞一個雙指針,並分配到*headPtr
  • 返回Newnode,而不是分配給headPtr

C FAQ解釋了這個問題。

+0

@WhozCraig我認爲「這句話對於調用者**沒有任何作用**」已經足夠清楚了。 – 2013-02-21 17:17:05

+0

@ H2CO3這將是5分鐘沒有歷史。最初的帖子沒有「給來電者」,但是現在它已經開始了,我放棄了評論。 – WhozCraig 2013-02-21 17:18:01

+0

他也可以通過堆棧本身而不是堆棧項目。 – corsiKa 2013-02-21 17:18:34

1
headPtr = Newnode; 

由於headPtr是函數的參數,它是按值傳遞。在函數內修改它對調用者沒有任何影響。您需要傳遞一個指針並通過指針修改它:

void pushItem(StackItem **headPtr, int n) 
*headPtr = NewNode; 
+0

+1無需評論。正確答案。 = P – WhozCraig 2013-02-21 17:25:17

+0

@WhozCraig謝謝:) – 2013-02-21 17:25:38