2012-04-25 4 views
0

私は3つのファイルを持っています:stack2.h、stack2.c、main.cリンクされたリストを使用してスタックを実装するための2つの警告コード

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に何が含まれているかと、私はしません負担となりますが含まれています。本質的には、正しいライブラリとファイルを含み、単純にいくつかの値をプッシュしてポップします。私はこれらの警告を得る:この2行の

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

+5

'struct node'と' struct Node'は同じものではありません。 – geekosaur

+0

@geekosaur:2つのコピーアンドペーストとその説明があり、そこにはきちんとした答えがあります... – sarnold

答えて

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

あなたはstruct nodeを宣言したが、その中にstruct Node *を使用します。 Cは大文字と小文字を区別するため、ポインタはではなく、と同じ型です。 Cは、おそらく残念なことに、それらを逆参照しない限り(これは「不透明ポインタ」で使用されるイディオムです)、不明なstruct型のポインタを操作することを喜んで行います。そのため、ポインタ型の不一致が唯一の警告です。

+0

ああ!私は誤って "struct Node * next"を書いていました。 "Node * next"を意味していました。) "struct Node"が存在しないという事実についてコンパイラが不平を言っても驚いています。私はそれが拾うべきだったような気がする! ありがとうございます! – user1357355

関連する問題