2017-04-11 14 views
-2

私はこの単独リンクされたリストの問題の助けを得ることができるかどうか疑問に思っています。すべてのノードが同じ文字配列を指しているのはなぜですか?

私は、次のポインタと各ノードを形成するためのcharポインタを持つ単純な構造体を持っています。私の主な機能で

struct node{ 
      char * nodeName; 
      node * next; 
      } 

、私は新しいノードにそれが呼び出されるたびに作成する関数に送信される名前と呼ばれる文字の動的に割り当てられた配列を、作成し、新しい名前がで入力されたことになっていますその都度ユーザーが作成された新しいノードに割り当てられるはずですが、何らかの理由ですべてのノードが最終名を入力します。

私の推測では、すべてのノードはすべて同じchar配列を指していますが、これを修正する方法はわかりません。ここに私のコードです。

int main() 
{ 

     char * name = new char[MAX_SIZE]; // dynamic array declaration; 
     for(int i = 0; i < 3; ++i) // do it x number of times. 
     { 
      cout << "Enter Node Name" << endl; 
      cin.get(name, MAX_SIZE, '\n'); 
      cin.ignore(200, '\n'); 
      addNode(name); 
     } 

return 0 
} 


void addNode(name[]) 
{ 
if(!head){ // creates a first node, 
     head = new node; 
     head->next = NULL; 
     head->nodeName = "default node"; 
} 
    node * current = head; 
    node * newNode = new node; 
    newNode->name = name;//assign user inputed name. 
    newNode->next = NULL // set next pointer to null 
    while(current->next) 
    current = current->next; // traverse to the last node; 
    current->next = newNode; // connect the new node at the end. 

} 

コードはリストを作成しますが、すべてのノードの名前は、ユーザーが入力した最後の文字配列と同じです。 提案がありますか?

+1

addNodeに名前のコピーを作成する必要があります。最も簡単なのは、nodeNameをstd :: stringにすることです。 – pm100

+0

あるいは、char * name = new char [MAX_SIZE] '*をループ内に移動してください。正直なところ、 'std :: string'を使用するのは確かに正しいアプローチです。 – WhozCraig

答えて

3

1つの文字配列を割り当てただけなので、すべてのノードが同じ文字配列を指しています。では、他に何が指摘できますか? addNodeのすべての呼び出しは、同じポインタが渡されているので

、あなたがこれを行う:

newNode->name = name;//assign user inputed name. 

あなたは同じ値にすべてのノードのnameメンバーを設定します。それはあなたがしたいことではありません。

あなたがしたいことは、私たちが表示していないコードによって決まります。おそらく、addNodeにいくつかのメモリを割り当て、それに与えられた名前をコピーし、newNode->nameをそのポインタに設定したいとします。ノードを解放するためにコードを修正する必要があります。ノードを終了すると、そのメモリを解放します。

また、addNodeにオーナー権限を譲渡することもできます。しかし、新しいnameオブジェクトを割り当てるたびにmainを変更して、newを呼び出すようにしてください。

+0

ありがとうございます。これで問題は完全に解決されました。 – Junior

関連する問題