2017-04-11 3 views
-2

frage mich, ob ich Hilfe mit dieser einfach verknüpften Liste Problem bekommen könnte.Warum zeigen alle meine Knoten auf das gleiche Zeichenarray?

So habe ich eine einfache Struktur mit einem nächsten Zeiger und Char-Zeiger, um jeden Knoten zu bilden.

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

in meiner Hauptfunktion, ich erstelle Namen einen dynamisch zugewiesenen Array von Zeichen genannt, die auf eine Funktion gesendet werden, dass es jedes Mal einen neuen Knoten erzeugt aufgerufen wird, wird ein neuer Name durch eingegeben werden soll der Benutzer jedes Mal und soll jedem neu erstellten Knoten zugewiesen werden, aber aus bestimmten Gründen nehmen ALLE Knoten den eingegebenen endgültigen Namen an.

Meine Vermutung ist, dass alle Knoten alle auf das gleiche Char-Array zeigen, aber ich weiß nicht, wie das zu beheben ist. Hier ist mein Code.

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. 

} 

Der Code funktioniert die Liste erstellen, aber die Namen aller Knoten sind gleich, ganz zuletzt durch den Benutzer eingegeben char-Array. Irgendwelche Vorschläge?

+1

Sie müssen eine Kopie des Namens in addNode erstellen. Am einfachsten ist es, knotenname zu einem std :: string zu machen – pm100

+0

Alternativ können Sie 'char * name = new char [MAX_SIZE]' * innerhalb * Ihrer Schleife verschieben. Ehrlich gesagt, ist die Verwendung von "std :: string" in der Tat der richtige Ansatz. – WhozCraig

Antwort

3

Alle Ihre Knoten zeigen auf das gleiche Zeichen-Array, weil Sie nur ein Zeichen-Array zuweisen. Worauf könnten sie sonst noch hinweisen?

Da jeder Aufruf addNode die gleichen Zeiger übergibt, wenn Sie dies tun:

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

Sie setzen jedes name Mitglied des Knotens auf den gleichen Wert. Das ist nicht das, was du machen willst.

Was Sie tun möchten, hängt von Code ab, den Sie uns nicht gezeigt haben. Wahrscheinlich möchten Sie etwas Speicher in addNode zuweisen, kopieren Sie den angegebenen Namen hinein und setzen Sie newNode->name auf diesen Zeiger. Sie müssen Ihren Code ändern, um den Knoten freizugeben, um die Speicherfreigabe aufzuheben, wenn Sie damit fertig sind.

Alternativ können Sie die Eigentumsrechte in addNode übertragen. Aber dann sollten Sie main wechseln, um jedes Mal new aufzurufen, um ein neues name Objekt zuzuweisen.

+0

Vielen Dank. Dies löste das Problem vollständig. – Junior

Verwandte Themen