2017-08-23 19 views
1

ここでは、リンクリストを使用して、非常に基本的なスタックを練習問題として実装しました。ここで、互換性のないポインタ型の警告が表示されるのはなぜですか?

私のプログラムには、次の3つのファイルがあります。

stack.h

#ifndef STACK_H 
#define STACK_H 

#include <stdio.h> 

struct Node {int content; struct node *next;}; 

void push(struct Node **node, int i); 
int pop(struct Node **node); 

#endif 

stack.c

#include <stdio.h> 
#include <stdlib.h> 
#include "stack.h" 

void push(struct Node **node, int i) 
{ 
    struct Node *new_node = malloc(sizeof(struct Node)); 

    if (!(*node)){ 
     (*new_node).content = i; 
     (*new_node).next = NULL; 
     *node = new_node; 

     return; 
    } 

    (*new_node).content = i; 
    (*new_node).next = (struct Node *)*node; 
    *node = new_node; 

    return; 
} 

int pop(struct Node **node) 
{ 
    if (*node == NULL){ 
     printf("Stack is empty\n"); 
     exit(EXIT_FAILURE); 
    } 

    struct Node *temp = (**node).next; 
    int i = (**node).content; 

    free(*node); 
    *node = temp; 

    return i; 
} 

main.cの

#include <stdio.h> 
#include "stack.h" 

struct Node *top = NULL; 

int main(void) 
{ 
    push(&top, 2); 
    printf("%d\n\n", pop(&top)); 
    return 0; 
} 

私はしかし、これをコンパイルすると、私が手次の警告

stack.c: In function ‘push’: 
stack.c:18:19: warning: assignment from incompatible pointer type 
    (*new_node).next = (struct Node *)*node; 
       ^
stack.c: In function ‘pop’: 
stack.c:31:22: warning: initialization from incompatible pointer type 
    struct Node *temp = (**node).next; 
         ^

プログラムは、これらの警告にもかかわらず、実行され、正しい出力が得られますが、私はまだこれが起こっている理由を理解したいと思いますけれども。

なぜこれらの警告が表示されますか?そして、どうすれば修正できますか? 2種類struct Nodeと互換性のないタイプですstruct nodeが宣言されている

struct Node {int content; struct node *next;}; 
     ^^^^      ^^^^ 

この宣言のタイプミスに

+2

「ノード」対「ノード」。ところで、エラーを回避するためにキャストを使用しないでください。 – interjay

+1

は、 'struct node * next;のように見えます。' struct Node * next; ' –

+1

'(* new_node).content'の代わりに 'new_node-> content'構文を使用してください。 –

答えて

2

機能に関しては、より簡単に定義することができます。例えば、関数pushは次のように宣言できます。

int push(struct Node **node, int i) 
{ 
    struct Node *new_node = malloc(sizeof(struct Node)); 
    int success = new_node != NULL; 

    if (success) 
    { 
     (*new_node).content = i; 
     (*new_node).next = *node; 
     *node = new_node; 
    } 

    return success; 
} 

また、スタックが空の場合は、プログラムを終了することをお勧めします。また、関数popを書き直す必要があります。

スタック関数は0を返す空である場合には、例えば機能は

int pop(struct Node **node, int *i); 

ように宣言することができます。それ以外の場合は1を返し、式の*iにノードの値を返します。

関連する問題