Está en la página 1de 4

Algoritmos y

Estructuras de Datos
Primer Semestre 2022

Guía de Listas en C

I. Estructuras elementales estáticas


Las estructuras elementales básicas corresponden a stack (pila), queue (cola) y
listas, y pueden ser representadas de manera estática mediante arreglos del tipo ade-
cuado. Recuerde que en su implementación, estas estructuras tienen un tamaño fijo y,
por lo tanto, solo se pueden agregar elementos hasta alcanzar dicho límite (aunque de
ningún tipo de estructura se pueden extraer elementos, si está vacía).

I.1. Pilas
1. Las pilas, caracterizadas por su política lifo (last in, first out, i.e., último en
entrar, primero en salir) definen las operaciones pop (borrar) y push (insertar).
Defina en un encabezado (header, un archivo con extensión .h) el tipo de dato
para una estructura de pila de enteros, junto a los prototipos de las funciones
mencionadas. La implementación de las funciones debe estar en un archivo del
mismo nombre que el encabezado definido, pero con extensión .c.
Puede usar el siguiente typedef dado de ejemplo en su encabezado para definir la
pila:
// Cambie este valor por el tama ñ o de stack que quiera
# define STACK_SIZE 32
typedef struct __stack_t {
int top ;
int values [ STACK_SIZE ];
} stack_t ;

Note que el arreglo que contiene los valores de la pila será el miembro values de
la estructura, mientras que el miembro top señalará cuál es el índice del último
elemento agregado a la pila.
La pila está vacía cuando top < 0 (pues el primer índice del arreglo es 0) y llena,
cuando top == STACK_SIZE

2. Si una pila está vacía, no puede entregar valores. Si está llena, no pueden agregarse
valores. Agregue a su definición las funciones stack_empty, que retorna verdadero
o falso, según si la pila está vacía o no, y stack_full, que retorna verdadero o
falso, según si está llena o no.

3. Modifique las funciones pop y push para que no extraigan o agreguen valores de
la pila, si esta está vacía o llena, respectivamente. Determine qué conviene hacer
(si retornar un valor "por defecto", junto a un mensaje, o reportar un error y salir
del programa).

1
Algoritmos y
Estructuras de Datos
Primer Semestre 2022

Como dato, si se quita un elemento a una pila vacía, se habla de un “stack under-
flow ” (subdesbordamiento de pila) y si se agrega un elemento a una pila llena, de
un “stack overflow ” (desbordamiento de pila).

4. Utilizando su implementación de pilas, cree un programa que verifique si un arre-


glo de números enteros tiene la misma cantidad de números 1 que de números
2.

I.2. Colas
1. Las colas, caracterizadas por su política fifo (first in, first out, i.e., primero
en llegar, primero en salir) definen las operaciones enqueue (encolar, su versión
de insertar) y dequeue (desencolar, su versión de borrar y sacar). Defina en un
encabezado el tipo de dato para una estructura de cola de enteros, junto a
los prototipos de las funciones mencoinadas. La implementación de las funciones
debe estar en un archivo del mismo nombre que el encabezado definido, pero con
extensión .c.
Puede usar el siguiente typedef dado de ejemplo en su encabezado para definir la
cola:
// Cambie este valor por el tama ñ o de stack que quiera
# define QUEUE_SIZE 32
typedef struct __queue_t {
int head ;
int tail ;
int values [ QUEUE_SIZE ];
}

Note que el arreglo que contiene los valores de la cola será el miembro values de
la estructura. El miembro head contiene la cabeza de la lista (primer elemento
ingresado de los actuales) y el miembro tail, la cola, correspondiente al último
elemento agregado.
La cola está vacía cuando head == tail y llena, cuando head == tail + 1, lo que
involucra que el arreglo es “circular”.

2. Si una cola está vacía, no puede entregar valores. Si está llena, no pueden agregarse
valores. Agregue a su definición las funciones queue_empty, que retorna verdadero
o falso, según si la cola está vacía o no, y queue_full, que retorna verdadero o
falso, según si está llena o no.

3. Modifique las funciones enqueue y dequeue para que no extraigan o agreguen


valores de la cola, si esta está vacía o llena, respectivamente. Determine qué con-
viene hacer (si retornar un valor "por defecto", junto a un mensaje, o reportar un
error y salir del programa).

2
Algoritmos y
Estructuras de Datos
Primer Semestre 2022

4. Cree un programa que lea todos los caracteres escritos por el usuario hasta el salto
de línea y los guarde en una cola (recuerde que, en C, los caracteres son enteros de
un byte), usando la estructura que ha definido. A continuación, utilice dicha cola
para clasificar los caracteres en letras, números, espacios y signos de puntuación,
entregando como resultado cuántos caracteres de cada tipo fueron ingresados.

I.3. Pilas y colas

II. Estructuras dinámicas: Listas enlazadas


La más básica de los tipos de datos abstractos (tda) es la lista, pues es lineal y
en el caso de la lista enlazada, permite todas las operaciones básicas sobre conjuntos
dinámicos (modificación y consulta), aunque no siempre del modo más eficiente.

1. Defina en un encabezado la estructura para una lista enlazada de enteros. Defina


en el mismo encabezado las operaciones básicas de modificación de listas, a saber,
insertar y borrar, donde borrar retorna el valor eliminado. En un archivo fuente
(.c) anexo, con el mismo nombre del encabezado, defina estas funciones.

2. Agregue las funciones de consulta sobre listas tanto al encabezado que define
el tda, como al archivo fuente que las implementa: buscar un valor, mínimo,
máximo, sucesor (es decir, el número más bajo en la lista que es mayor que el
valor buscado), predecesor (el número más alto en la lista que es menor que el
valor buscado).

3. Defina tres funciones especiales de inserción: insertar al inicio, insertar al final e


insertar en posición. Note, en esta última, que la estructura básica del tda lista
no define la posición como parte de sus nodos, por lo que tiene que contar en la
misma función dónde se encuentra.

4. Defina una función que permita ordenar la lista de menor a mayor.

5. Modifique las funciones de inserción y borrado, de modo que la lista esté siempre
ordenada (note que esta función vuelve obsoleta la generada en el punto anterior).

6. Cree una función para concatenar dos listas, es decir, dadas dos listas, coloque el
primer elemento de la segunda inmediatamente a continuación del último elemento
de la primera.

7. Cree una función que imprima el contenido de una lista al revés. Pista: pruebe
con recursividad.

8. Cree con algún programa (puede ser con la resolución de ejercicios de guías previas,
por ejemplo) un archivo que contenga una serie de números enteros separados

3
Algoritmos y
Estructuras de Datos
Primer Semestre 2022

por saltos de línea o por espacios. Cree un programa que lea este archivo y los
cargue todos en una lista (utilice las definiciones originales de insertar, no las
que insertan de manera ordenada). Note que será muy difícil saber de antemano
cuántos números habrá, por lo que una estructura dinámica es lo más adecuado,
al crecer según necesidad y no tener un tamaño predefinido. Ordene la lista de
valores y preséntela por pantalla.

9. Implemente el último problema de la sección I.1 utilizando listas dinámicas para


representar pilas. Redefina todas las funciones de pila utilizando esta estructura.

10. Implemente el último problema de la sección I.2 utilizando listas dinámicas para
representar colas. Redefina todas las funciones de cola utilizando esta estructura.
Note que para este problema y el anterior, debe reimplementar la inserción y el
borrado de forma que sigan las reglas de las respectivas estructuras.

También podría gustarte