Advertisement
Guest User

Untitled

a guest
Oct 28th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.10 KB | None | 0 0
  1. //Lista.c
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include "lista.h"
  5.  
  6. const int LST_NO_INI=3;
  7. const int LST_POS_INV=4;
  8.  
  9.  
  10.  
  11. //Retorna una nueva lista vacia.
  12. lista_t lista_crear() {
  13. //Asigno la cantidad de memoria necesaria.
  14. lista_t lista=(lista_t) malloc(sizeof(struct lista_eficiente));
  15.  
  16. //Creo la lista.
  17. lista->cantidad_elementos=0;
  18. lista->primera_celda=NULL;
  19.  
  20. return lista;
  21. }
  22.  
  23. //Inserto un elemento en una posicion pasada como parametro
  24. //Si la posicion es mayor a la cantidad de elementos, finaliza la ejecucion con error LST_POS_INV
  25. //Si la posicion es igual a la cantidad de elementos, inserto al final.
  26. int lista_insertar(lista_t lista, unsigned int pos, int elem) {
  27. //Si la posicion es mayor que la cantidad de elementos salgo con error de posicion invalida.
  28. if(pos>lista->cantidad_elementos)
  29. exit(LST_POS_INV);
  30.  
  31. //Obtengo la celda donde debo insertar.
  32. int posCelda=pos/4;
  33. if(lista->primera_celda==NULL) {
  34. lista->primera_celda=(celda_t*) malloc(sizeof(celda_t));
  35. }
  36. celda_t* celda_actual=lista->primera_celda;
  37.  
  38. //Recorro hasta encontrar la celda donde agregar.
  39. int i;
  40. for(i=0;i<posCelda;i++) {
  41. //Si esa celda no existe la creo.
  42. if((celda_actual->proxima_celda)==NULL) {
  43. celda_t* nuevaCelda=(celda_t*)malloc(sizeof(celda_t));
  44. nuevaCelda->proxima_celda=NULL;
  45. celda_actual->proxima_celda=nuevaCelda;
  46.  
  47. }
  48. celda_actual=celda_actual->proxima_celda;
  49. }
  50.  
  51. int posArreglo=pos%4;
  52. if(pos==(lista->cantidad_elementos))
  53. lista->cantidad_elementos++;
  54.  
  55. celda_actual->elementos[posArreglo]=elem;
  56.  
  57. printf("lista_insertar\n");
  58. return 0;
  59. }
  60.  
  61. //Elimina un elemento de la lista segun la posicion pasada como parametro
  62. //Si la posicion pasada es mayor que la cantidad de elementos, finaliza la ejecucion con error LST_POS_INV
  63. int lista_eliminar(lista_t lista, unsigned int pos) {
  64. //Salgo con error si la posicion no existe.
  65. if(pos>=lista->cantidad_elementos) {
  66. exit(LST_POS_INV);
  67. }
  68. //Obtengo la celda donde voy a eliminar
  69. int posCelda=pos/4;
  70. celda_t* celda_actual=lista->primera_celda;
  71. int i;
  72. //Recorro hasta llegar a esa celda
  73. for(i=0;i<posCelda;i++) {
  74. celda_actual=celda_actual->proxima_celda;
  75. }
  76. //Obtengo la posicion del arreglo de esa celda donde eliminar.
  77. int posArreglo=pos%4;
  78.  
  79. //Acomodo todos los elementos restantes del arreglo para cerrar el espacio creado por elemento eliminado.
  80. while(pos<lista->cantidad_elementos) {
  81. //Muevo cada elemento i+1 al i en el arreglo de la celda.
  82. for(;posArreglo<4 && (pos<lista->cantidad_elementos);posArreglo++) {
  83. celda_actual->elementos[posArreglo]=celda_actual->elementos[posArreglo+1];
  84. pos++;
  85. }
  86. //Cuando termino con el arreglo de esa celda me muevo a la celda siguiente1
  87. if(pos<lista->cantidad_elementos) {
  88. celda_actual->elementos[3]=celda_actual->proxima_celda->elementos[0];
  89. celda_actual=celda_actual->proxima_celda;
  90. posArreglo=0;
  91. }
  92. }
  93. lista->cantidad_elementos--;
  94. return 1;
  95.  
  96. }
  97.  
  98. //Retorna la cantidad de elementos de la lista.
  99. //Si la lista no esta inicializada finaliza la ejecucion con error LST_NO_INI
  100. int lista_cantidad(lista_t lista) {
  101. //Si la lista no esta inicializada corta la ejecucion y sale con error.
  102. if(lista==NULL) {
  103. exit(LST_NO_INI);
  104. }
  105. return lista->cantidad_elementos;
  106. }
  107.  
  108. //Retorna el elemento en la posicion pasada como parametro
  109. //Si la posicion es mayor a la cantidad de elementos de la lista finaliza la ejecucion con error LST_POS_INV
  110. int lista_obtener(lista_t lista, unsigned int pos) {
  111.  
  112. //Si la lista no esta inicializada salgo con error.
  113. if(lista==NULL){
  114. exit(LST_NO_INI);
  115. }
  116. //Si la posicion no es valida corta la ejecucion con error.
  117. if(pos>(lista->cantidad_elementos-1)) {
  118. exit(LST_POS_INV);
  119. }
  120. celda_t* celda_actual=lista->primera_celda;
  121. //Recorro la lista tantas veces como indique el parametro "pos".
  122. int i;
  123. for(i=0;i<pos/4;i++) {
  124. celda_actual=celda_actual->proxima_celda;
  125. }
  126. return celda_actual->elementos[pos%4];
  127. }
  128.  
  129. int lista_adjuntar(lista_t lista, int elem) {
  130. //Uso el metodo lista_insertar con la cantidad de elementos de la lista como posicion
  131. int to_return=lista_insertar(lista,(lista->cantidad_elementos),elem);
  132. printf("lista %u size %d elem %d\n",lista,lista_cantidad(lista),elem );
  133. return to_return;
  134. }
  135.  
  136. //Metodo recursivo que recorre todas las celdas y les hace free cuando vuelve de la recursion
  137. void destruir(celda_t* celda) {
  138. //Si hay mas celdas llamo recursivamente
  139. if((celda->proxima_celda)!=NULL){
  140. printf("Destruir. Celda: %u %u %d\n",celda,(celda->proxima_celda),(celda->proxima_celda!=NULL));
  141. destruir(celda->proxima_celda);
  142. }
  143. printf("x\n");
  144. free(celda);
  145. }
  146.  
  147. //Agrego un elemento al final de la lista
  148. //Si la lista no esta inicializada finaliza la ejecucion con error LST_NO_INI
  149. int lista_destruir(lista_t* lista) {
  150. if((*lista)->primera_celda==NULL) {
  151. exit(LST_NO_INI);
  152. }
  153. //Obtengo la primera celda.
  154. celda_t* celda=(*lista)->primera_celda;
  155. //Lamo recursivamente para liberar el espacio de las celdas.
  156. printf("Antes de destruir en lista\n");
  157. destruir(celda);
  158. printf("Despues de destruir en lista\n");
  159. free(*lista);
  160.  
  161. return 0;
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement