author | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2011-04-09 23:48:28 UTC |
committer | Rodrigo Campos
<rodrigo@sdfg.com.ar> 2011-04-09 23:52:48 UTC |
parent | 2cc92ee5aa2348ffe7c3e17cb9bd6b6bbb8b5043 |
bintree.asm | +56 | -3 |
test.c | +12 | -12 |
diff --git a/bintree.asm b/bintree.asm index d229a99..dbf53c6 100644 --- a/bintree.asm +++ b/bintree.asm @@ -217,11 +217,9 @@ eliminar: je .eliminar1 ; Tiene 2 hijos + jmp .eliminar2 - - jmp .fin - .eliminar0: push edi ; nodo *padre, 3º param push esi ; nodo *nodo, 2º param @@ -238,6 +236,35 @@ eliminar: add esp, 12 jmp .fin +.eliminar2: + + push dword .nDer ; subarbol derecho del nodo a borrar + call buscar_min + add esp, 4 + + ; copiarme el id, nombre y puntaje a registros + mov cx, [eax + off_id] + mov edx, [eax + off_nom] + mov edi, [eax + off_puntaje] + push ecx + push edx + push edi + + ; nos llamamos recursivamente + push ecx ; id + push ebx ; nodo **arbol + call eliminar + add esp, 8 + + ; ponemos en esi el nombre, puntaje y id que guardamos en registros/stack + pop edi + pop edx + pop ecx + mov [esi + off_id], cx + mov [esi + off_nom], edx + mov [esi + off_puntaje], edi + jmp .fin + .fin: pop ebx pop esi @@ -407,6 +434,32 @@ eliminar_1_hijo: pop ebp ret +; nodo *buscar_min(nodo *arbol) +buscar_min: + push ebp + mov ebp, esp + push edi + push esi + push ebx + + mov eax, [ebp + 8]; nodo *arbol + %define .nIzq [eax + off_izq] + + ; el minimo es el nodo de mas a la izquierda +.loop: + cmp dword .nIzq, 0 + je .fin + mov eax, .nIzq + jmp .loop + +.fin: + pop ebx + pop esi + pop edi + pop ebp + ret + + destruirArbol: push ebp mov ebp, esp diff --git a/test.c b/test.c index 037a400..fd02260 100644 --- a/test.c +++ b/test.c @@ -27,25 +27,25 @@ int main() nodo *e = NULL; insertar(&e, "nodoe", 32, 7.5); insertar(&e, "nodoe", 30, 7.5); - - if (e->izq->izq == NULL) - printf("hijo iz es NULL\n"); - else - printf("hijo iz es NO es NULL\n"); + insertar(&e, "nodoe", 34, 7.5); insertar(&e, "nodoe", 31, 7.5); - if (e->izq->izq == NULL) - printf("hijo iz es NULL\n"); - else - printf("hijo iz es NO es NULL\n"); - + printf("31 == %d\n", e->izq->der->id); printf("Hola puto\n"); - eliminar(&e, 30); - eliminar(&e, 31); + //eliminar(&e, 30); + //eliminar(&e, 31); eliminar(&e, 32); + printf("id de la raiz es: %d\n", e->id); + if (e->der == NULL) + printf("hijo der es NULL\n"); + else + printf("hijo der NO es NULL\n"); + printf("1º hijo: %d\n", e->izq->id); + printf("2º hijo: %d\n", e->izq->der->id); + return 0; }