2016-04-29 10 views
2

Ich arbeite ein Projekt für Klasse, die Erstellung eines binären Suchbaums von kriminellen Namen mit bis zu 8 Attribute pro Verbrecher erfordert.Array wird fälschlicherweise an eine Funktion in C++ übergeben

Ich habe ein String-Array att [] eingerichtet, das die Attribute für jeden Kriminellen einliest und dann an meine BSTInsert-Klassenfunktion übergeben wird. Durch das Debuggen kann ich sehen, dass das Array korrekt ist, wenn es nur in der setupTree-Funktion ist. Sobald es an BSTInsert übergeben wurde, hat es nicht mehr jede Zeichenfolge, sondern nur eine Zeichenfolge und darüber hinaus wird nichts vom Array in den Knoten in der Struktur kopiert.

Kann mir jemand sagen, was ich falsch mache?

Hier mein Code ist der Baum für die Einrichtung:

void setupTree(BST& criminals) 
{ 
    ifstream fin("criminals.txt"); 
    string temp; 

    fin >> temp; 
    //FINISHED means it has all the criminals 
    while (temp != "FINISHED") 
    { 
     //SUSPECT lets it know to read in a new name and new attributes 
     if (temp == "SUSPECT") 
     { 
      string name; 
      string att[8]; 
      int count = 0; 
      fin >> temp; 

      //if there is a false "suspect" line, quit 
      if (temp == "FINISHED") return; 
      name = temp; 
      fin >> temp; 

      while (temp != "SUSPECT" && temp != "FINISHED") 
      { 
       att[count] = temp; 
       count++; 
       fin >> temp; 
      } 

      criminals.BSTInsert(name, att, count); 
     } 
    } 
} 

Hier ist meine Klasse Funktion einen Knoten zum Einfügen:

bool BST::BSTInsert(treetype name, treetype att[], int count) 
{ 
//gets the memory for the node. If unable, returns fail. 
node* newNode = new node; 
if (newNode == NULL) 
{ 
    return false; 
} 

newNode->count = 0; 

//initializes the node with the given information to place 
for (int i = 0; i < count; i++) 
{ 
    newNode->att[newNode->count] = att[count]; 
    newNode->count++; 
} 
newNode->name = name; 
newNode->left = newNode->right = NULL; 

//if the tree is empty, creates this node as the root 
if (root == NULL) 
{ 
    root = newNode; 
    root->parent = NULL; 
} 
else 
{ 
    //the tree is not empty, so it will use the parent to insert the node 
    node* current = root; 
    node* parent = NULL; 

    //finds the insertion spot 
    while (current != NULL) 
    { 
     parent = current; 
     if (name <= current->name) 
     { 
      current = current->left; 
     } 
     else 
     { 
      current = current->right; 
     } 
    } 
    //inserts the new node onto the correct side of the parent 
    if (name <= parent->name) 
    { 
     parent->left = newNode; 
    } 
    else 
    { 
     parent->right = newNode; 
    } 
    newNode->parent = parent; 
} 
return true; 
+2

'while (temp! =" VERDACHT "temp! =" FERTIG ")'? – drescherjm

+0

Sind Sie sicher, dass nicht nur der Debugger nur ein Element anzeigt, weil er die Länge des Arrays nicht kennt? Was passiert, wenn Sie versuchen, att [1] im Debugger anzuzeigen –

+0

Sie wissen also, wie Sie einen Debugger verwenden. Groß! Nun, was sagt Ihr Debugger innerhalb der for-Schleife in BSTInsert()? Weißt du, die Schleife, die versucht, die Attribute vom Parameter att zum att-Member im neuen Knoten zu kopieren? Warum versuchen Sie nicht, diese for-Schleife zu durchlaufen, und sehen Sie selbst, ob die Attribute korrekt kopiert werden. Oder nicht. –

Antwort

1

treetype att[] nicht ein Array übergeben, übergibt er einen Zeiger auf ein Array - es zerfällt zu treetype att*.

Das heißt, Ihr Problem ist hier:

for (int i = 0; i < count; i++) 
{ 
    newNode->att[newNode->count] = att[count]; 
    newNode->count++; 
} 

Dies kopiert das falsche Element att (über das Ende des Arrays) in jeder att in newNode. Was Sie meinten, war

for (int i = 0; i < count; i++) 
{ 
    newNode->att[newNode->count] = att[newNode->count]; 
    newNode->count++; 
} 
+0

"mean't" wie in "mean not"? : D –

Verwandte Themen