En clase utilizamos el codigo : listas.c, el cual ordenaba de menor a mayor los datos ingresados, esta funcionalidad no es necesaria en una pila, pues una pila es una estructura en la cual el primer elemento es ingresar es el ultimo en salir y viceversa. En realidad la modificación era quitarle la parte que ordenaba de menor a mayor.
#include <stdio.h> #include// imprimir (printf) #include // reservar memoria #include "listas.h" // eliminar todos los elementos de la lista // opcion vaciar elem* borrar(elem* esto) { elem* temp; // auxiliar // iterativa while (esto != NULL) { temp = esto->siguiente; free(esto); // liberar esto = temp; // avanza al siguinte } return NULL; // que ya no hay lista } // checar si la lista contiene un valor dado // devuelve verdad o falso // recibe un puntero a un elemento de la lista // implementacion recursiva bool buscar(int valor, elem* aqui) { if (aqui != NULL) { //#define DEBUG #ifdef DEBUG printf("Buscando por %d en %d.\n", valor, aqui->dato); #endif // hasta aqui si no esta definido DEBUG // si el valor buscado esta en este elemento if (aqui->dato == valor) { #ifdef DEBUG printf("Son iguales.\n"); #endif return TRUE; // busqueda exitosa } else if (aqui->dato > valor) { // ojo: lista esta ordenada de menor // a mayor (por construccion a traves // de la implementacion del metodo // insertar(...) #ifdef DEBUG printf("Ya es mayor. No va a estar.\n"); #endif return FALSE; // busqueda fallida } // pasar la pelota al siguiente elemento return buscar(valor, aqui->siguiente); } else { // aqui es null // este elemento actual ya es null, o sea, // no en realidad es un elemento #ifdef DEBUG printf("Ya se acabo. No estuvo.\n"); #endif return FALSE; // busqueda fallida } } // devuelve si o no se pudo eliminar // (no se puede eliminar si no esta) // valor cuyo elemento hay que eliminar // (unicamente elimina el primer elemento // cuyo valor coincide) // elemento en el cual estamos buscando = aqui // direccion del inicio de la lista bool eliminar_elemento(int valor, elem* aqui, elem** inicio) { if (aqui != NULL) { // si hay algo if (aqui->dato == valor) { // hay que borrar el elemento if (aqui->siguiente != NULL) { aqui->siguiente->anterior = aqui->anterior; } if (aqui->anterior == NULL) { *inicio = aqui->siguiente; } else { aqui->anterior->siguiente = aqui->siguiente; } free(aqui); // borrame return TRUE; // eliminacion exitosa } else if (aqui->dato > valor) { return FALSE; } return eliminar_elemento(valor, aqui->siguiente, inicio); } return FALSE; } // interface para llamadas mas bonitas bool eliminar(int valor, elem** inicio) { return eliminar_elemento(valor, *inicio, inicio); } void imprime_elemento(elem* esto) { // iterativa while (esto != NULL) { printf("%d ", esto->dato); esto = esto->siguiente; } return; } // interfase que agrega [ ... ] y el \n void imprimir(elem* lista) { printf("[ "); imprime_elemento(lista); printf("]\n"); return; } // agregar un elemento en la posicion que // le corresponde (valores de menor a mayor) elem* insertar(int valor, elem* aqui) { elem* nuevo = NULL; // auxiliar // para crear el nuevo elemento //#ifdef DEBUG if (aqui != NULL) { printf("Estoy en %d, insertando un %d.\n", aqui->dato, valor); } else { printf("No hay nada.\n"); } //#endif if (aqui == NULL) { // no hay nadie nuevo = (elem*)malloc(sizeof(elem)); nuevo->dato = valor; // asignar dato nuevo->siguiente = NULL; // el unico nuevo->anterior = NULL; // el unico return nuevo; } else { //if (valor < aqui->dato) { nuevo = (elem*)malloc(sizeof(elem)); nuevo->dato = valor; // pon el valor //if (aqui->anterior == NULL) { // aqui es el primer elemento nuevo->siguiente = aqui; aqui->anterior = nuevo; nuevo->anterior = NULL; return nuevo; /*} else { // un chorro de flechas nuevo->anterior = aqui->anterior; nuevo->siguiente = aqui; nuevo->anterior->siguiente = nuevo; aqui->anterior = nuevo; } } else { // ni igual ni mayor #ifdef DEBUG printf("Insertando algo mayor.\n"); #endif // implementacion recursiva if (aqui->siguiente != NULL) { insertar(valor, aqui->siguiente); } else { // este es el ultimo elemento #ifdef DEBUG printf("Anexando al final.\n"); #endif nuevo = (elem*)malloc(sizeof(elem)); nuevo->dato = valor; nuevo->siguiente = NULL; // el ultimo nuevo->anterior = aqui; aqui->siguiente = nuevo; } } } return aqui; } */ // numeros pseudoaleatorios [MIN, MAX] int pseudoaleatorio() { return ((rand() % (MAX - MIN + 1)) + MIN); } } }
1 comentario:
Parece jalar; hubiera bastado subir únicamente la rutina modificada y poner liga al archivo original.
Te pongo +10 por ello.
Publicar un comentario