2011-12-20 16 views
1

私は以下のプログラムを実行すると、予想通り "1:1、2:2"の代わりに "1:1"を出力します。誰がここで何が起こっているのか知っていますか?私は、単にグローバルヘッドを宣言するのではなく、できるだけ多くのリンクリストを作成できるような関数を作成しようとしています。リンクリストの作成と反復に関する問題?

struct Node { 
    int value; 
    char label[10]; 
    node *next; 
}; 
typedef struct Node node; 

int add(int data, char name[], node *head) { 
    node *newNode = (node *)malloc(sizeof(node)); 
    if (newNode != NULL) { 
    newNode->value = data; 
    strcpy(newNode->label, name); 
    newNode->next = head; 
    head = newNode; 
    } 
} 

node* createNewLinkedList(int d, char *name) { 
    node *newNode = (node *)malloc(sizeof(node)); 
    newNode->value = d; 
    strcpy(newNode->label, name); 
    newNode->next = NULL; 
    return newNode; 
} 

int main() { 
    node *head1 = createNewLinkedList(1, "one"); 
    add(2, "two", head1); 
    iterate(head1); 
} 
+1

'struct node'を表示できますか? – dasblinkenlight

答えて

6

ノードにポインタを渡しています。 Cのすべてのパラメータと同様に、値渡しであるため、head = newNode;は呼び出し側に影響しません。

node **headを受け入れるように署名を変更し、addの変更をmainに反映させるために間接レベルを追加する必要があります。 add(2, "two", &head1);

P.S.:あなたはaddメソッドに&head1に合格する必要があります。もちろん、

int add(int data, char name[], node **head) { 
    node *newNode = (node *)malloc(sizeof(node)); 
    if (newNode != NULL) { 
     newNode->value = data; 
     strcpy(newNode->label, name); 
     newNode->next = *head; 
     *head = newNode; 
    } 
} 

リストの先頭に{2、 "two"}を追加すると、出力は「2:2,1:1」になります。

+2

これは[ideone](http://ideone.com/M7LWI)でこれを実証するバージョンです。 –

5

head = newNode;は期待したことを行いません。

ヘッドはここで値渡しです。それについて考える。

2

addでは、新しいノードをリストの最後に接続していないため、実際のリストから完全に切り離された新しいノードが作成されているだけです。また、その関数の署名に従って、その関数からintを返しません。そうでない場合は、あなたがしている、その場合は

head = newNode; 

は、node**を入力し*head = newNodeを行うにはheadを変更:

私はあなたがこのラインで頭として新しいノードを設定したいしていることを疑っていますnewNodeを指すようにローカル変数を変更するだけで、実際のhead1ポインタはmainから渡されるわけではありません。 mainの場合、&head1addに渡します。


EDIT:おそらくより理にかなって何head->next = newNode;を持っている、またはリストの最後に反復してnewNodeNULLを指しているノードのnext値を設定することです。すなわち、

node *lastNode = head; 
while (lastNode->next != NULL) /* get to the last node in the list */ 
    lastNode = lastNode->next; 

lastNode->next = newNode; /* add newNode to the end of the list */ 

newNode->next = NULLの代わりnewNode->next = headを持っています。 newNodeを頭に付け加えた場合、"two: 2, one : 1"ではなく、出力が"one : 1, two: 2"になります。

1

あなたの反復を見ないと、head1はリストの最後の要素を指しています。

return head; 

し、プログラムの2行目であることを:あなたはおそらくする追加機能の最後の行を意味

head1 = add(2, "two", head1); 

しかし、それはおそらくまだ間違ったために、あなたの出力が得られますあなたのadd関数は新しい要素をリストの先頭に追加するので、最後の要素は追加しません。

1

詳細については、The C Programming LanguageKernighan & Ritchieで紹介します(第1.7/1.8章)、機能とプログラムの構造(第4章)を参照してください。

ヒント:pass-by-value & pass-by-address

int main() { 
    ... 
    add(2, "two", &head1); 
    ... 
} 

OTOH、あなたは(createNewLinkedListで)それを参照解除する前mallocのリターンアドレスを検証する必要があります。

関連する問題