2017-10-21 9 views
-4
void addPort(s **port, char *port_name){ 
    //s *pointer = malloc(sizeof(s)); 
    s * new_node; 
    new_node = malloc(sizeof(s)); 
    if (port_name != new_node->name){ 
    new_node->name = port_name; 
    new_node->next = *port; 
    *port = new_node; 
    } 
    else { 
     printf("Port %s exists ", port_name); 
    } 
} 

私はリンクされたリストに要素を追加するための上記のコードを持っています。現在、要素を追加するときに起こることは、新しい要素が追加され、すべての要素が新しい要素の値に変更されるということです。たとえば、香港を追加して印刷すると「香港」(予想どおり)が印刷されますが、次にロッテルダムを追加して印刷すると「ロッテルダム、ロッテルダム」が印刷されます。私の間違いが誰に見えるのですか?なぜポインタは上書きされ続けますか?

typedef struct port { 
    char *name; 
    struct port *next; 
    struct port *ptr; 
} s; 

ここに構造体が必要な場合です。

+1

'new_node-> NAME'あなた' if'文で初期化されていません。未定義の動作。 – melpomene

+0

マルチデュープ。 'new_node-> name = port_name;'すべてのノードが同じ(おそらくスコープ外)、最後に入力された文字列への同じポインタを持つように、ポインタのみをコピーします。 –

+0

おそらくmainに静的文字配列のアドレスを渡します。私たちが確認できるようにメインコードを投稿してください(アドレスはすべての文字列に同じメモリ位置を使用するため追加するすべての要素で同じになります) –

答えて

0
*port = new_node 

上記の行が原因です。これは、ポートポインタにある以前のノードへの参照を削除し、新しいノードを指すようにします。あなたの場合、当初はportが "香港"を指しており、上記の行は "ロッテルダム"を指しています

コードには他にもいくつか問題があり、うまくいかないでしょう。 Cオンラインのリンクリスト実装を参照してください。

0
void addPort(s **port, char *port_name){ 
    s * new_node; 
    if (!strcmp(port_name, (*port)->name)){ // <-use strcmp() to compare string *contents* 
     fprintf(stderr, "Port %s exists\n", port_name); 
     return; // <-- return before allocating 
     } 
    new_node = malloc(sizeof *new_node); 
    new_node->name = strdup(port_name); // <- create a copy of the function argument 
    new_node->next = *port; 
    *port = new_node; 
    } 
} 

今:同じ全体のリンクリストをチェックするだけでなく、最初のノード:


void addPort(s **port, char *port_name){ 
    s * new_node; 
    for (; *port;port=&(*port)->next) { // walk the COMPLETE linked list. 
     if (!strcmp(port_name, (*port)->name)){ // <- use strcmp() to compare string *contents* 
       fprintf(stderr, "Port %s exists\n", port_name); 
       return; // <-- return before allocating 
       } 
     } 
    new_node = malloc(sizeof *new_node); 
    new_node->name = strdup(port_name); //<- create a copy of the function argument 
    new_node->next = *port; 
    *port = new_node; 
    } 
} 
関連する問題