BST krijg steeds Segmentation fault

stemmen
3

EDIT: het runnen van het door de gdb geeft

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

Hulp nodig met mijn eerste BST code, ik krijg steeds een segmentation fault, ik denk dat het een geheugen lekkage? zo ja, ik weet niet waar / hoe ze hier vast te stellen zijn de codes die ik denk dat het probleem veroorzaken. Is het omdat ik niet heb een kopie constructeur set nog op ??

tree.cpp file

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;
}
De vraag is gesteld op 27/04/2011 om 14:09
bron van user
In andere talen...                            


2 antwoorden

stemmen
2

Ik zie een aantal mogelijke segfault whenn ik kijk naar uw methode. Denk maar aan de rand gevallen.

Wat gebeurt hier?:

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

of

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

Fix deze gevallen en ga verder.

antwoordde op 27/04/2011 om 14:19
bron van user

stemmen
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;
}

U bent altijd gebruikt rootin plaats van currentRoot, zodat je niet echt afdalen uit de boom en zal een Gebruiker op een bepaald punt te krijgen. Ook, mis je de cheque als de currentRootwil NULL, want als je er toegang toe dan, krijg je een mooi segfault te krijgen (dit is wat @tgmath bedoeld).

bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if(currentRoot == NULL)
        return false;
    // as before ...
}
antwoordde op 27/04/2011 om 14:24
bron van user

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