Wednesday, July 13, 2011

Tarea 5: Pilas

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; 
}

2 comments: