Vous êtes sur la page 1sur 10

Read forum faster on mobile. Get the Free Tapatalk app?

VIEW
FREE - on Google Play

Ingres o Registrate

Bienvenidos a nuestra comunidad!

Foros Desarrollo y Tecnologas Desarrollo de Software C


C//C
C++++

Este sitio usa cookies. Para continuar usando este sitio, se debe aceptar nuestro uso de
cookies. Ms informacin.

[Aporte] TDA Lista Enlazada


Lotus 6 Ene 2014

EEssttaaddoo ddeell TTeem


maa::Cerrado para nuevas respuestas

6 Ene 2014 #1

Hola gente, aca les dejo un code del TDA Lista Enlazada que implemente. Es
una de las tantas implementaciones que pueden realizarse, no digo que sea
la mas optima. Hay aportes ya hechos sobre este TDA:

listas_enlazadas_c_tfhM.html

LLoottuuss lista_enlazada_c_abstract_data_type_tnsE.html

Newbie Lvl 4
pero he decidido publicar mi implementacion porque diere un poco con
ellas.
131 2 163

Antes de empezar quiero aclarar que programe en linux, por lo tanto el


siguiente codigo va a tener algunas indicaciones necesarias(makele) para la
compilacion del mismo. Igualmente pueden agarrar los mismos archivos y sin
mucho problema compilarlo en otro sistema operativo.

Empecemos:

1) Crean un documento y ponganle el nombre "lista.h" y adentro le ponen el


siguiente codigo:
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
FREE - on Google Play

