BST păstra achiziție vina Segmentarea

voturi
3

EDIT: rulează-l prin GdB dă

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

Ai nevoie de ajutor cu primul cod meu BST, am păstra achiziție o eroare de segmentare, cred că este o scurgere de memorie? în cazul în care acest lucru i dont know în cazul în care / cum să se stabilească aici sunt codurile care cred că sunt cauzează problema. Este pentru că am dont au un constructor copie configurat încă ??

fișier 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;
}
Întrebat 27/04/2011 la 14:09
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
2

Am vedea unele posibile segfault whenn mă uit la metoda ta. Doar cred că de cazuri de margine.

Ce se intampla aici?:

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

sau

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

Fix aceste cazuri și a continua.

Publicat 27/04/2011 la 14:19
sursa de către utilizator

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

Tu întotdeauna utilizați în rootloc currentRoot, astfel încât să nu coboare cu adevărat în jos copac și va primi un StackOverflow la un moment dat. De asemenea, te lipsește verifica dacă currentRootIS NULL, pentru că dacă îl accesați atunci, veți obține un segfault frumos (aceasta este ceea ce a însemnat @tgmath).

bool Tree::findKey(string& s, int k, Node* currentRoot)
{
    if(currentRoot == NULL)
        return false;
    // as before ...
}
Publicat 27/04/2011 la 14:24
sursa de către utilizator

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