Lista de structs en C: ejercicio resuelto
Lista de structs en C: ejercicio resuelto
Si buscas lista de structs en C ejercicio resuelto, aquí tienes la lista enlazada simple donde cada nodo contiene una struct Contacto y el puntero al siguiente nodo. Este patrón combina la gestión de punteros con datos estructurados: hay que liberar tanto los campos dinámicos de la struct como el nodo mismo.
Enunciado
Define una struct Contacto con campos nombre (array de 32 caracteres), telefono (array de 16 caracteres) y siguiente (puntero al siguiente nodo). Implementa:
lista_agregar(cabeza, nombre, tel): inserta un nodo al final.lista_buscar(cabeza, nombre): devuelve el puntero al nodo con ese nombre oNULL.lista_eliminar(cabeza, nombre): elimina el nodo con ese nombre.lista_imprimir(cabeza): imprime todos los contactos.lista_liberar(cabeza): libera todos los nodos.
Solución en C
Resultado esperado
Errores frecuentes
- No devolver la nueva cabeza cuando se elimina el primer nodo: si el nodo a eliminar es la cabeza, hay que actualizar
cabeza = cur->siguientey devolver el nuevo valor al llamador. - Liberar
curantes de guardarcur->siguiente: una vez liberado,cur->siguientees comportamiento indefinido. - No actualizar el puntero
siguientedel nodo anterior al eliminar: deja un puntero colgante que apunta al nodo liberado. - No liberar todos los nodos al final: cada nodo fue asignado con
malloc; hay que recorrer la lista y liberar cada uno.
Aplicación práctica
La lista enlazada de structs es el patrón básico de muchas estructuras de datos reales: tablas hash con encadenamiento para resolver colisiones, colas de eventos en sistemas operativos, gestores de plugins que añaden/eliminan módulos dinámicamente y cachés LRU donde se reordena o elimina la entrada más antigua.
Siguiente ejercicio recomendado
- qsort con structs en C: ejercicio resuelto
- Struct con punteros en C: ejercicio resuelto
- Ficheros en C: ejercicios resueltos
- Todos los ejercicios de C
Práctica guiada y libro completo
Si quieres una ruta completa con progresión real de dificultad:
FAQ
¿Por qué lista_eliminar y lista_agregar devuelven la nueva cabeza?
Porque en C no hay referencias: si la cabeza cambia (se elimina el primer nodo o se inserta cuando la lista está vacía), el llamador debe recibir el nuevo puntero. El patrón idiomático es lista = lista_eliminar(lista, nombre).
¿Cuándo usar lista enlazada en lugar de array dinámico?
La lista es preferible cuando las inserciones/eliminaciones en el medio son frecuentes (O(1) con el puntero al nodo previo) y no necesitas acceso aleatorio. El array dinámico es mejor cuando necesitas acceso por índice (O(1)) o cuando la memoria contigua importa para el rendimiento de caché.
¿Cómo detectar fugas de memoria en listas enlazadas?
Con Valgrind: valgrind --leak-check=full ./programa. Cada nodo asignado con malloc que no se libere aparecerá como “definitely lost”. AddressSanitizer (gcc -fsanitize=address) también detecta accesos a memoria ya liberada (use-after-free).