2014-08-27 88 views
0

我試圖實現bintree,但我在插入方法有問題。 如果我添加第一個元素,程序不會崩潰,但是當我引入2個或更多元素時,程序崩潰。分割故障bintree

這是代碼

template <typename T> 
void Arbol<T>:: insertar(T c){ 
    if(laraiz==0) 
    { 
     laraiz=new celdaArbol; 
     laraiz->elemento=c; 
     laraiz->padre=laraiz->hizqu=laraiz->hder=0; 
    } 
    else { 
     celdaArbol *com=laraiz; 
     bool poner=false; 
     while(poner==false){ 
      if(c>com->elemento){ 
       if(com->hder==0){ 
        com->hder= new celdaArbol; 
        com->hder->elemento=c; 
        com->hder->padre=com; 
        poner=true; 
       } 
       else{ 
        com=com->hder; 
       } 
      } 
      else { 
       if(com->hizqu==0){ 
        com->hizqu= new celdaArbol; 
        com->hizqu->elemento=c; 
        com->hizqu->padre=com; 
        poner=true; 
       } 
       else { 
        com=com->hizqu; 
       } 
      } 
     } 
    } 
} 

我認爲這個問題是在else:

else{ 
    com=com->hizqu; //com=com->hder; 
} 

因爲我在節目中的部分輸入幾次不應該的調試器看到做。

+0

我認爲這將是非常有益的多用英語變量,不管你講不同的語言鍵入的名字......這樣一來有效地阻止你的人誰不說你的語言(西班牙語?)甚至可以查看代碼。閱讀c + +是非常困難的,如果這種困難被不同的語言所接受,它可以是非常......你知道...... – fritzone 2014-08-27 18:51:54

+0

爲什麼所有其他的?使用退貨並繼續使代碼更清潔。 – scohe001 2014-08-27 18:56:49

+0

謝謝你fritzone。將來我會用英語寫一切。 – dasavi 2014-08-28 09:27:36

回答

1

根據此代碼:

laraiz->padre=laraiz->hizqu=laraiz->hder=0; 

不好好intialize指針hizquhdernullptrceldaArbol類的構造函數。而且你不要在if(c>com->elemento){的任何一個分支中初始化它們,所以它們似乎有垃圾值。

此外,如果你使用正確的C++構造你的代碼可以變得更易讀且不易出錯:

celdaArbol *com=laraiz; 
    while(true){ 
     celdaArbol *&ptr = c > com->elemento ? com->hder : com->hizqu; 
     if(ptr ) { 
      com = ptr; 
      continue; 
     } 
     ptr = new celdaArbol; 
     ptr->elemento=c; 
     ptr->padre=com; 
     ptr->hder = ptr->hizqu = nullptr; 
     break; 
    } 

這個代碼在邏輯上等於你的,只是它更短,更易於閱讀,避免重複建設和修復您的錯誤。

+0

我有這個代碼的問題,當我嘗試閱讀ptr在他父親的元素,如果我插入5,6,15 15的父親是5不是6 如果我使用debbuger,程序永遠不會輸入if (ptr){com = ptr; 繼續; } 我不知道爲什麼,因爲如果com-> hder是6,ptr不是nullptr – dasavi 2014-08-28 11:15:15

+0

我用我的代碼與nullptr,它工作正常。 – dasavi 2014-08-28 16:54:14

+0

@dasavi我無法爲您調試您的代碼,我甚至無法幫助您,因爲我沒有看到您的修改代碼。您可能會錯誤地複製它或其他內容。 – Slava 2014-08-28 17:01:27

0

對於每個葉子節點(樹的根除外),您從不初始化左側子節點或右側子節點,只是未指定的值。

您可能打算將它們初始化爲nullptr

這裏有一個例子:

if (com->hizqu==0){ 
    com->hizqu = new celdaArbol; 
    com->hizqu->elemento = c; 
    com->hizqu->padre = com; 
    poner = true; 

    // What is the value of com->hizqu->hizqu? 
    // What is the value of com->hizqu->hder? 
}