2017-02-12 5 views
0

私の作成に何か問題があると思います。リンクリストで作成したデータを表示するにはどうすればよいですか?

void add(N *p) { 
    N *current, *start; 
    current = malloc(sizeof(p)); 
    scanf("%d", &current->data); 
    current->next = NULL; 

    if (p == NULL) { 
     p = current; 
     start = current; 
    } else { 
     start->next = current; 
     start = current; 
    } 
} 

私はdisplay()が正しいと思います。

void display(N *p) { 
    N *current; 
    current = p; 
    while (current != NULL) { 
     printf("\n%d", current->data); 
     current = current->next; 
    } 
} 
+0

あなたは何のエラーを得るのですか?希望の出力は何ですか?あなたの現在の出力は何ですか? – Yousaf

+0

何も出力しません... 1を入力するとプログラムが終了します。0 – Willy

+0

私はそのmalloc(sizeof(N))を試しました。出力は同じです。 – Willy

答えて

0

問題があります。

  • 機能add()は、メモリの正しい量を割り当てません。このメソッドを使用します。

    current = malloc(sizeof(*current)); 
    
  • あなたがリストに新しく割り当てられたオブジェクトを挿入する方法が動作しません:あなたはローカルスコープを持つ引数であるpを、修正、あなたはまた、ローカルスコープを持つstartを設定します。呼び出し側スコープのポインタは、副作用がありません。N

  • あなたのdisplay関数は正しいですが、最初にではなく出力の最後に改行を追加することをお勧めします。ここで

が良いAPIと更新されたバージョンです:

int add(N **headp) { 
    N *current = calloc(sizeof(*current)); 
    if (current == NULL) { 
     fprintf(stderr, "cannot allocate memory for new object\n"); 
     return -1; 
    } 
    if (scanf("%d", &current->data) != 1) { 
     fprintf(stderr, "cannot read value for new object\n"); 
     return -2; 
    } 
    current->next = *headp; 
    *headp = current; 
    return 0; 
} 

void display(const N *list) { 
    for (const N *p = list; p != NULL; p = p->next) { 
     printf("%d\n", p->data); 
    } 
} 

add機能は、発信者からこのように使用されます。

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

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

int main(void) { 
    N *list = NULL; 

    for (i = 0; i < 10; i++) { 
     if (add(&list)) 
      break; 
    } 
    display(list); 
    return 0; 
} 
+0

ありがとうございます。 .... – Willy

+0

私はちょうど見つけたヘッド=追加(頭);できます。ヒントをありがとう。 int main(){ N * head = NULL; head = add(head); ディスプレイ(ヘッド); return 0; } – Willy

+0

@Willy: 'head = add(head);'は、エラーの検出を提供する 'add(&head)'ほど強力ではありません。 'add(&head)'は成功を示すブール値を返すか、エラーコードを示す 'int'を返すことができます。この可能性を反映するようにコードを更新しました。 – chqrlie

1

あなたmalloc(sizeof(p))だけポインタのための十分なスペースを返します。代わりにmalloc(sizeof(N))が必要です。

また、add()の末尾にスローする代わりに、pの新しい値を返す必要があります。 (あなたのstartは、同様の問題があり、あなたのリンクリストの先頭であることを一つ選ぶ。)

+0

大丈夫です。私の展示はいかがですか?何か間違っていますか? – Willy

+0

@Willyあなたの 'display()'はうまく見えます。あなたの 'add()'には問題があります。 – chrisaycock

関連する問題