Advertisement
Guest User

Lista c

a guest
Oct 15th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.58 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. #include <stdlib.h>
  4. /* ******************************************************************
  5.  *                STRUCT NODO PARA LA LISTA
  6.  * *****************************************************************/
  7.  
  8. typedef struct nodo{
  9.     void* dato;
  10.     struct nodo* proximo;
  11.  
  12. } nodo_t;
  13.  
  14. nodo_t* crear_nodo(void* valor){
  15.     nodo_t* nodo = malloc(sizeof(nodo_t));
  16.     nodo->dato = valor;
  17.     nodo->proximo = NULL;
  18.     return nodo;
  19.     }
  20.  
  21. /* ******************************************************************
  22.  *                STRUCT LISTA Y LISTA_ITER
  23.  * *****************************************************************/
  24.  
  25.  
  26. typedef struct lista
  27. {
  28.     nodo_t* primero;
  29.     nodo_t* ultimo;
  30.     size_t largo;
  31. }lista_t;
  32.  
  33. typedef struct lista_iter
  34. {
  35.     lista_t* listaIT;
  36.     nodo_t* actual;
  37.     nodo_t* anterior;
  38.  
  39. }lista_iter_t;
  40.  
  41. /* ******************************************************************
  42.  *                          PRIMITIVAS LISTA
  43.  * *****************************************************************/
  44.  
  45. lista_t* lista_crear(void){
  46.    
  47.     lista_t* lista = malloc(sizeof(lista_t));
  48.     if(!lista) return NULL;
  49.  
  50.     lista -> primero = NULL;
  51.     lista -> ultimo = NULL;
  52.     lista -> largo = 0;
  53.     return lista;
  54. }
  55.  
  56. bool lista_esta_vacia(const lista_t *lista){
  57.     return lista->largo == 0;
  58. }
  59.  
  60. void lista_vacia(lista_t* lista,nodo_t* dato){
  61.     lista -> primero = dato;
  62.     lista -> ultimo = dato;
  63. }
  64.  
  65. bool lista_insertar_primero(lista_t* lista, void *dato){
  66.     nodo_t* aux = crear_nodo(dato);
  67.     if(!aux) return false;
  68.  
  69.     if(lista->largo == 0){
  70.         lista_vacia(lista,aux);
  71.     }
  72.     else{
  73.         aux->proximo = lista->primero;
  74.         lista->primero = aux;
  75. }  
  76.     lista -> largo++;
  77.     return true;
  78. }
  79.  
  80. bool lista_insertar_ultimo(lista_t* lista, void *dato){
  81.     nodo_t* aux = crear_nodo(dato);
  82.     if(!aux) return false;
  83.  
  84.     if (lista->largo == 0)
  85.         lista_vacia(lista,aux);
  86.    
  87.     else{
  88.         lista->ultimo->proximo = aux;
  89.         lista -> ultimo = aux;
  90.     }
  91.     lista -> largo++;
  92.     return true;
  93. }
  94.  
  95.  
  96. void* lista_borrar_primero(lista_t *lista){
  97.     if(!lista->largo) return NULL;
  98.  
  99.     nodo_t*  nodo_aux = lista->primero;
  100.     void* valor_a_borrar = nodo_aux->dato;
  101.     nodo_t* nodo_aux_proximo = lista->primero->proximo;     // si la lista es 1 elem es NULL
  102.  
  103.     free(lista->primero);
  104.     lista->primero = nodo_aux_proximo;
  105.     if(!lista->primero)
  106.         lista->ultimo = NULL;
  107.    
  108.     lista ->largo--;
  109.     return valor_a_borrar;
  110. }
  111.  
  112. void *lista_ver_primero(const lista_t *lista){
  113.     if(!lista->largo) return NULL;
  114.     return lista->primero->dato;
  115. }
  116.  
  117. void *lista_ver_ultimo(const lista_t* lista){
  118.     if(!lista->largo) return NULL;
  119.     return lista->ultimo->dato;
  120. }
  121. size_t lista_largo(const lista_t *lista){
  122.     return lista->largo;
  123. }
  124.  
  125. void lista_destruir(lista_t *lista, void destruir_dato(void *)){
  126.  
  127.     while(!lista_esta_vacia(lista)){
  128.         void* dato = lista_borrar_primero(lista);
  129.         if(destruir_dato)
  130.             destruir_dato(dato);
  131. }  
  132.     free(lista);   
  133. }
  134.  
  135. /* ******************************************************************
  136.  *                  PRIMITIVAS LISTA_ITER EXTERNAS
  137.  * *****************************************************************/
  138.  
  139. lista_iter_t* lista_iter_crear(lista_t *lista){
  140.     lista_iter_t* iter = malloc(sizeof(lista_iter_t));
  141.     if (!iter) return NULL;
  142.     iter -> actual = lista->primero;   
  143.     iter -> listaIT = lista;
  144.     iter -> anterior = NULL;
  145.     return iter;
  146. }
  147.  
  148. bool lista_iter_avanzar(lista_iter_t *iter){
  149.     if(!iter->actual) return false;
  150.  
  151.     nodo_t* aux = iter->actual->proximo;
  152.  
  153.     iter -> anterior = iter -> actual;
  154.     iter -> actual = aux;
  155.     return true;
  156. }
  157. bool lista_iter_al_final(const lista_iter_t *iter){
  158.     if (!iter -> actual) return true;
  159.     return false;
  160. }  
  161.  
  162. void* lista_iter_ver_actual(const lista_iter_t *iter){
  163.     if (lista_iter_al_final(iter) || lista_esta_vacia(iter -> listaIT)) return NULL;
  164.     return iter->actual->dato;
  165. }
  166.  
  167. void lista_iter_destruir(lista_iter_t* iter){
  168.     free(iter);
  169. }
  170.  
  171.  
  172. bool lista_iter_insertar(lista_iter_t *iter, void *dato){
  173.     nodo_t* aux = crear_nodo(dato);
  174.     if(!aux) return false;
  175.  
  176.     if(!iter->anterior){
  177.         if(lista_esta_vacia(iter->listaIT))
  178.             iter->listaIT->ultimo = aux;
  179.         aux -> proximo = iter->listaIT->primero;
  180.         iter -> listaIT -> primero = aux;
  181.         iter->actual = aux;
  182.     }
  183.     else if(lista_iter_al_final(iter)){
  184.         iter -> anterior -> proximo = aux;
  185.         iter -> actual = aux;
  186.         iter -> listaIT -> ultimo = aux;
  187.     }
  188.     else {
  189.         aux -> proximo = iter -> actual;
  190.         iter -> anterior -> proximo = aux;
  191.         iter->actual = aux;
  192.     }
  193.     iter -> listaIT -> largo ++;
  194.     return true;
  195. }
  196.  
  197. void* lista_iter_borrar(lista_iter_t *iter){
  198.     if (lista_esta_vacia(iter->listaIT) || lista_iter_al_final(iter)) return NULL;
  199.  
  200.     if(!iter->anterior){
  201.         iter->actual = iter->actual->proximo;
  202.         return lista_borrar_primero(iter->listaIT);
  203.     }
  204.  
  205.     nodo_t* nodo_actual = iter->actual;
  206.     void* dato = nodo_actual->dato;
  207.     nodo_t* nodo_proximo = iter->actual->proximo;
  208.  
  209.    
  210.     if(!iter->actual->proximo){
  211.         iter->listaIT->ultimo = iter->anterior;
  212.         free(iter->actual);
  213.         iter->actual = NULL;
  214.     }
  215.     else{
  216.         free(iter->actual);
  217.         iter->anterior->proximo = nodo_proximo;
  218.         iter->actual = nodo_proximo;
  219.     }
  220.     iter->listaIT->largo--;
  221.     return dato;
  222.     }
  223.  
  224. /* ******************************************************************
  225.  *                  PRIMITIVA LISTA_ITER INTERNA
  226.  * *****************************************************************/
  227.  
  228. void lista_iterar(lista_t* lista, bool(*visitar)(void*,void*), void* extra){
  229.     nodo_t* lista_aux = lista->primero;
  230.     bool condicion = true;
  231.  
  232.     while(condicion && lista_aux){
  233.  
  234.         void* dato = lista_aux -> dato;
  235.         condicion=visitar(dato,extra);
  236.         nodo_t* proximo = lista_aux->proximo;
  237.         lista_aux = proximo;
  238.     }
  239. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement