BST får stadig Segmentering feil

stemmer
3

EDIT: kjører den gjennom gdb gir

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

Trenger litt hjelp med min første BST kode, jeg får stadig en segmentering feil, jeg tror at det er et minne lekkasje? hvis så jeg vet ikke hvor / hvordan å fikse her er kodene som jeg tror er årsaken til problemet. Er det fordi jeg ikke har en kopi konstruktør satt opp ennå ??

tree.cpp fil

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;
}
Publisert på 27/04/2011 klokken 13:09
kilden bruker
På andre språk...                            


2 svar

stemmer
2

Jeg ser noen mulige segfault whenn jeg ser på din metode. Bare tenk på kanten tilfeller.

Hva skjer her?:

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

eller

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

Løse disse sakene og gå videre.

Svarte 27/04/2011 kl. 13:19
kilden bruker

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

Du alltid bruker rooti stedet for currentRoot, så du trenger egentlig ikke stige ned treet og vil få en Stackoverflow på enkelte punkt. Også, du mangler sjekken hvis currentRootsi NULL, fordi hvis du tilgang til det da, vil du få en fin segfault (dette er hva @tgmath ment).

bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if(currentRoot == NULL)
        return false;
    // as before ...
}
Svarte 27/04/2011 kl. 13:24
kilden bruker

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