2012-01-29 3 views
0

EDIT *(8:14 PM) - 申し訳ありませんコードを修正し、代わりにこの方法を使用してより簡単に理解できるようにしました。Cでリンクリストの最後に項目をキャスト

リンクリストの最後に追加するときに構造体を正しくキャストする方法がわかりません。このコードをコンパイルすると、最後の行でキャスト警告が表示されます。これは私のコードの残りの部分が正しく機能しない理由です。例えば

: - ノードであることをmalloc関数に

  • 修正wordNodeのすべてのoccuranceを使用するために必要な -

    #include <stdlib.h> 
    
    typedef struct { 
        int data; 
        struct node *next; 
    } node; 
    
    node *HEAD = NULL; 
    
    node *addNode(int num) 
    { 
        if (HEAD == NULL) { 
         HEAD = (node *)malloc(sizeof(node)); 
         HEAD->next = NULL; 
         HEAD->data = num; 
        } 
        else { 
         node *newNode; 
         newNode = (node *)malloc(sizeof(node)); 
         newNode->data = num; 
         newNode->next = NULL; 
    
         node *iter; 
         iter = (node *)malloc(sizeof(node)); 
         iter = (node *)HEAD; 
    
         while(iter->next != NULL) 
          iter = (node *)iter->next; 
    
         iter->next = newNode; //warning : warning: assignment from incompatible pointer type 
        } 
        return HEAD; 
    } 
    
  • +3

    'wordNode'はどこに定義されていますか? –

    +0

    また、少なくとも 'iter'のための' malloc() 'メモリのようにメモリリークがあり、それに' HEAD'を割り当てて、 'malloc'だけメモリをリークします。 (そして、上記のコードがあなたの質問と一致しないという事実を無視しています。実際には、リンクされたリストの先頭を作成する以外は、実際にはaynthingを行いません) –

    +0

    リンクされたリストの末尾にキャスティングが他の場所と異なると思われるのはなぜですか? –

    答えて

    1
    • STDLIB.Hが含まれていることを確認しますwordNodeは、あなたのプログラムで定義されていない
    • 構造体を作成し、両方とも自己参照構造体の名前付きノード - 標準トリックを作成する

    警告去る。

    #include <stdlib.h> 
    struct node{ 
        int data; 
        struct node *next; 
    }; 
    typedef struct node node; 
    
    
    node *HEAD = NULL; 
    
    int main(int argc, char*argv[]) { 
    
        int x = 1; 
        int y = 2; 
    
        if(HEAD == NULL) 
        { 
         HEAD = (node *)malloc(sizeof(node)); 
         HEAD->next = NULL; 
         HEAD->data = x; 
        } 
        else 
        { 
         node *newNode; 
         newNode = (node *)malloc(sizeof(node)); 
         newNode->data = y; 
         newNode->next = NULL; 
    
         node *iter; 
         iter = (node *)malloc(sizeof(node)); 
         iter = (node *)HEAD; 
    
         while(iter->next != NULL) 
        iter = (node *)iter->next; 
    
         iter->next = newNode; //warning : warning: assignment from incompatible pointer type 
         return 0; 
        } 
    } 
    
    0

    問題は、未定義の構造に「次の」点を構造体が完全に定義される前に、「構造体ノード」へのポインタであると、「次」を宣言、そうすることです。 "typedef struct {"を "typedef struct node {"に変更すると、そのエラーはなくなります。

    0

    コードには多くの問題があります。一つ目はmallocの戻り値をキャストし、不適切なあなたには、いくつかのスペースを割り当てることがしたい種類の大きさに言及することになります。

    HEAD = (node *)malloc(sizeof(node));

    HEAD = malloc(sizeof(*HEAD))

    に置き換える必要があります

    void*から他のタイプへの変換は常に定義され、Cに暗黙的に記述されているため、必要なキャストに関する警告は表示されません。 sizeof(*HEAD)を指定すると、コンパイラはコンパイル時にHEADの型を自動的に選択し、型の変更が必要な作業を減らします。

    また、一部のコンパイラでは、匿名構造(名前が宣言されていない構造)が好きではないことに注意してください。したがって、コード

    typedef struct{ 
    int data; 
    struct node *next; 
    } node; 
    

    nodeと呼ばれるタイプにtypedefed _nodeと呼ばれる構造を、宣言し

    typedef struct _node { 
    int data; 
    struct _node *next; 
    } node; 
    

    に置き換える必要があります。また、循環参照を修正します。

    さらに、mallocには、iterのためのスペースは必要ありません。

    関連する問題