2013-02-21 140 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