2017-05-11 4 views
1

最後のprintf呼び出し(printf( "%d \ n"、current-> val);)は実行されません。最初のprintf関数の結果が表示された後、 "program.exeが動作を停止しました"というエラーが表示されます。私はいくつかの助けに感謝します。リンクされたリストによるメモリ操作の不一致

#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 = 3; 
    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; 

    print_list(head); 

    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", current->next->val); 
    system("pause"); 
} 

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

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

print_listが正常に機能しますか? print_listの時刻が呼び出されるので、最後のノードはnullを指しません。したがって、印刷ロジックがおそらく失敗するでしょう。 –

+0

ノードの挿入と削除に関数を使用します。そうすることで、リンクされたリストを管理することができます。 – sjsam

+0

ヒントありがとう、みんな!問題が解決しました。 – Leet

答えて

2

これはうまくいかないだろう。

head->next->next->next = malloc(sizeof(node_t)); 
head->next->next->next->val = 18; 

print_list(head); 

あなたはNULLにhead->next->next->next->nextを初期化することはありません。代わりにcallocを使用するか、明示的に値をNULLに設定してください。新しいノードを作成する関数を作成して、初期化することを忘れないようにしてください。さらに良いことに、ノードを挿入する関数を記述してください。

何、このようなものについて:

node_t * create_node(int val) { 
    node_t *node = malloc(sizeof(*node)); 
    if(node) { 
     node->val = val; 
     node->next = NULL; 
    } 
    return node; 
} 

node_t * insert_value(node_t *list, int value) { 
    node_t *new_node = create_node(value); 
    if(!new_node) { 
     return list; 
    } else if(list) { 
     new_node->next = list->next; 
     list->next = new_node; 
    } 
    return new_node; 
} 

その後、次のことができます。リストの

node_t *head = insert_value(NULL, 3); 
node_t *tail = head; 
tail = insert_value(tail, 2); 
tail = insert_value(tail, 3); 
tail = insert_value(tail, 18); 
print_list(head); 

一般的なアプローチは、あなたがプリントアウトしたことがないダミーヘッドノードを、使用することです。それはあなたのリストの始まりであるnextポインタを含んでいて、値を無視します。これを行った場合は、そのinsert_value関数を使用して、リストの最初の要素の前に値を挿入することもできます。 head常にがあなたのリスト全体を管理し、それを変更する心配はありません。

+0

ありがとう!たとえそれが簡単だったとしても、それがわかっていれば、それを理解するのに時間がかかりすぎてしまいました。 – Leet

関連する問題