Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Ejercicios: Tipos de Datos Abstractos

Universidad Nacional de Río Negro

Ejercicios de Tipos de Datos Abstractos

Acerca de

Estos ejercicios tienen como propósito dominar el diseño e implementación de Tipos de Datos Abstractos (TAD) en C, aplicando un encapsulamiento estricto mediante punteros opacos y la manipulación de listas enlazadas dinámicas.

Capítulos de Apunte Correspondientes

Cuestiones de Estilo Aplicables


Lista Enlazada Simple - Operaciones Básicas

Implementar un TAD de lista enlazada simple con su interfaz completa.

1
2
3
4
5
6
7
// lista.h
typedef struct lista lista_t;

lista_t* crear_lista(void);
void destruir_lista(lista_t* lista);
bool lista_vacia(const lista_t* lista);
size_t lista_longitud(const lista_t* lista);

Ejercicio 22.1 - Inserción al Inicio ⭐⭐☆☆☆

Implementar la operación de insertar un elemento al principio de la lista. Esta operación debe tener complejidad O(1)O(1).

bool insertar_al_inicio(lista_t* lista, int dato);

Ejercicio 22.2 - Inserción al Final ⭐⭐☆☆☆

Implementar la operación de insertar un elemento al final de la lista. Analizar la complejidad: O(n)O(n) sin puntero al último, O(1)O(1) con puntero al último.

bool insertar_al_final(lista_t* lista, int dato);

Ejercicio 22.3 - Ver Primero y Último ⭐⭐☆☆☆

Implementar operaciones para obtener el primer y último elemento sin modificar la lista.

bool ver_primero(const lista_t* lista, int* dato);
bool ver_ultimo(const lista_t* lista, int* dato);

Ejercicio 22.4 - Borrar Primero ⭐⭐☆☆☆

Implementar la operación de eliminar el primer elemento y retornar su valor. Complejidad: O(1)O(1).

bool borrar_primero(lista_t* lista, int* dato);

Lista Enlazada - Operaciones de Búsqueda

Ejercicio 22.5 - Buscar Elemento ⭐⭐☆☆☆

Implementar una función que determine si un elemento está presente en la lista. Retornar true si lo encuentra.

bool lista_pertenece(const lista_t* lista, int dato);

Complejidad: O(n)O(n) en el peor caso.

Ejercicio 22.6 - Obtener Elemento en Posición ⭐⭐☆☆☆

Implementar una función que retorne el elemento en una posición específica (índice basado en 0).

bool lista_obtener(const lista_t* lista, size_t posicion, int* dato);

Retornar false si la posición es inválida.

Ejercicio 22.7 - Contar Ocurrencias ⭐⭐☆☆☆

Implementar una función que cuente cuántas veces aparece un elemento en la lista.

size_t lista_contar(const lista_t* lista, int dato);

Lista Enlazada - Operaciones Avanzadas

Ejercicio 22.8 - Insertar en Posición ⭐⭐☆☆☆

Implementar una función que inserte un elemento en una posición específica.

bool lista_insertar_en(lista_t* lista, size_t posicion, int dato);

Casos especiales:

Ejercicio 22.9 - Eliminar por Valor ⭐⭐☆☆☆

Implementar la operación de eliminar todas las ocurrencias de un elemento y liberar sus nodos correspondientes en memoria.

bool lista_eliminar(lista_t* lista, int dato);

Ejercicio 22.10 - Invertir Lista ⭐⭐☆☆☆

Reorganizar los enlaces de los nodos de la lista para invertir su orden de manera destructiva (in-place, O(n)O(n) tiempo, O(1)O(1) memoria).

void lista_invertir(lista_t* lista);

Ejercicio 22.11 - Concatenar Listas ⭐⭐☆☆☆

Desarrollar una función que anexe de forma destructiva todos los elementos de la segunda lista al final de la primera.

void lista_concatenar(lista_t* destino, lista_t* origen);

Ejercicio 22.12 - TAD Contador ⭐☆☆☆☆

Implementá un contador simple con:

Orientación:


Ejercicio 22.13 - TAD Pila (Stack) ⭐⭐☆☆☆

Implementá pila con array estático de tamaño fijo:

Orientación:


Ejercicio 22.14 - TAD Cola (Queue) ⭐⭐⭐☆☆

Implementá cola FIFO con lista enlazada:

Orientación:


Ejercicio 22.15 - TAD Lista Enlazada ⭐⭐⭐☆☆

Implementá lista enlazada simple:

Orientación:


Ejercicio 22.16 - TAD Conjunto (Set) ⭐⭐⭐⭐☆

Implementá conjunto sin elementos repetidos:

Orientación:


Ejercicio 22.17 - TAD Diccionario (Map) ⭐⭐⭐⭐☆

Implementá diccionario clave-valor (strings a enteros):

Orientación:


Ejercicio 22.18 - TAD Pila Genérica ⭐⭐⭐⭐☆

Pila que almacena void * (cualquier tipo):

Orientación:


Ejercicio 22.19 - TAD Cola de Prioridad ⭐⭐⭐⭐⭐

Cola donde elementos con mayor prioridad salen primero:

Orientación:


Ejercicio 22.20 - TAD Árbol Binario de Búsqueda ⭐⭐⭐⭐⭐

ABB con operaciones estándar:

Orientación:


Ejercicio 22.21 - TAD Grafo ⭐⭐⭐⭐⭐

Grafo dirigido con listas de adyacencia:

Orientación:


Ejercicio 22.22 - TAD Matriz Dispersa ⭐⭐⭐⭐⭐

Matriz que solo almacena elementos no cero:

Orientación:


Ejercicio 22.23 - TAD Cadena Dinámica ⭐⭐⭐⭐☆

String que crece automáticamente:

Orientación:


Ejercicio 22.24 - TAD Tabla Hash ⭐⭐⭐⭐⭐

Hash table con manejo de colisiones:

Orientación:


Ejercicio 22.25 - TAD Buffer Circular ⭐⭐⭐⭐☆

Buffer circular para comunicación productor-consumidor:

Orientación:


Ejercicio 22.26 - TAD Iterador ⭐⭐⭐⭐⭐

Iterador externo para lista:

Orientación:


Ejercicio 22.27 - TAD Árbol AVL ⭐⭐⭐⭐⭐

Árbol auto-balanceado:

Orientación:


Ejercicio 22.28 - TAD Heap (Min/Max) ⭐⭐⭐⭐⭐

Heap binario genérico:

Orientación:


Ejercicio 22.29 - TAD Cache LRU ⭐⭐⭐⭐⭐

Cache con política Least Recently Used:

Orientación:


Ejercicio 22.30 - TAD Multi-Conjunto (Bag) ⭐⭐⭐⭐⭐

Permite elementos repetidos con conteo:

Orientación:


Ejercicio 22.31 - Sistema de TADs Interconectados ⭐⭐⭐⭐⭐

Sistema completo: Biblioteca de libros usando múltiples TADs:

Operaciones:

Orientación:


Notas Finales

Estas consignas cubren el diseño e implementación de TADs desde básicos hasta complejos, enfatizando encapsulamiento, modularidad y reutilización.