Mensajes recientes
3.
4. #ifndef LISTA_H
55.. #define LISTA_H
6.
7. #include <stdbool.h>
8. #include <stddef.h>
9.
1100.. /* ******************************************************************
11. * DEFINICION DE LOS TIPOS DE DATOS
12. * *****************************************************************/
13.
14. /* La lista est planteada como una lista de punteros genricos. */
1155..
16. typedef struct iterador lista_iter_t;
17. typedef struct lista lista_t;
18.
19. /* ******************************************************************
2200.. * Primitivas bsicas
21. * *****************************************************************/
22.
23.
24. // Crea una lista.
2255.. // Post: devuelve una nueva lista vaca.
26. lista_t *lista_crear();
27.
28. //Devuelve true si la lista esta vacia, false de lo contrario.
29. //Pre: La lista fue creada
3300.. bool lista_esta_vacia(const lista_t *lista);
31.
32. //Inserta un nuevo elemento a la lista.
33. //Pre:la lista fue creada.
34. //Post:el nuevo elemento fue agregado a la lista en la primera posicion,
3355.. bool lista_insertar_primero(lista_t *lista, void *dato);
36.
37. //Inserta un nuevo elemento a la lista.
38. //Pre:la lista fue creada.
39. //Post:el nuevo elemento fue agregado a la lista en la ultima posicion,
4400.. bool lista_insertar_ultimo(lista_t *lista, void *dato);
41.
42. //Borra el primer elemento de la lista.
43. //Pre:la lista no esta vacia
44. //Post: El siguiente elemento pasa a ser el primero y retorna el dato de
4455.. void *lista_borrar_primero(lista_t *lista);
46.
47. // Devuelve el dato del primer elemento de la lista, en caso de estar va
48. // Pre: la lista fue creada.
49. void *lista_ver_primero(const lista_t *lista);
5500..
51. // Devuelve el largo de la lista.
52. // Pre: la lista fue creada.
53. size_t lista_largo(const lista_t *lista);
54.
5555.. //Destruye la lista por completo, puede recibir una funcion por parametr
56. //que destruya los datos almacenados, o NULL si no es necesaria.
57. // Pre: la lista fue creada. destruir_dato es una funcin capaz de destr
58. // los datos de la lista, o NULL en caso de que no se la utilice.
59. // Post: se eliminaron todos los elementos de la lista.
6600.. void lista_destruir(lista_t *lista, void destruir_dato(void
61.
62.
63. /* ******************************************************************
64. * Primitivas de iteracin
6655.. * *****************************************************************/
66. //Crea un iterador sobre una lista.
67. //Post:El iterador se posiciona sobre el primer elemento de la lista.
68. //Devuelve el iterador.
69. lista_iter_t *lista_iter_crear(const lista_t *lista);
7700..
71. //Avanza una posicion en el iterador, devuelve false si se encuentra en
72. //Post: el iterador avanzo una posicion, devuevle true.
73. bool lista_iter_avanzar(lista_iter_t *iter);
74.
7755.. //Devuelve el dato de la posicion en la que esta posicionado el iterador
76. void *lista_iter_ver_actual(const lista_iter_t *iter);
77.
78. //Devuelve true si el iterador se encuentra al final, false de lo contra
79. bool lista_iter_al_final(const lista_iter_t *iter);
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
FREE - on Google Play

Mensajes recientes
86. * Primitivas de listas junto con iterador
87. * *****************************************************************/
88. //Inserta un elemento en la posicion en la cual esta posicionado el iter
89. //Pre: La lista fue creada.
9900.. //Post:El nuevo elemento se encuentra en la posicion del iterador y se d
91. bool lista_insertar(lista_t *lista, lista_iter_t *iter, void
92.
93. //Borra el elemento de la lista sobre el cual se encuentra el iterador.
94. //Devuelve NULL si la listga esta vacia o el iterador esta posicionado a
9955.. //Pre: la lista fue creada y no esta vacia
96. //Post: se devuelve el dato borrado, la lista consta de un elemento meno
97. void *lista_borrar(lista_t *lista, lista_iter_t *iter);
98.
99. #endif // LISTA_H
110000..
101.

2) Crean otro documento y pongale el nombre "lista.c" y adentro le ponen el


siguiente codigo:

Cdigo Fuente (C++):

1.
2.
3.
4. #include <stdio.h>
55.. #include "lista.h"
6. #include <stdlib.h>
7.
8. typedef struct nodo nodo_t;
9.
1100.. struct iterador{
11. nodo_t* anterior;
12. nodo_t* actual;
13. };
14.
1155.. struct nodo{
16. nodo_t* referencia;
17. void* dato;
18. };
19.
2200.. struct lista{
21. nodo_t* primero;
22. nodo_t* ultimo;
23. size_t largo;
24. };
2255..
26.
27. /* ******************************************************************
28. * IMPLEMENTACION
29. * *****************************************************************/
3300..
31.
32. nodo_t* crear_nodo(void *dato){
33. nodo_t* nodo_nuevo= malloc(sizeof(nodo_t));
34. if (!nodo_nuevo)
3355.. return NULL;
36. nodo_nuevo->dato=dato;
37. return nodo_nuevo;
38.
39. }
4400..
41.
42.
43. /* ******************************************************************
44. * Funciones bsicas
4455.. * *****************************************************************/
46.
47. // Crea una lista.
48. // Post: devuelve una nueva lista vaca.
49. lista_t *lista_crear(){
5500.. lista_t* lista_nueva = malloc(sizeof(lista_t));
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
FREE - on Google Play

Mensajes recientes
57. return lista_nueva;
58. }
59.
6600..
61. //Devuelve true si la lista esta vacia, false de lo contrario.
62. //Pre: La lista fue creada
63. bool lista_esta_vacia(const lista_t *lista){
64. if (lista->largo==0)
6655.. return true;
66.
67. return false;
68. }
69.
7700.. //Inserta un nuevo elemento a la lista.
71. //Pre:la lista fue creada.
72. //Post:el nuevo elemento fue agregado a la lista en la primera posicion,
73. bool lista_insertar_primero(lista_t *lista, void *dato){
74. nodo_t* nodo_nuevo= malloc(sizeof(nodo_t));
7755.. if (!nodo_nuevo)
76. return false;
77. nodo_nuevo->dato=dato;//crear_nodo(dato);
78. //if (!nodo_nuevo) return false;
79.
8800..
81.
82. if (lista_esta_vacia(lista)){
83. nodo_nuevo->referencia=NULL;
84. lista->primero=nodo_nuevo;
8855.. lista->ultimo=nodo_nuevo;
86. }
87. else{
88. nodo_nuevo->referencia = lista->primero;
89. lista->primero = nodo_nuevo;
9900.. }
91. lista->largo++;
92.
93. return true;
94. }
9955..
96. //Inserta un nuevo elemento a la lista.
97. //Pre:la lista fue creada.
98. //Post:el nuevo elemento fue agregado a la lista en la ultima posicion,
99. bool lista_insertar_ultimo(lista_t *lista, void *dato){
110000..
101. nodo_t* nodo_nuevo = crear_nodo(dato);
102. if (!nodo_nuevo) return false;
103.
104. nodo_nuevo->referencia= NULL;
110055..
106.
107. if (lista_esta_vacia(lista)){
108. lista->primero = nodo_nuevo;
109.
111100.. }
111. else{
112. lista->ultimo->referencia= nodo_nuevo;
113.
114. }
111155.. lista->ultimo= nodo_nuevo;
116.
117. lista->largo++;
118.
119. return true;
112200.. }
121.
122. //Borra el primer elemento de la lista.
123. //Pre:la lista no esta vacia
124. //Post: El siguiente elemento pasa a ser el primero y retorna el dato de
112255.. void *lista_borrar_primero(lista_t *lista){
126.
127. if (lista_esta_vacia(lista))
128. return NULL;
129.
113300.. nodo_t* nodo_aux = lista->primero;
131. void* dato_retorno = lista->primero->dato;
132. lista->primero = lista->primero->referencia;
133. if (lista->primero == lista->ultimo)
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
FREE - on Google Play

Mensajes recientes
114400..
141.
142.
143. // Devuelve el dato del primer elemento de la lista, en caso de estar va
144. // Pre: la lista fue creada.
114455.. void *lista_ver_primero(const lista_t *lista){
146. if (lista_esta_vacia(lista))
147. return NULL;
148. return lista->primero->dato;
149. }
115500..
151.
152. // Devuelve el largo de la lista.
153. // Pre: la lista fue creada.
154. size_t lista_largo(const lista_t *lista){
115555.. return lista->largo;
156. }
157.
158.
159. //Destruye la lista por completo, puede recibir una funcion por parametr
116600.. //que destruya los datos almacenados, o NULL si no es necesaria.
161. // Pre: la lista fue creada. destruir_dato es una funcin capaz de destr
162. // los datos de la lista, o NULL en caso de que no se la utilice.
163. // Post: se eliminaron todos los elementos de la lista.
164. void lista_destruir(lista_t *lista, void destruir_dato(void*
116655..
166. while (!lista_esta_vacia(lista)){
167. if (!destruir_dato)
168. lista_borrar_primero(lista);
169. else
117700.. destruir_dato(lista_borrar_primero(lista));
171. }
172. free(lista);
173. }
174.
117755..
176. /* ******************************************************************
177. * Funciones de iteracin
178. * *****************************************************************/
179.
118800.. //Crea un iterador sobre una lista.
181. //Post:El iterador se posiciona sobre el primer elemento de la lista.
182. //Devuelve el iterador.
183. lista_iter_t *lista_iter_crear(const lista_t *lista){
184.
118855.. lista_iter_t* iter=malloc(sizeof(lista_iter_t));
186. if (!iter)
187. return NULL;
188.
189. iter->anterior=NULL;
119900.. iter->actual=lista->primero;
191.
192. return iter;
193.
194. }
119955..
196. //Avanza una posicion en el iterador, devuelve false si se encuentra en
197. //Post: el iterador avanzo una posicion, devuevle true.
198. bool lista_iter_avanzar(lista_iter_t *iter){
199.
220000.. if (lista_iter_al_final(iter)){
201. return false;
202. }
203.
204. iter->anterior=iter->actual;
220055.. iter->actual=iter->actual->referencia;
206. return true;
207.
208. }
209.
221100.. //Devuelve el dato de la posicion en la que esta posicionado el iterador
211. void *lista_iter_ver_actual(const lista_iter_t *iter){
212.
213. if (lista_iter_al_final(iter))
214. return NULL;
221155..
216. return iter->actual->dato;
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
FREE - on Google Play

Mensajes recientes
223. return false;
224. }
222255..
226. //Destruye el iterador.
227. void lista_iter_destruir(lista_iter_t *iter){
228. free(iter);
229. }
223300..
231.
232.
233. /* ******************************************************************
234. * Funciones de listas junto con iterador
223355.. * *****************************************************************/
236. //Inserta un elemento en la posicion en la cual esta posicionado el iter
237. //Pre: La lista fue creada.
238. //Post:El nuevo elemento se encuentra en la posicion del iterador y se d
239. bool lista_insertar(lista_t *lista, lista_iter_t *iter, void
224400..
241. nodo_t* nodo_nuevo = crear_nodo(dato);
242. nodo_nuevo->referencia=iter->actual;
243.
244.
224455.. if (!iter->anterior){
246. lista->primero=nodo_nuevo;
247. }
248. else if (lista_iter_al_final(iter)){
249. iter->anterior->referencia=nodo_nuevo;
225500.. lista->ultimo=nodo_nuevo;
251. }
252. else{
253. iter->anterior->referencia=nodo_nuevo;
254. }
225555..
256. iter->actual=nodo_nuevo;
257. lista->largo++;
258. return true;
259.
226600.. }
261.
262. //Borra el elemento de la lista sobre el cual se encuentra el iterador.
263. //Devuelve NULL si la listga esta vacia y el iterador esta posicionado a
264. //Pre: la lista fue creada y no esta vacia
226655.. //Post: se devuelve el dato borrado, la lista consta de un elemento meno
266. void *lista_borrar(lista_t *lista, lista_iter_t *iter){
267.
268. if (lista_esta_vacia(lista) || lista_iter_al_final(iter)
269. return NULL;
227700..
271. void *dato;
272. nodo_t *nodo_borrado;
273.
274.
227755.. if (!iter->anterior){
276. dato=iter->actual->dato;
277. nodo_borrado=iter->actual;
278. iter->actual = iter->actual->referencia;
279. lista->primero = iter->actual;
228800.. if(lista_largo(lista) == 1)
281. lista->ultimo = iter->actual;
282. }
283. else if(iter->actual->referencia == NULL){
284. dato=iter->actual->dato;
228855.. nodo_borrado=iter->actual;
286. iter->actual = iter->actual->referencia;
287. iter->anterior->referencia = iter->actual;
288. lista->ultimo = iter->anterior;
289. }
229900.. else{
291. dato=iter->actual->dato;
292. nodo_borrado=iter->actual;
293. iter->actual = iter->actual->referencia;
294. iter->anterior->referencia = iter->actual;
229955.. }
296.
297.
298. free(nodo_borrado);
299. lista->largo--;
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
FREE - on Google Play

Mensajes recientes

3) Creamos un archivo de pruebas con el nombre "prueba_lista.c" para que


puedan ver como se utiliza la Lista, que es lo que va a compilar a lo ultimo el
makele:

Cdigo Fuente (C++):

1.
2.
3.
4. #include <stdio.h>
55.. #include "lista.h"
6.
7. /* ******************************************************************
8. * PRUEBAS UNITARIAS
9. * *****************************************************************/
1100..
11.
12.
13. /* Funcion auxiliar para imprimir la lista mediante iteradores */
14. void imprimir_super(lista_t *super)
1155.. {
16. lista_iter_t *iter = lista_iter_crear(super);
17. int i = 1;
18.
19. while (!lista_iter_al_final(iter))
2200.. {
21. char *elemento = lista_iter_ver_actual(iter);
22. printf("%d. %s<span style="color: #666666; font-weight: bold;">\
23. lista_iter_avanzar(iter);
24. i++;
2255.. }
26. lista_iter_avanzar(iter);
27. lista_iter_destruir(iter);
28.
29. }
3300..
31. /*Funcion auxiliar para probar insertar elementos mediante iterador*/
32. void insertar_elementos(lista_t *super){
33. lista_iter_t *iter = lista_iter_crear(super);
34. char *texto_insertar="Hola Nuevo";
3355..
36. for (int i =0;i<5;i++){
37. lista_insertar(super,iter,texto_insertar);
38. lista_iter_avanzar(iter);
39. lista_iter_avanzar(iter);
4400.. }
41. lista_iter_destruir(iter);
42. }
43.
44. /*Funcion auxiliar para probar borrar elementos mediante iterador*/
4455.. void borrar_elementos(lista_t *super){
46.
47. lista_iter_t *iter = lista_iter_crear(super);
48. char *texto_insertar="Hola Nuevo";
49. while (!lista_iter_al_final(iter)){
5500.. char *elemento = (char*)lista_iter_ver_actual(iter);
51. if (elemento==texto_insertar)
52. lista_borrar(super,iter);
53. else
54. lista_iter_avanzar(iter);
5555.. }
56.
57. lista_iter_destruir(iter);
58. }
59.
6600.. /* Funcin auxiliar para imprimir si estuvo OK o no. */
61. void print_test(char* name, bool result)
62. {
63. printf("%s: %s<span style="color: #666666; font-weight: bold;">\n"</
64. }
6655..
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
FREE - on Google Play

Mensajes recientes
72. int valor2=30;
73. int valor3=40;
74. int prueba_masiva=3000;
7755..
76. //Creamos una nueva lista
77. lista_t* lista1=lista_crear();
78. //Creamos otra lista
79. lista_t* super = lista_crear();
8800.. //lista_t* super2 = lista_crear();
81.
82. //Pruebo que la lista creada anteriormente este vacia.
83. print_test("Prueba si lista1 esta vacia", lista_esta_vacia
84.
8855.. //Pruebo lista_ver_primero, debe devolver NULL porque la lista esta
86. print_test("Prueba lista_ver_primero con lista vacia", !
87.
88. //Pruebo de insertar un valor en la primera posicion de la lista.
89. print_test("Prueba insertar_primero al valor1 en lista1"
9900..
91. //La lista ahora no deberia estar vacia y el primer elemento deberia
92. print_test("Prueba que la lista no este vacia", !lista_esta_vacia
93. print_test("Prueba lista_ver_primero con lista no vacia"
94.
9955.. //El largo actual de la lista deberia ser 1.
96. print_test("Prueba lista_largo con 1 elemento", lista_largo
97.
98. //Inserto al final al valor2.
99. print_test("Prueba lista_insertar_ultimo", lista_insertar_ultimo
110000.. print_test("Pruebo que el largo de la lista sea igual a 2"
101.
102. //Borro el primer elemento, y ahora el primero deberia ser valor2.
103. print_test("Prueba lista_borrar_primero", lista_borrar_primero
104. print_test("Prueba que el primer elemento ahora sea valor2"
110055..
106. //Borro el elemento que queda para volver a tenerla vacia.
107. print_test("Prueba borrar el valor2", lista_borrar_primero
108. print_test("Prueba que la lista este vacia", lista_esta_vacia
109.
111100..
111. //Inserto 3000 elementos en la primera posicion.
112. for (int i=0;i<prueba_masiva;i++){
113. lista_insertar_primero(lista1, &valor3);
114. }
111155..
116. //El largo de la lista ahora debe ser 3000 yel primer elemento sea v
117. print_test("Pruebo que el largo de la lista sea 3000", lista_largo
118. print_test("Pruebo que el primero sea valor3", lista_ver_primero
119.
112200.. //Inserto 3000 elementos en la ultima posicion.
121. for (int i=0;i<prueba_masiva;i++){
122. lista_insertar_ultimo(lista1, &valor1);
123. }
124. //La lista ahora debe tener 6000 elementos
112255.. print_test("Pruebo que el largo de la lista sea 6000", lista_largo
126.
127. //Destruyo la lista
128. lista_destruir(lista1, NULL);
129.
113300.. //Insertamos 4 elmentos a la lista super
131. print_test("Pruebo insertar 'leche' ",lista_insertar_ultimo
132. print_test("Pruebo insertar 'huevos' ",lista_insertar_ultimo
133. print_test("Pruebo insertar 'pan' ",lista_insertar_ultimo
134. print_test("Pruebo insertar 'mermelada' ",lista_insertar_ultimo
113355..
136.
137. //Imprimimos la lista mediante iteradores
138. puts("Impresion de la lista con 4 elementos");
139. imprimir_super(super);
114400..
141. //Pruebo de insertar elementos en distintas posiciones y vuelvo a im
142. insertar_elementos(super);
143.
144. puts("Impresion de la lista con elementos agregados por iterador"
114455.. imprimir_super(super);
146.
147. //Borro los elementos agregados y la lista volvera a tener 4 element
148. borrar_elementos(super);
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
FREE - on Google Play

Mensajes recientes
115555..
156. puts("Creamos una lista nueva.");
157. //Creamos de nuevo una lista vacia en super
158.
159. super = lista_crear();
116600.. lista_iter_t *iter = lista_iter_crear(super);
161. print_test("Pruebo avanzar en lista vacia:",!lista_iter_avanzar
162. print_test("Pruebo que el iterador este al final:",lista_iter_al_fin
163. //Destruimos el iterador
164. lista_iter_destruir(iter);
116655.. //Destruimos la lista
166. lista_destruir(super,NULL);
167.
168. }
169.
117700..
171.
172. /* ******************************************************************
173. * PROGRAMA PRINCIPAL
174. * *****************************************************************/
117755..
176. /* Programa principal. */
177.
178. int main(void){
179. /* Ejecuta todas las pruebas unitarias. */
118800.. prueba_lista();

4) Finalmente vamos a crear el archivo makele para compilar llamandolo


desde consola para que aplique los comandos necesarios para que compile
todo junto, para eso se necesita que armen un documento llamado
"Makele" y adentro le ponen lo siguiente:

Spoiler

5) Despues desde consola lo llaman al archivo make le tipeando "make"

ACLARACION: Para utilizar la lista en sus propios proyectos lo que deben


hacer es armar un makele para compilarlo y desde el proyecto que quieren
compilar deben hacer un #include "lista.h", o sea deben hacer como si yo hice
con el archivito de pruebas que les deje.

Saludos!

(Tiene que acceder o registrarse para responder aqu.)

EEssttaaddoo ddeell TTeem


maa::Cerrado para nuevas respuestas

C
Coom
mppaarrttiirr eessttaa ppggiinnaa
0

Foros Desarrollo y Tecnologas Desarrollo de Software C


C//C
C++++
Espaol (AR)
Read forum faster on mobile. Get the Free Tapatalk app?
VIEW
Parts of this site powered by XenForo add-ons from- DragonByte
FREE 2011-2017 DragonByte Technologies Ltd. (Details)
on Google Play Trminos y reglas
Forum software by XenForo 2010-2017 XenForo Ltd.
Mensajes recientes XenForo Add-ons by PHCorner.NET
Traduccin al espaol de XenFcil 2010-2014 xenFcil.com | Style designed by ThemesCorp.

Vous aimerez peut-être aussi