Anonymní profil kn0t3k – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil kn0t3k – Programujte.comAnonymní profil kn0t3k – Programujte.com

 

Příspěvky odeslané z IP adresy 78.45.252.–

kn0t3k
C / C++ › BVS - odstraneni uzlu
19. 11. 2014   #196189

ahoj, delam projekt do skoly, je to bvs, mam hotovou inicializaci, pridavani, vyhledavani a odstraneni uzlu, ktere maji zadne nebo jednoho potomka.

Ted jsem se ale zasekl na odstranovani uzlu ktere maji dva potomky. Jak chci aby to funguvalo, tak mam pomocnou fci ReplaceByRightmost(), ktera najde nejpravejsi prvek v levem podstromu uzlu, ktery chci smazat, prepise hodnotu mazaneho uzlu tou, kterou nasel jako nejpravejsi a odstrani tento nejpravejsi, ukazatel na zacatek podstromu a na prepisovany prvek ji zadam.

fce vypada takto:

void ReplaceByRightmost (tBSTNodePtr PtrReplaced, tBSTNodePtr *RootPtr)

{

   if((*RootPtr)->RPtr == NULL) /*aktualni RootPtr uz nema praveho syna, je teda nejpravejsi, chci jeho hodnotu vzit a prepsat ji do PtrReplaced*/
    {
        PtrReplaced->Key = (*RootPtr)->Key; //prepsani klice
        PtrReplaced->BSTNodeCont = (*RootPtr)->BSTNodeCont; //prepsani hodnoty
        
        tBSTNodePtr pom2 = (*RootPtr)->LPtr; //pom2 uchovava leveho syna mazaneho prvku, pravy je NULL
        prev->RPtr = pom2; /*prev ukazuje na predchozi prvek vuci *RootPtr, takze spojim leveho syna *RootPtr s otcem *RootPtr*/
        
        free(*RootPtr);
        *RootPtr = pom2; /*a jako novy *RootPtr nastavim leveho syna *RootPtr, kdyz udelam  *RootPtr = prev => sigsegv*/
    }
    else
    {
        prev = *RootPtr;  /*do globalni promenne ukladam aktualni hodnotu uzlu a zanorim se, takze znam i jeho predchudce*/
        ReplaceByRightmost(PtrReplaced, &(*RootPtr)->RPtr);  //a hledam v prave casti
    }
}

jeste pripojim obrazek, toto je pocateci stav

                       +-[Z,10]
                       |
                    +-[Y,10]
                    |
                 +-[X,10]
                 |
              +-[S,10]
              |  |
              |  +-[R,10]
              |     |
              |     +-[Q,10]
              |        |
              |        +-[P,10]
              |
           +-[O,16]
           |
        +-[N,14]
        |  |
        |  +-[M,13]
        |
     +-[L,12]
     |  |
     |  |  +-[K,11]
     |  |  |
     |  +-[J,10]
     |     |
     |     +-[I,9]
     |
  +-[H,8]
     |
     |     +-[G,7]
     |     |
     |  +-[F,6]
     |  |  |
     |  |  +-[E,5]
     |  |
     +-[D,4]
        |
        |  +-[C,3]
        |  |
        +-[B,2]
           |
           +-[A,1]

odstranovani listu jako [A,1] funguje, funguje i odstraneni [R,10], ve skriptu se odstranuji postupne A1, R10, X10, L12, H8, K11, D4, S10 a muj program vyhodi nasledujici:

                    +-[Z,10]
                    |
                 +-[Y,10]
                 |
              +-[Q,10]
              |  |
              |  +-[P,10]
              |
           +-[O,16]
           |
        +-[N,14]
        |  |
        |  +-[M,13]
        |
     +-[J,10]
     |  |
     |  +-[I,9]
     |
  +-[G,7]
     |
     |     +-[I,9]
     |     |
     |  +-[F,6]
     |  |  |
     |  |  +-[E,5]
     |  |
     +-[C,3]
        |
        |  +-[P,10]
        |  |

        +-[B,2]

a ocekavany vystup je bez I9 za F6 a bez P10 za B2, obe jsou zdvojene v pravem ukazateli, takze asi bude nekde chyba v praci s nim, ale uz nevim kde, mate nekdo tuseni?

jeste dodam ze kdyz pridavam prvky, tak vzdycky jsou oba jejich LPtr a RPtr NULL, az pokud pridavam mensi/vesti tak se meni

a toto je odstraneni uzlu, ktery ma jen praveho syna, pro leveho syna je to analogicke, follow me je obdoba vyse zmineneho prev

else if((*RootPtr)->LPtr == NULL)
{
  tBSTNodePtr hilfe = (*RootPtr)->RPtr;
  if(followme->LPtr->Key == K)
  {
    free(followme->LPtr);
    followme->LPtr = hilfe;
  }
  if(followme->RPtr->Key == K)
  {
    free(followme->RPtr);
    followme->RPtr = hilfe;
  }
}

moc byste me potesili s nejakym napadem, jak uz pomalu lamu klavesnicu :D

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032021 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý