Oppure

Loading
07/02/12 17:52
Sì, ho capito che inizi a programmare però io ti posso dire quali sono i problemi per cui il programma si blocca non se il criterio che hai scelto è corretto (se hai scelto un algoritmo appropriato e se l'hai convertito in codice altrettanto corretto).

Ovvero, per capirci, io ti dico che quel puntatore è null e quindi hai l'errore. Stop.

Il perché è null e cosa fare per correggere il programma rendendolo funzionante secondo quello che tu vuoi fare, tocca a te ...

Per esempio, hai corretto il codice ma non hai mostrato come lo hai corretto, perché hai fatto quelle correzioni, cosa ti aspetti dal ciclo che hai corretto e cosa invece succede ...
08/02/12 11:34
flavio89
Allora la correzione che ho fatto viene fuori da quello che ho colto dal tuo suggerimento.
Ovviamente è sbagliata in quanto mi viene mostrato solo l' ultimo elemento caricato nell' albero, per cui ho dedotto di aver capito male quello che tu mi hai cercato di spiegare.

Avevo provato a regolare tutto da un if-else che sostanzialmente ripeteva le stesse operazioni, evitando solo, nell' else, di prendere in considerazioni tutte le istruzioni contenenti nodo->parent.
Purtroppo questa parte del codice è "copiata" in quanto ci è stato fornito lo pseudocodice dal professore, e al momento, non ho compreso questa parte nella sua interezza.

La correzione:
RB RedBlack::balance (RB &tree,RB &nodo,string chiave) {
    tree = insert (tree,nodo,chiave);
    RB root = new RedBlack ();
    root = tree;

    // se è radice, colore è nero.
    if (nodo == root) {
        nodo->parent = NULL;
        nodo->colore = black;
        }

    else nodo->colore = red;

    // ripristina lo stack per trovare il padre
    erase ();

    RB y = new RedBlack ();

    if (nodo->parent != NULL) {

    while ((nodo->parent->colore == red) && (nodo->parent != NULL))  {     // e se il colore del padre è ROSSO
            if (nodo->parent == nodo->parent->parent->left) {
             y = nodo->parent->parent->right;

            if (y->colore == red) {
                nodo->parent->colore = black;
                y->colore = black;
                nodo->parent->parent->colore = red;
                nodo = nodo->parent->parent;
                }   // fine IF

            else if (nodo == nodo->parent->right) {
                nodo = nodo->parent;
              left_rotate (nodo,tree);    // albero nodo
                nodo->parent->colore = black;
                nodo->parent->parent->colore = red;
                //right_rotate;   // albero padre padre nodo
                } // fine ELSE IF
        } // if IF GENERALE
    // -------------------------------------------------------
            else  {
            y = nodo->parent->parent->left;

            if (nodo == nodo->parent->left) {
                nodo = nodo->parent;
                left_rotate (nodo,tree);    // albero nodo
                nodo->parent->colore = black;
                nodo->parent->parent->colore = red;
               // right_rotate;   // albero padre padre nodo
                } // fine IF


            } // fine ELSE
        }   // fine WHILE
        return tree;
    } // fine if NODO PARENT NULL


    else return tree;

        /*
        RB y = new RedBlack();

    while (nodo->parent != NULL)  {     // e se il colore del padre è ROSSO
            if (nodo->parent == nodo->parent->parent->left) {
             y = nodo->parent->parent->right;

            if (y->colore == red) {
                //nodo->parent->colore = black;
                y->colore = black;
                nodo->parent->parent->colore = red;
                nodo = nodo->parent->parent;
                }   // fine IF

            else if (nodo == nodo->parent->right) {
                nodo = nodo->parent;
                left_rotate (nodo,tree);    // albero nodo
                //nodo->parent->colore = black;
                nodo->parent->parent->colore = red;
                //right_rotate;   // albero padre padre nodo
                } // fine ELSE IF
        } // if IF GENERALE
    // -------------------------------------------------------
            else  {
            y = nodo->parent->parent->left;

            if (nodo == nodo->parent->left) {
                nodo = nodo->parent;
                left_rotate (nodo,tree);    // albero nodo
                //nodo->parent->colore = black;
                //nodo->parent->parent->colore = red;
               // right_rotate;   // albero padre padre nodo
                } // fine IF


            } // fine ELSE
        }   // fine WHILE
        }*/
        return tree;
}

// inserisco il termine all' interno dell' albero
RB RedBlack::insert(RB &tree, RB &nodo, string chiave)  {

    // inserisci il termine
    if (tree == NULL) {
    nodo = new RedBlack();

    nodo->parola = chiave;
    nodo->left = NULL;
    nodo->right = NULL;
    nodo->parent = padre.back();                        // il padre è l' ultimo nodo esaminato
//    tree = nodo;
    return nodo;
    }

    // determina la posizione del nodo
    else if (chiave < tree->parola) {
       padre.push_back (tree);                         // salva il nodo appena esaminato per trovare il padre
        return insert (tree->left,nodo,chiave);
    }

    else if (chiave > tree->parola) {
         padre.push_back (tree);
            return insert (tree->right,nodo,chiave);
    }
}


Ti allego anche la slide contenente lo pseudocodice -> db.tt/…
aaa