2016-12-10 2 views
0

それをデバッグすると、Lがnullptrであることがわかります。なぜリストが正しく返されないのか分かりません。リンクされたリスト関数の戻り値でポインタが発生しました。私は理解できません

これらは、構造体(私はリストとノードを使用する必要があります)、次のとおりです。

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

struct List { 
    node *head; 
}; 

リストを作成する関数:BuildListため

void BuildList(list *L) { 
    node *head = NULL, *temp = head; 
    int num; 
    printf("Input list's elements: \n"); 
    do { 
     scanf("%d", &num); 
     if (num != -1) { 
      if (head == NULL) { 
       head = BuildNode(num); 
       temp = head; 
      } 
      else { 
       temp->next = BuildNode(num); 
       temp = temp->next; 
      } 
     } 

    } while (num != -1); 

    L = (list *) malloc(sizeof(list)); 
    L->head = head; 
} 

補助機能:

node* BuildNode(int num1) { 
    node *node1 = (node *)malloc(sizeof(node)); 

    node1->data = num1; 
    node1->next = NULL; 

    return node1; 
} 

印刷機能:

void PrintList(list *L) { 
    node *head; 
    head = L->head; 
    printf("The list's elements are: "); 

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

プログラムは "head = L-> head;"に失敗します。それがnullptrだと主張するPrintListで。それは、最終的に、BuildList内の動的な割り当てであることは明らかです。メインからの呼び出しは、

list *head = NULL; 
BuildList(&head); 
PrintList(head); 

です。 PrintList(&頭);それは失敗することなく、空のリストを印刷します。

+0

あなたはどこに頭を割り当てていますか? – stark

+0

先頭に?ビルドリストまたはメイン? BuildListの頭部はL. –

答えて

2

あなたが関数へのポインタを渡している:

BuildList(リスト*のL)は、関数の内部でそれを割り当てているとき、あなたはこのポインタを持っていないことを意味します

スタックの上にあるため、この関数の外部にあります。あなたが通りリットルを一覧表示するには、ポインタのアドレスを送信する必要がある

ここ
void BuildList(list **L) { 
    node *head = NULL, *temp = head; 
    ..... 
    *L = malloc(sizeof(list)); 
    (*L)->head = head; 
} 

list *head = NULL; 
BuildList(&head); 
PrintList(head); 
+0

としてありがとう。それは元気だった。 –

+0

@גלזיגלרあなたの問題を本当に解決したら、この回答に合格とマークするのを忘れないでください。 –

0

list *head = malloc(sizeof(list)); /* It's a good habit to not cast malloc function */ 
BuildList(head); /* Remember to remove malloc from inside of build list */ 
PrintList(head); 

または関数へのダブルポインタを渡す:何あなたができることのように、この関数の外にリストを割り当てる、のいずれかであります関数の中で行われたすべての変更をリストlに影響させたいので、これは関数のリストのアドレスを持っていなければ実現できないので、リストの変更はメモリ内で永久に変更されます!

ので、uがちょうど

void BuildList(list **lreference) 

を使用してBuildList関数を呼び出している間だけのリストへのポインタのアドレスを送信する必要があります。

list *l; 
l = malloc(sizeof(list)); 
BuildFirst(&l); 
関連する問題