Aqui esta el archivo modificado, pero tengo un error, no pude corregir.
Ya no alcance a hacer el de colas, pero lo que me llegaron a explicar fue que tenemos que hacer una condicion que nos permita agregar al final y eliminar al principio para que funcione.
En las pilas que puse aqui se maneja que tiene que insertarse una pila al principio y tiene que eliminarse del mismo modo al principio.
Lo que hice fue hacer una copia de cada uno de lo que es nuestro programa principal (spilas.c), la libreria (spilas.h) y de noveno.c que ahora es bien.c para que pueda ejecutarse adecuadamente nuestro programa.
cambie del archivo listas.h a spilas.h
#ifndef SPILAS_H
#define SPILAS_H
#include "bool.h"
// estructura de un elemento de la lista
struct elemento_de_lista {
int dato; // donde la info va
// doblemente enlazada
struct elemento_de_lista* siguiente; // puntero
struct elemento_de_lista* anterior; // puntero
}; // <= ojo con el punto y coma
// redefinicion por brevedad
typedef struct elemento_de_lista elem;
// eliminar todos los elementos de la lista
elem* borrar(elem* esto);
// 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);
// 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);
// interface para llamadas mas bonitas
bool eliminar(int valor, elem** inicio);
void imprime_elemento(elem* esto);
// interfase que agrega [ ... ] y el \n
void imprimir(elem* lista);
// agregar un elemento en la posicion que
// le corresponde (valores de menor a mayor)
elem* insertar(int valor, elem* aqui);
#define MAX 40
#define MIN 1
// numeros pseudoaleatorios [MIN, MAX]
int pseudoaleatorio();
#endif
Tambien cambie lo que eran listas.c a spilas.c
#include // imprimir (printf)
#include // reservar memoria
#include "spilas.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 (nuevo->siguiente != NULL) {
printf("Estoy en %d, insertando un %d.\n",
nuevo->dato, valor);
} else {
printf("No hay nada.\n");
}
#endif
if (aqui == NULL) { //
nuevo = (elem*)malloc(sizeof(elem));
nuevo->dato = valor;
nuevo->anterior = nuevo;
nuevo->siguiente = NULL;
return nuevo;
} else {
if (valor < aqui->dato) {
nuevo = (elem*)malloc(sizeof(elem));
nuevo->dato = valor; // pon el valor
if (aqui->siguiente == 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;
}
}
}
}
// numeros pseudoaleatorios [MIN, MAX]
int pseudoaleatorio() {
return ((rand() % (MAX - MIN + 1)) + MIN);
}
Por ultimo cambie lo que era noveno.c a bien.c para que funcione
#include "spilas.h"
#include "entrada.h"
#include // printf
#include // srand
// rutina principal
int main(int argc, char** args) {
elem* lista = NULL; // vacia al inicio
int valor; // auxiliares
char op;
bool basta = FALSE;
while (!basta) {
printf("Que quieres hacer?\n");
printf("Agregar = a\nBuscar = b\n");
printf("Eliminar = e\nVaciar = v\n");
printf("Imprimir = i\nSalir = s\n> ");
op = pide_opcion("abevis");
switch (op) {
case 'a':
valor = pide_pila(MIN, MAX);
lista =
insertar(valor, lista);
break;
case 'b':
valor = pide_pila(MIN, MAX);
printf("%d %s esta en la spila.\n",
valor, (buscar(valor, lista) ?
"SI" : "NO"));
break;
case 'e':
valor = pide_pila(MIN, MAX);
if (eliminar(valor, &lista)) {
printf("%d eliminado.\n", valor);
} else {
printf("%d no estuvo presente.\n",
valor);
}
break;
case 'v':
lista = borrar(lista);
break;
case 'i':
imprimir(lista);
break;
case 's':
basta = TRUE;
break;
default:
printf("Esto no deberia pasar nunca.\n");
break;
}
}
return 1;
}
¿Cuál es tu error? ¿Es al compilar o ejecutar?
ReplyDeleteal compilar!
ReplyDelete