BST μου βγάζει σφάλμα Τμηματοποίηση

ψήφοι
3

EDIT: να τρέχει μέσα από το gdb δίνει

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400e4c in Tree::findKey(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int, Tree::Node*) ()

Χρειάζεστε βοήθεια με την πρώτη κωδικό BST μου, συνεχίζω να πάρει ένα σφάλμα κατάτμησης, νομίζω ότι είναι μια διαρροή μνήμης; αν ναι i dont ξέρει πού / πώς να διορθώσετε εδώ είναι οι κωδικοί που πιστεύω ότι προκαλούν το πρόβλημα. Είναι επειδή δεν έχω ένα κατασκευαστή αντίγραφο που έχει συσταθεί ακόμα ??

αρχείο tree.cpp

Tree::Tree()
{
  root = NULL;
}

bool Tree::insert(int k, string s)
{
  return insert(root, k, s);
}
//HELPER Call find data with key function
bool Tree::findKey(string& s, int k)
{
    return findKey(s, k, root);
}
bool Tree::insert(Node*& currentRoot, int k, string s)
{
  if(currentRoot == NULL){
    currentRoot = new Node;
    currentRoot->key = k;
    currentRoot->data = s;
    currentRoot->left = NULL;
    currentRoot->right = NULL;
    return true;
  }
  else if (currentRoot->key == k)
    return false;
  else if (currentRoot->key > k)
    return insert(currentRoot->left, k, s);
  else
    return insert (currentRoot->right,k, s);
}
bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if (currentRoot->key == k){
        s = root->data;
        return true;
    }
    else if (root->key < k)
        return findKey (s, k, root->right);
    else if (root->key > k)
        return findKey (s, k, root->left);
    else
        return false;
}

main.cpp

int main()
{
string sout;
  Tree test;
    test.insert(1, a);
    test.insert(2, b);
    test.insert(3, c);
    test.findKey(sout, 3);
    cout<<sout<<endl;
  return 0;
}
Δημοσιεύθηκε 27/04/2011 στις 14:09
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
2

Βλέπω κάποια πιθανή segfault whenn βλέπω μέθοδο σας. Αρκεί να σκεφτούμε περιπτώσεις ακμής.

Τι συμβαίνει εδώ?:

Tree test; 
test.findKey(sout, 3);

ή

Tree test;
test.insert(1, "a");
test.findKey(sout, 3);

Διορθώστε τις περιπτώσεις αυτές και να προχωρήσει.

Απαντήθηκε 27/04/2011 στις 14:19
πηγή χρήστη

ψήφοι
2

bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if (currentRoot->key == k){
        s = root->data;
        return true;
    }
    else if (root->key < k)
        return findKey (s, k, root->right);
    else if (root->key > k)
        return findKey (s, k, root->left);
    else
        return false;
}

Έχετε πάντα χρησιμοποιώντας rootαντί της currentRoot, έτσι ώστε να μην πραγματικά να κατέβει κάτω από το δέντρο και θα πάρετε μια Stackoverflow σε κάποιο σημείο. Επίσης, χάνετε τον έλεγχο, αν το currentRootIS NULL, γιατί αν έχετε πρόσβαση, στη συνέχεια, θα γίνει ένα ωραίο segfault (αυτό είναι ό, τι @tgmath σήμαινε).

bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if(currentRoot == NULL)
        return false;
    // as before ...
}
Απαντήθηκε 27/04/2011 στις 14:24
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more