2017-05-10 5 views
0

プログラムはリストの値を意図したとおりに出力しません。それはメモリアドレスであるべきものを印刷します。私は解決策を見つけるのを試みてきたが、これまで役に立たなかった。私はいくつかの助けに感謝します。関数の引数としてリンクされたリスト

#include <stdio.h> 

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

void print_list(node_t * head); 

void main() 
{ 
    node_t * head = NULL; 
    head = malloc(sizeof(node_t)); 
    if (head == NULL) 
     return 1; 
    head->val = 1; 
    head->next = malloc(sizeof(node_t)); 
    head->next->val = 2; 
    head->next->next = malloc(sizeof(node_t)); 
    head->next->next->val = 3; 
    head->next->next->next = malloc(sizeof(node_t)); 
    head->next->next->next->val = 18; 
    head->next->next->next->next = NULL; 

    print_list(&head); 
    system("pause"); 
} 

void print_list(node_t * head) { 
    node_t * current = head; 

    while (current != NULL) { 
     printf("%d\n", current->val); 
     current = current->next; 
    } 
} 

上記の問題は入力のおかげで解決しました。どうもありがとうございました!しかし、新しい問題が発生しました。リストに新しい要素を追加したいのですが、私はいくつかのコード行を追加しました。残念ながら、望む結果は印刷されず、プログラムは突然終了します。あなたの関数void print_list(node_t * head);はタイプnode_t *のパラメータを期待していますがタイプnode_t **のパラメータを渡している

head->next->next->next->next = malloc(sizeof(node_t)); 
    head->next->next->next->next->val = 5556; 
    head->next->next->next->next->next = NULL; 
    node_t * current = head; 
    while (current->next != NULL) 
    { 
     current = current->next; 
    } 
    current->next = malloc(sizeof(node_t)); 
    current->next->val = 32; 
    current->next->next = NULL; 
    printf("%d\n", current->next->val); 
    system("pause"); 
} 
+4

関数 'print_list'は' node_t * '型の引数を期待していますが、' node_t ** 'を渡しています。 &head); 'を' print_list(head);に置き換えてください –

+0

すべてのコンパイラの警告を有効にし、警告をエラーとして扱います –

+0

ああ、それは単純でした。私には大変なことがあります。 – Leet

答えて

5

注:ここでは、新しいコードです。 &headはタイプnode_t **でありながらprint_list(head);

head

変更はprint_list(&head);タイプnode_t *です。

0

print_list(&head)機能をprint_list(head)に変更してください。

print_list(&head); 

print_list(head); 
に機能 void print_list(node_t * head)は、単一の参照ポインタを受け入れます。しかし、 print_list関数へのあなたの受け渡し **head

0

print_list関数はprint_list(&head);を使用して呼び出されますが、headはすでにノードへのポインタです。

これは、実際にprint_list関数がノードへのポインタへのポインタ、つまりnode_t **を受け取っていることを意味します。したがって、ポインタの値を印刷しようとすると、メモリアドレスのように見えるものが表示されます。これを修正するには、リストの先頭をそのまま使用してください。print_list(head);

関連する問題