Advertisement
diofanto33

list.c

Jun 22nd, 2023 (edited)
109
0
Never
3
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.88 KB | Pets | 0 0
  1. /* author: diofanto33
  2.  * date: 2023-06-22
  3.  * time: 18:52
  4.  *
  5.  * two spaces indentation
  6.  *
  7.  */
  8.  
  9. #include "list.h"
  10.  
  11. #include <assert.h>
  12. #include <stdbool.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15.  
  16. struct _list
  17. {
  18.   struct _node* head;
  19.   ListSize size;
  20. };
  21.  
  22. struct _node
  23. {
  24.   elem e;
  25.   struct _node* next;
  26. };
  27.  
  28. /**
  29.  * @brief Invariante de represetación
  30.  *    Verifica que se cumplan:
  31.  *  
  32.  *   1) Existencia: Inicializacion
  33.  *   2) Consistencia: el campo size en relacion
  34.  *      con la cantidad de nodos de la lista.
  35.  *
  36.  * @param: l Lista
  37.  * @return: true Si se cumplen 1 y 2, false si no.
  38.  */
  39. static bool
  40. invrep(list l)
  41. {
  42.   bool check = (l != NULL);
  43.   ListSize check_size = 0u;
  44.   if(check)
  45.   {
  46.     struct _node * sp = l->head;
  47.     while(sp != NULL)
  48.     {
  49.       check_size = check_size + 1u;
  50.       sp = sp->next;
  51.     }
  52.   }
  53.   check = check && (check_size==l->size);
  54.  
  55.   return(check);
  56. }
  57.  
  58. /**
  59.  * @brief Crea un nodo de la lista nuevo
  60.  *
  61.  * @param e Elemento que contendrá el nodo
  62.  * @return struct _node* Nuevo nodo creado o NULL si no hay memoria
  63.  */
  64. static
  65. struct _node*
  66. create_node(elem e)
  67. {
  68.   struct _node* res = malloc(sizeof(struct _node));
  69.   if(res != NULL)
  70.   {
  71.     res->e = e;
  72.     res->next = NULL;
  73.   }
  74.  
  75.   return(res);
  76. }
  77.  
  78. /**
  79.  * @brief Destruye el nodo node
  80.  *
  81.  * @param node Nodo a ser destruido
  82.  * @return struct _node* Devuelve NULL si el nodo se destruyó correctamente
  83.  */
  84. static struct _node*
  85. destroy_node(struct _node* killme)
  86. {
  87.   if (killme != NULL)
  88.   {
  89.     free(killme);
  90.     killme = NULL;
  91.   }
  92.   assert(killme == NULL);
  93.  
  94.   return(killme);
  95. }
  96.  
  97. list
  98. list_empty()
  99. {
  100.   list res = NULL;
  101.   res = malloc(sizeof(struct _list));
  102.   assert(res != NULL);
  103.   res->head = NULL;
  104.   res->size = 0u;
  105.   assert(invrep(res));
  106.  
  107.   return(res);
  108. }
  109.  
  110. list
  111. list_addl(list l, elem e)
  112. {
  113.   assert(invrep(l));
  114.   struct _node *new_node = create_node(e);
  115.   new_node->next = l->head;
  116.   l->head = new_node;
  117.  
  118.   /*    if(l->size==0u)
  119.         {
  120.         l->head = new_node;
  121.         }
  122.         else
  123.         {
  124.         new_node->next = l->head;
  125.         l->head = new_node;
  126.         }
  127.         */
  128.   l->size = l->size + 1u;
  129.   assert(invrep(l));
  130.  
  131.   return(l);
  132. }
  133.  
  134. list list_addr(list l, elem e)
  135. {
  136.   assert(invrep(l));
  137.   struct _node* new_node = create_node(e);
  138.   if(l->size != 0u)
  139.   {
  140.     struct _node* sp = l->head;
  141.     while(sp->next != NULL)
  142.     {
  143.       sp = sp->next;
  144.     }
  145.     sp->next = new_node;
  146.   }
  147.   else
  148.   {
  149.     l->head = new_node;
  150.   }
  151.   l->size = l->size + 1u;
  152.   assert(invrep(l));
  153.  
  154.   return(l);
  155. }
  156.  
  157. bool
  158. list_is_empty(list l)
  159. {
  160.   assert(invrep(l));
  161.   return(l->size==0u);
  162. }
  163.  
  164. elem
  165. list_head(list l)
  166. {
  167.   assert(l != NULL && invrep(l) && !list_is_empty(l));
  168.  
  169.   return(l->head->e);
  170. }
  171.  
  172. list
  173. list_tail(list l)
  174. {
  175.   assert(invrep(l) && !list_is_empty(l));
  176.   struct _node *killme = l->head;
  177.   l->head = l->head->next;
  178.   killme = destroy_node(killme);
  179.   l->size = l->size -1u;
  180.   assert(invrep(l));
  181.  
  182.   return(l);
  183. }
  184.  
  185. ListSize
  186. list_length(list l)
  187. {
  188.   assert(l != NULL);
  189.  
  190.   return(l->size);
  191. }
  192.  
  193. void
  194. list_print(list l)
  195. {
  196.   assert(invrep(l));
  197.   if(l->size != 0u)
  198.   {
  199.     fprintf(stdout, "[");
  200.     struct _node *sp = l->head;
  201.     while(sp != NULL)
  202.     {
  203.       fprintf(stdout, " %u, ", sp->e);
  204.       sp = sp->next;
  205.     }
  206.     fprintf(stdout, "]");
  207.   }
  208.   else
  209.   {
  210.     fprintf(stdout, "[]\n");
  211.   }
  212.   assert(invrep(l));
  213. }
  214.  
  215. list
  216. list_destroy(list l)
  217. {
  218.   assert(l != NULL && invrep(l));
  219.   struct _node *sp = l->head;
  220.   while(l->head != NULL)
  221.   {
  222.     sp = l->head->next;
  223.     l->head = destroy_node(l->head);
  224.     l->head = sp;
  225.   }
  226.   free(l);
  227.   l = NULL;
  228.   assert(l==NULL);
  229.  
  230.   return(l);
  231. }
  232.  
  233. /* Funciones Anexas */
  234.  
  235. list
  236. list_greater_than(list l, unsigned int n)
  237. {
  238.   assert(invrep(l));
  239.   struct _list *list = list_empty();
  240.   struct _node *sp = l->head;
  241.   while(sp != NULL)
  242.   {
  243.     if(sp->e > n)
  244.     {
  245.       list = list_addl(list, sp->e);
  246.     }
  247.     sp = sp->next;
  248.   }
  249.   assert(invrep(list) && invrep(l));
  250.  
  251.   return(list);
  252. }
  253.  
  254. unsigned int
  255. list_greater_than_count(list l, unsigned int n)
  256. {
  257.   assert(invrep(l));
  258.   struct _node *sp = l->head;
  259.   unsigned int count = 0u;
  260.   while(sp != NULL)
  261.   {
  262.     if(sp->e > n)
  263.     {
  264.       count = count + 1u;
  265.     }
  266.     sp = sp->next;
  267.   }
  268.   assert(invrep(l));
  269.  
  270.   return(count);
  271. }
  272.  
  273. list
  274. list_insert_at(list l, unsigned int position, elem e)
  275. {
  276.   assert(invrep(l));
  277.   struct _node *sp = l->head;
  278.   struct _node *prev = NULL;
  279.   unsigned int i = 0u;
  280.   while(i < position)
  281.   {
  282.     prev = sp;
  283.     sp = sp->next;
  284.     i = i + 1u;
  285.   }
  286.   struct _node *new_node = create_node(e);
  287.   if(prev != NULL)
  288.   {
  289.     prev->next = new_node;
  290.     new_node->next = sp;
  291.   }
  292.   else
  293.   {
  294.     l->head = new_node;
  295.     new_node->next = sp;
  296.   }
  297.   l->size = l->size + 1u;
  298.   prev = NULL;
  299.   sp = NULL;
  300.   assert(invrep(l));
  301.    
  302.   return(l);
  303. }
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement