2016-12-26 36 views
-1

リンクリストを作成しようとしていますが、何らかの理由で私の頭が正しく更新されません。ここで私が意図したとおりに動作していない私のコードの抜粋は以下のとおりです。構造体へのポインタを、関数によって返された構造体への別のポインタと同じに設定しますか?

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

node create_node(int data) { 
    node to_return = calloc(1, sizeof(struct node)); 
    to_return->data = data; 
    to_return->next = NULL; 
    return to_return; 
} 

int insert(int data, node head) { 
    if (head == NULL) { 
    head = create_node(data); 
    } 
    . 
    . 
    . 
    } 
    return 1; 
} 

int main(int argc, char **argv) { 

    node head = NULL; 
    insert(1, head); 

    printf("head->data: %d", head->data); 
} 

この例では、私は()を挿入して使用してリンクされたリストの最初のノードを作成しようとしています。しかし、私はSEG障害が発生しています。つまり、create_node()によって返されたto_returnノードポインタが、insert()のノードヘッドに正しく設定されていません。私はここで何が欠けていますか?

EDIT:私はダブルチェックをして、ヘッドがインサート()に正しくセットされています。何らかの理由で変更が持続しない

+0

私は申し訳ありませんが、私はまだです混乱している。 insert()のhead-> dataを印刷しようとしましたが、適切な値が得られましたが、プログラムが関数insert()を終了したときに変更が持続しない理由があります – YSA

+0

そのノードが構造体。 – YSA

+1

**決して** '' typedef'ポインタはありません! – Olaf

答えて

3

ノードへのポインタを渡します。

int insert(int data, node* head) { 
    if (*head == NULL) { 
    *head = create_node(data); 
    } 
    . 
    . 
    . 
    } 
    return 1; 
} 

int main(int argc, char **argv) { 

    node head = NULL; 
    insert(1, &head); 

    printf("head->data: %d", head->data); 
} 

(およびinsert関数の2番目のパラメータはタイプstruct node **で実際にあるので、ところでそのtypedefのは、本当に混乱しています)

2

CおよびC++では、すべての関数パラメータは、明示的に参照されない限り、値によって渡されます。これにはポインタパラメータが含まれます。

関数insertは、NULLポインタの場合、最初のパラメータを変更しようとしています。ポインタに加えられた変更は関数から渡されないので、これは機能しません。 headを変更するには、またはnode& head(C++)をinsert関数に渡す必要があります。

関連する問題