Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Segmentation fault
Forum - C/C++ - Segmentation fault - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
flavio89 (Normal User)
Rookie


Messaggi: 26
Iscritto: 07/09/2011

Segnala al moderatore
Postato alle 12:34
Mercoledì, 08/02/2012
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:
Codice sorgente - presumibilmente VB.NET

  1. RB RedBlack::balance (RB &tree,RB &nodo,string chiave) {
  2.     tree = insert (tree,nodo,chiave);
  3.     RB root = new RedBlack ();
  4.     root = tree;
  5.  
  6.     // se è radice, colore è nero.
  7.     if (nodo == root) {
  8.         nodo->parent = NULL;
  9.         nodo->colore = black;
  10.         }
  11.  
  12.     else nodo->colore = red;
  13.  
  14.     // ripristina lo stack per trovare il padre
  15.     erase ();
  16.  
  17.     RB y = new RedBlack ();
  18.  
  19.     if (nodo->parent != NULL) {
  20.  
  21.     while ((nodo->parent->colore == red) && (nodo->parent != NULL))  {     // e se il colore del padre è ROSSO
  22.             if (nodo->parent == nodo->parent->parent->left) {
  23.              y = nodo->parent->parent->right;
  24.  
  25.             if (y->colore == red) {
  26.                 nodo->parent->colore = black;
  27.                 y->colore = black;
  28.                 nodo->parent->parent->colore = red;
  29.                 nodo = nodo->parent->parent;
  30.                 }   // fine IF
  31.  
  32.             else if (nodo == nodo->parent->right) {
  33.                 nodo = nodo->parent;
  34.               left_rotate (nodo,tree);    // albero nodo
  35.                 nodo->parent->colore = black;
  36.                 nodo->parent->parent->colore = red;
  37.                 //right_rotate;   // albero padre padre nodo
  38.                 } // fine ELSE IF
  39.         } // if IF GENERALE
  40.     // -------------------------------------------------------
  41.             else  {
  42.             y = nodo->parent->parent->left;
  43.  
  44.             if (nodo == nodo->parent->left) {
  45.                 nodo = nodo->parent;
  46.                 left_rotate (nodo,tree);    // albero nodo
  47.                 nodo->parent->colore = black;
  48.                 nodo->parent->parent->colore = red;
  49.                // right_rotate;   // albero padre padre nodo
  50.                 } // fine IF
  51.  
  52.  
  53.             } // fine ELSE
  54.         }   // fine WHILE
  55.         return tree;
  56.     } // fine if NODO PARENT NULL
  57.  
  58.  
  59.     else return tree;
  60.  
  61.         /*
  62.         RB y = new RedBlack();
  63.  
  64.     while (nodo->parent != NULL)  {     // e se il colore del padre è ROSSO
  65.             if (nodo->parent == nodo->parent->parent->left) {
  66.              y = nodo->parent->parent->right;
  67.  
  68.             if (y->colore == red) {
  69.                 //nodo->parent->colore = black;
  70.                 y->colore = black;
  71.                 nodo->parent->parent->colore = red;
  72.                 nodo = nodo->parent->parent;
  73.                 }   // fine IF
  74.  
  75.             else if (nodo == nodo->parent->right) {
  76.                 nodo = nodo->parent;
  77.                 left_rotate (nodo,tree);    // albero nodo
  78.                 //nodo->parent->colore = black;
  79.                 nodo->parent->parent->colore = red;
  80.                 //right_rotate;   // albero padre padre nodo
  81.                 } // fine ELSE IF
  82.         } // if IF GENERALE
  83.     // -------------------------------------------------------
  84.             else  {
  85.             y = nodo->parent->parent->left;
  86.  
  87.             if (nodo == nodo->parent->left) {
  88.                 nodo = nodo->parent;
  89.                 left_rotate (nodo,tree);    // albero nodo
  90.                 //nodo->parent->colore = black;
  91.                 //nodo->parent->parent->colore = red;
  92.                // right_rotate;   // albero padre padre nodo
  93.                 } // fine IF
  94.  
  95.  
  96.             } // fine ELSE
  97.         }   // fine WHILE
  98.         }*/
  99.         return tree;
  100. }
  101.  
  102. // inserisco il termine all' interno dell' albero
  103. RB RedBlack::insert(RB &tree, RB &nodo, string chiave)  {
  104.  
  105.     // inserisci il termine
  106.     if (tree == NULL) {
  107.     nodo = new RedBlack();
  108.  
  109.     nodo->parola = chiave;
  110.     nodo->left = NULL;
  111.     nodo->right = NULL;
  112.     nodo->parent = padre.back();                        // il padre è l' ultimo nodo esaminato
  113. //    tree = nodo;
  114.     return nodo;
  115.     }
  116.  
  117.     // determina la posizione del nodo
  118.     else if (chiave < tree->parola) {
  119.        padre.push_back (tree);                         // salva il nodo appena esaminato per trovare il padre
  120.         return insert (tree->left,nodo,chiave);
  121.     }
  122.  
  123.     else if (chiave > tree->parola) {
  124.          padre.push_back (tree);
  125.             return insert (tree->right,nodo,chiave);
  126.     }
  127. }



Ti allego anche la slide contenente lo pseudocodice -> http://db.tt/WAgC42mj

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo