2012-04-25 19 views
0

我有三個文件:stack2.h,stack2.c和main.c.代碼中的兩個警告意味着使用鏈表來實現堆棧

stack2.h包含此:

/* Define linked list structure */ 
typedef struct node { 
    int val; 
    struct Node *next; 
} Node, *pNode; 

/* Define stack structure */ 
typedef struct StackType { 
    pNode top; 
} Stack, *pStack; 

/* Declare functions */ 
pStack InitStack(); 

int IsEmpty(pStack pS); 
int Pop(pStack pS); 

void Push(pStack pS, int val); 
void KillStack(pStack pS); 

stack2.c包含

pStack InitStack() { 

    /* Declare variables */ 
    pStack pS = (pStack)malloc(sizeof(Stack)); 

    /* Set first node to NULL */ 
    pS -> top = NULL; 

    /* Return pointer to stack */ 
    return pS; 

} 

int IsEmpty(pStack pS) { 

    return (pS->top == NULL); 

} 

int Pop(pStack pS) { 

    /* Declare variables */ 
    int ret = 0; 
    pNode temp = NULL; 

    /* Check if stack is empty */ 
    if(IsEmpty(pS)) { 
     printf("[ERROR] Pop operation on an empty stack.\n"); 
     exit(1); 
    } 

    /* Find return value (last in) */ 
    ret = pS->top->val; 
    temp = pS->top; 

    /* Delete and kill node */ 
    pS->top = pS->top->next; 
    free(temp); 

    /* Return */ 
    return ret; 

} 

void Push(pStack pS, int val) { 

    /* Allocate memory for new node */ 
    pNode nnew = (pNode)malloc(sizeof(Node)); 

    /* Initiate node */ 
    nnew->next = pS->top; 
    nnew->val = val; 

    /* Set structure's top to new node */ 
    pS -> top = nnew; 

} 

我不會什麼main.c中包含的負擔你。實質上,它包含正確的庫和文件,並且簡單地推送和彈出一些值。我得到這些警告:

assignment from incompatible pointer types 

這兩行:

nnew->next = pS->top; 
    pS->top = pS->top->next; 

我有點困惑。 nnew是指向節點的指針,因此nnew-> next也是指向節點的指針。 pS是一個指向堆棧的指針,所以pS-> top也是指向一個節點的指針。我看不出這些是不相容的!

這是怎麼回事?謝謝!

+1

您應該指定生成錯誤的FILE和LINE NUMBER。 – abelenky 2012-04-25 23:12:30

+5

'struct node'和'struct Node'不是一回事。 – geekosaur 2012-04-25 23:12:37

+0

@geekosaur:兩個副本和粘貼,並說明,你有一個相當不錯的答案... – sarnold 2012-04-25 23:19:36

回答

4
typedef struct node { 
    int val; 
    struct Node *next; 
} Node, *pNode; 

您聲明struct node,但使用內它struct Node *; C區分大小寫,因此指針是而不是是同一類型。 C,也許不幸的是,只要你不取消引用它們(這是一個用於「不透明指針」的習慣用法),你可以很高興地讓你操縱指向未知類型的指針,所以你唯一的警告就是指針類型不匹配。

+0

啊!當我的意思是「Node * next」時,我意外地寫了「struct Node * next」:)我很驚訝編譯器沒有抱怨「struct Node」不存在。我覺得這是它應該拿起來的東西! 非常感謝! – user1357355 2012-04-26 01:37:58

相關問題