2011-06-30 27 views
4

私はCでポインタの知識を蓄積する方法としてリンクリストを使用しようとしています。そこで小さな例を書きましたが、コンパイルするとエラーが発生しています。リンクされたリストは私の脳を曇らせています。私はこれをどのようにしなければならないのですか?

In function 'append_node': 
error: request for member ‘next’ in something not a structure or union 

構造体にアクセスする(または渡す)適切な方法は何ですか?

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

struct node { 
    int val; 
    struct node *next; 
}; 

static int append_node(int val, struct node **head) { 
    struct node *new_node; 

    new_node = (struct node *) malloc(sizeof(struct node)); 
    new_node->val = val; 
    new_node->next = NULL 

    *(head)->next = new; 

    return 0; 
} 

int main() { 
    int i; 
    struct node *head; 
    struct node *curr; 

    head = NULL; 
    curr = (struct node *) malloc(sizeof(struct node)); 

    for(i = 1; i <= 10; i++) { 
     append_node(i, &curr); 
     head = curr; 
    } 

    curr = head; 
    while(curr) { 
     printf("%d\n", curr->val); 
     curr = curr->next ; 
    } 

    return 0; 
} 

+0

これまでに返信したすべての人に:1)新しいノードへのポインタは 'new_node'と呼ばれ、' new'ではありません。 2)新しいノードを '(* head) - > next'に代入すると、リストの残りの部分が削除されます(リークされます)。新しいノードを新しい頭にするというアイディアです。関数はノードへの_double_ポインタです – Rom

答えて

3

この行でエラーが発生していると思われますか?あなたはそれを参照解除ポインターを取得するときheadは、ポインタへのポインタであるので

(*head)->next = new; 

*(head)->next = new; 

私はあなたが1つの些細な変更を加える必要があると思います。 ->nextは、そのポインタ上で動作します。

3

2つの問題:

あり欠落している;

new->next = NULL 

の末尾にあると

(*head)->next = new; 
1

*(head)->next = new; 

を変更する代わりに、これを試してみてください:

(*head)->next = new_node; 

電源を入れ**head*headにして、その上にメンバーを呼び出します。

関連する問題