Introducción a la estructuras de datos Introducción a Listas Enlazadas Definición Las listas enlazadas son estructuras de datos semejantes a los array salvo que el acceso a un elemento no se hace mediante un índice sino mediante un puntero. La asigna asignaci ción ón de memor memoria ia es hech hecha a dura durant nte e la ejec ejecuc ució ión. n. En una list lista a los los elementos son contiguos en lo que concierne al enlazado.
Construcción del modelo de un elemento de la lista ara esta!lecer un elemento de la lista" ser# utilizado el tipo struct. El elemento de la lista tendr# un campo dato y un puntero siguiente. El puntero siguiente tiene que ser del mismo tipo que el elemento" elemento" si no" no podr# apuntar apuntar hacia el elemento. elemento. El puntero siguiente permitir# el acceso al pró$imo elemento
typedef struct ElementoLista % char &dato' struct ElementoLista &siguiente (Elemento'
1
ara tener el control de la lista es preferi!le guardar determinados elementos) el primer primer element elemento" o" el *ltimo *ltimo elemen elemento" to" el n*mero n*mero de elemen elementos tos.. ara ello ello ser# empleado otra estructura +no es o!ligatorio" pueden ser utilizadas varia!les,. typedef struct ListaIdentificar % Elemento &inicio' Elemento &fin' int tama-o' (Lista'
peraciones so!re las listas enlazadas ara la inserción y la eliminación" una *nica función !astar# si est# !ien conce!ida de acuerdo a lo que se necesite. De!o recordar que este artículo es puramente did#ctico. or lo tanto" he escrito una función para cada operación de inserción y eliminación.
Inicialización vo id in icia li za ci on +Lista
& li sta ,'
/odelo de la función) void inicializacion +Lista &lista,% lista01inicio 2 34LL' lista01fin 2 34LL' tama-o 2 5'( Inserción de un elemento en la lista Inserción y el registro de los elementos) declaración del elemento que se va a insertar" asignación de la memoria para el nuevo elemento" llena el contenido del campo de datos" actualización de los punteros hacia el primer y *ltimo elemento si es necesario. Caso particular) en una lista con un *nico elemento" el primero es al mismo tiempo el *ltimo. 6ctualizar el tama-o de la lista ara a-adir un elemento a la lista se presentan varios casos) la inserción en una lista vacía" la inserción al inicio de la lista" la inserción al final de la lista y la inserción en otra parte de la lista.
2
ara tener el control de la lista es preferi!le guardar determinados elementos) el primer primer element elemento" o" el *ltimo *ltimo elemen elemento" to" el n*mero n*mero de elemen elementos tos.. ara ello ello ser# empleado otra estructura +no es o!ligatorio" pueden ser utilizadas varia!les,. typedef struct ListaIdentificar % Elemento &inicio' Elemento &fin' int tama-o' (Lista'
peraciones so!re las listas enlazadas ara la inserción y la eliminación" una *nica función !astar# si est# !ien conce!ida de acuerdo a lo que se necesite. De!o recordar que este artículo es puramente did#ctico. or lo tanto" he escrito una función para cada operación de inserción y eliminación.
Inicialización vo id in icia li za ci on +Lista
& li sta ,'
/odelo de la función) void inicializacion +Lista &lista,% lista01inicio 2 34LL' lista01fin 2 34LL' tama-o 2 5'( Inserción de un elemento en la lista Inserción y el registro de los elementos) declaración del elemento que se va a insertar" asignación de la memoria para el nuevo elemento" llena el contenido del campo de datos" actualización de los punteros hacia el primer y *ltimo elemento si es necesario. Caso particular) en una lista con un *nico elemento" el primero es al mismo tiempo el *ltimo. 6ctualizar el tama-o de la lista ara a-adir un elemento a la lista se presentan varios casos) la inserción en una lista vacía" la inserción al inicio de la lista" la inserción al final de la lista y la inserción en otra parte de la lista.
2
Inserción en una lista vacía Ejemplo de la función) int ins7en7lista7vacia +Lista &lista" char &dato,'
La función retorna 8 en caso de error" si no devuelve 5. Las etapas son asignar memoria para el nuevo elemento" completa el campo de dato datos s de ese ese nuevo nuevo elem elemen ento to"" el punt puntero ero sigui siguien ente te de este este nuevo nuevo elem elemen ento to apuntar# hacia 34LL +ya que la inserción es realizada en una lista vacía" se utiliza la dirección del puntero inicio que vale 34LL," los punteros inicio y fin apuntaran hacia el nuevo elemento y el tama-o es actualizado.
3
La función) 9& inserción en una lista vacía &9 int ins7en7lista7vacia +Lista & lista" char &dato,% Element &nuevo7elemento' if ++nuevo7elemento 2 +Element &, malloc +sizeof +Element,,, 22 34LL, return 08' if ++nuevo 7elemento01dato 2 +char &, malloc +:5 & sizeof +char,,, 22 34LL, return 08' strcpy +nuevo7elemento01dato" dato,' nuevo7elemento01siguiente 2 34LL' lista01inicio 2 nuevo7elemento' lista01fin 2 nuevo7elemento' lista01tama-o;;' return 5' (
Inserción al inicio de la lista Ejemplo de la función) int ins7inicio7lista +Lista &lista"char &dato,' La función da 08 en caso de error" de lo contrario da 5. Etapas) asignar memoria al nuevo elemento" rellenar el campo de datos de este nuevo elemento" el puntero siguiente del nuevo elemento apunta hacia el primer elemento" el puntero inicio apunta al nuevo elemento" el puntero fin no cam!ia" el tama-o es incrementado
4
La función) 9& inserción al inicio de la lista &9 int ins7inicio7lista +Lista & lista" char &dato,% Element &nuevo7elemento' if ++nuevo7elemento 2 +Element &, malloc +sizeof +Element,,, 22 34LL, return 08' if ++nuevo7elemento01dato 2 +char &, malloc +:5 & sizeof +char,,, 22 34LL, return 08' strcpy +nuevo7elemento01dato" dato,' nuevo7elemento01siguiente 2 lista01inicio lista01inicio 2 nuevo7elemento' lista01tama-o;;' return 5' (
5
Inserción al final de la lista Ejemplo de la función) int ins7fin7lista +Lista &lista" Element &actual" char &dato,' La función da 08 en caso de error" si no arroja 5. Etapas) proporcionar memoria al nuevo elemento" rellenar el campo de datos del nuevo elemento" el puntero siguiente del *ltimo elemento apunta hacia el nuevo elemento" el puntero fin apunta al nuevo elemento" el puntero inicio no varía" el tama-o es incrementado)
6
La función) 9&inserción al final de la lista &9 int ins7fin7lista +Lista & lista" Element & actual" char &dato,% Element &nuevo7elemento' if ++nuevo7elemento 2 +Element &, malloc +sizeof +Element,,, 22 34LL, return 08' if ++nuevo7elemento01dato 2 +char &, malloc +:5 & sizeof +char,,, 22 34LL, return 08' strcpy +nuevo7elemento01dato" dato,' actual01siguiente 2 nuevo7elemento' nuevo7elemento01siguiente 2 34LL' lista01fin 2 nuevo7elemento' lista01tama-o;;' return 5' ( Inserción en otra parte de la lista Ejemplo de la función) int ins7lista +Lista &lista" char &dato"int pos,' La función arroja 08 en caso de error" si no da 5. La inserción se efectuar# despu
7
Etapas) asignación de una cantidad de memoria al nuevo elemento" rellenar el campo de datos del nuevo elemento" escoger una posición en la lista +la inserción se har# luego de ha!er elegido la posición," el puntero siguiente del nuevo elemento apunta hacia la dirección a la que apunta el puntero siguiente del elemento actual" el puntero siguiente del elemento actual apunta al nuevo elemento" los punteros inicio y fin no cam!ian" el tama-o se incrementa en una unidad)
8
La función) 9& inserción en la posición solicitada &9 int ins7lista +Lista & lista" char &dato" int pos,% if +lista01tama-o > ?, return 08' if +pos > 8 @@ pos 12 lista01tama-o, return 08' Element &actual' Element &nuevo7elemento' int i' if ++nuevo7elemento 2 +Element &, malloc +sizeof +Element,,, 22 34LL, return 08' if ++nuevo7elemento01dato 2 +char &, malloc +:5 & sizeof +char,,, 22 34LL, return 08' actual 2 lista01inicio' for +i 2 8' i > pos' ;;i, actual 2 actual01siguiente' if +actual01siguiente 22 34LL, return 08' strcpy +nuevo7elemento01dato" dato,' nuevo7elemento01siguiente 2 actual01siguiente' actual01siguiente 2 nuevo7elemento' lista01tama-o;;' return 5'
9
Eliminación de un elemento de la lista ara eliminar un elemento de la lista) uso de un puntero temporal para almacenar la dirección de los elementos a !orrar" el elemento a eliminar se encuentra despu
10
La función) 9& eliminación al inicio de la lista &9 int sup7inicio +Lista & lista,% if +lista01tama-o 22 5, return 08' Element &sup7elemento' sup7element 2 lista01inicio' lista01inicio 2 lista01inicio01siguiente' if +lista01tama-o 22 8, lista01fin 2 34LL' free +sup7elemento01dato,' free +sup7elemento,' lista01tama-o00' return 5' ( 11
Eliminación en otra parte de la lista Ejemplo de la función) int sup7en7lista +Lista &lista" int pos,' La función da 08 en caso de error" si no devuelve 5. Etapas) el puntero sup7elem contendr# la dirección hacia la que apunta el puntero siguiente del elemento actual" el puntero siguiente del elemento actual apuntara hacia el elemento al que apunta el puntero siguiente del elemento que sigue al elemento actual en la lista. =i el elemento actual es el pen*ltimo elemento" el puntero fin de!e ser actualizado. El tama-o de la lista ser# disminuido en un elemento)
12
La función) 9& eliminar un elemento despu
int sup7en7lista +Lista & lista" int pos,% if +lista01tama-o >2 8 @@ pos > 8 @@ pos 12 lista01tama-o, return 08' int i' Element &actual' Element &sup7elemento' actual 2 lista01inicio' for +i 2 8' i > pos' ;;i, actual 2 actual01siguiente' sup7elemento 2 actual01siguiente' actual01siguiente 2 actual01siguiente01siguiente' if+actual01siguiente 22 34LL, lista01fin 2 actual' free +sup7elemento01dato,' free +sup7elemento,' lista01tama-o00' return 5' ( Aisualización de la lista ara mostrar la lista entera hay que posicionarse al inicio de la lista +el puntero inicio lo permitir#,. Luego usando el puntero siguiente de cada elemento la lista es recorrida del primero al *ltimo elemento. La condición para detener es proporcionada por el puntero siguiente del *ltimo elemento que vale 34LL. La función) 9& visualización de la lista &9 void visualización +Lista & lista,% Element &actual' actual 2 lista01inicio' Bhile +actual 2 34LL,% printf +p 0 sFn" actual" actual01dato,' actual 2 actual01siguiente' ( ( Destrucción de la lista ara destruir la lista entera" he utilizado la eliminación al inicio de la lista porque el tama-o es mayor a cero. 14
La función 9& destruir la lista &9 void destruir +Lista &lista,% Bhile +lista01tama-o 1 5, sup7inicio +lista,' ( ilas Las pilas son otro tipo de estructura de datos lineales" las cuales presentan restricciones en cuanto a la posición en la cual pueden realizarse las inserciones y las e$tracciones de elementos. 4na pila es una lista de elementos en la que se pueden insertar y eliminar elementos sólo por uno de los e$tremos. Como consecuencia" los elementos de una pila ser#n eliminados en orden inverso al que se insertaron. Es decir" el *ltimo elemento que se metió a la pila ser# el primero en salir de ella. 4na pila es un tipo especial de lista a!ierta en la que sólo se pueden insertar y eliminar nodos en uno de los e$tremos de la lista. Estas operaciones se conocen como push y pop" respectivamente empujar y tirar. 6dem#s" las escrituras de datos siempre son inserciones de nodos" y las lecturas siempre eliminan el nodo leído. Estas características implican un comportamiento de lista LIG +Last In Girst ut," el *ltimo en entrar es el primero en salir.
Hipo de dato 6!stracto ila.
15
Hipo de dato 6!stracto ila en el que los elementos de almacenan de manera secuencial" no e$isten !ifurcaciones al momento de acceder a los datos" se acceden por medio de la dirección de memoria. Los elementos se pueden insertar o acceder por un *nico e$tremo llamado tope" por esta razón las pilas se conocen como un HD6 de acceso restringido. =olo se puede eliminar o insertar por el tope. ilas con vectores. Implementación de pila) define tam7ma$ ?5 9&el tama-o ma$imo sera ?5. se puede cam!iar&9 typedef char elemento' 9&va a ser una pila de caracteres&9 typedef struct % int tope' elemento vJtam7ma$K' ( pila' El tipo elemento variar# dependiendo del programa" así como tam7ma$. peraciones) Aacia) int vacia+pila8, pila pila8' % if+pila8.tope22tam7ma$,% return 8' ( else% return 5' ( (9&Gin esta vacia&9 Esta función devuelve 8 si la pila est# vacía y 5 si no lo est#. llena) int llena+pila8, pila pila8' % if++pila8.tope,225,% return 8' ( else% return 5' ( 16
(9&fin llena&9 Esta función devuelve 8 si la pila est# llena y 5 si no lo est#. sacar) int sacar+punt7pila, pila &punt7pila' % int vacia+,' int valor7vacia' valor7vacia2vacia+&punt7pila,' if+valor7vacia228,% return 5' ( else% +&punt7pila,.tope2+&punt7pila,.tope;8' return 8' ( (9&fin sacar&9 Esta función elimina el elemento cima de la pila y devuelve 8 si la pila no est# vacía y simplemente devuelve 5 si la pila est# vacía. +6plicar =6C6 a una pila vacía la deja igual,. /eter) int meter+lo7que7meto"punt7pila, elemento lo7que7meto' pila &punt7pila' % int llena+,' int copia7tope' int valor7llena' valor7llena2llena+&punt7pila,' if+valor7llena228,% return 5' ( else% copia7tope2+&punt7pila,.tope' +&punt7pila,.vJcopia7tope08K2lo7que7meto' +&punt7pila,.tope2copia7tope08' return 8' ( (9&Gin meter&9 17
Esta función mete el elemento lo7que7meto en la pila y devuelve 8 si no est# vacía y simplemente devuelve 5 si est# llena. Cima) elemento cima+pila8, 9&8M hay q asegurarse d q no est< vacía&9 pila pila8' % int vacia+,' int copia7tope' if+vacia+pila8,225,% 9&si no esta vacia se procede&9 copia7tope2pila8.tope' return pila8.vJcopia7topeK'( else% printf+Fn Error. Nas aplicado la funcion cima a una pila vaciaFn,' return pila8.vJ8K'(9&esto ultimo es a!surdo" pues la pila esta vacia" pero te ahorra un Barning al compilar&9 (9&Gin Cima&9 Esta función devuelve el elemento cima si la pila no est# vacía y devuelve un elemento de tipo elemento si est# vacía dando un mensaje de error. or eso hay que asegurarse de que la pila no est# vacía antes de llamar a Cima. ila como Lista Enlazada typedef char elemento'9&defino elemento como char. se puede cam!iar&9 typedef struct 3ode% 9&defino el tipo nodo como registro de info y sgte&9 elemento info' 9&en ppio las pilas seran de char" pero esto se puede cam!iar&9 struct 3ode &sgte' (' typedef struct 3ode nodo' typedef nodo &pila' 9&defino el tipo pila como puntero a nodo&9 El tipo elemento variar# seg*n el programa. peraciones) Aacia) int vacia+pila8, pila pila8' % if +pila82234LL, else return 5' (9&Gin vacia&9
return 8'
18
Aacía devuelve 8 si la pila est# vacía y 5 si no lo est#. =acar) int sacar+punt7pila, pila &punt7pila' % int vacia+,' pila au$7pila' if+vacia+&punt7pila,228,% return 5' ( else% 9& +&punt7pila,es igual a pila8" q es un puntero al 8er nodo" luego quiero modificar su contenido) &9 au$7pila2+&+&punt7pila,,.sgte' free+&punt7pila,' &punt7pila2au$7pila' return 8' ( (9&Gin sacar&9 =acar saca un elemento de la pila si no est# vacía devolviendo 8 o devuelve 5 si est# vacía. /eter) int meter+lo7que7meto"punt7pila, elemento lo7que7meto' pila &punt7pila' % pila au$7pila' au$7pila2&punt7pila' 9&asi me hago una copia de pila8 en au$7pila&9 &punt7pila2+nodo&,calloc+8"sizeof+nodo,,' 9& pila82&punt7pila &9 if+&punt7pila2234LL,% printf+Fn Error. 3o se puede reservar mas espacio.,' return 5' ( else% 9&se ha podido reservar espacio para un nodo) se procede a meter&9 +&+&punt7pila,,.info2lo7que7meto' 9& +&&punt7pila, apunta al 8er nodo&9 +&+&punt7pila,,.sgte2au$7pila' 9¶ q el 8er nodo apunte al q ahora es el ?M&9 return 8' ( (9&Gin meter&9 19
/eter mete lo7que7meto en la pila en caso de que no est< llena devolviendo un 8 o da un mensaje de error y devuelve un 5 en caso de que no haya m#s espacio en memoria para otro nodo. Cima) elemento cima+pila8, pila pila8' % int vacia+,' if+vacia+pila8,225,%9&no vacia&9 return ++&pila8,.info,'( else% printf+Fn Error. Nas aplicado la funcion cima a una pila vaciaFn,' return ++&pila8,.info,'(9&esto ultimo es a!surdo" pues la pila esta vacia" pero te ahorra un Barning al compilar&9( 9&Gin vacia&9 Cima devuelve el elemento cima de una pila no vacía. =i se aplica so!re una función vacía el programa a!orta" así que hay que asegurarse antes de ejecutarla. Ejemplo ilas)
include >stdio.h1 include >conio.h1 include >stdli!.h1 include >string.h1 struct agenda % char nom!reJ:5K' char telefonoJ?:K' char mailJ:5K' (' struct nodo % struct agenda dato' struct nodo &pro$imo' (' struct nodo &nuevonodo+,' int colavacia+struct nodo &,' 20
struct nodo &creacola+struct nodo &" struct agenda,' void mostrar+struct nodo &,' void main+, % struct nodo &pri234LL" &ult234LL' struct agenda $' printf+Ingrese nom!re) ,' gets+$.nom!re,' Bhile+strcmpi+$.nom!re"fin,, % printf+Ingrese telefono) ,' gets+$.telefono,' printf+Ingrese mail) ,' gets+$.mail,' ult2creacola+ult"$,' if+pri2234LL, pri2ult' 99 =i es la 8M pasada pongo en pri el valor del primer nodo printf+Ingrese nom!re) ,' gets+$.nom!re,' ( if+colavacia+pri,228, % printf+3o se ingresaron registros,' getch+,' ( else mostrar+pri,' ( struct nodo &nuevonodo+, % struct nodo &p' p2+struct nodo &,malloc+sizeof+struct nodo,,' if+p2234LL, % printf+/emoria 6/ Llena,' getch+,' e$it+5,' ( return p' ( struct nodo &creacola+struct nodo &ult" struct agenda $, % struct nodo &p' 21
p2nuevonodo+,' +&p,.dato2$' +&p,.pro$imo234LL' if+ult234LL, +&ult,.pro$imo2p' 99 =i hay nodo anterior en pro$ pongo la direccion del nodo actual return p' ( int colavacia+struct nodo &pri, % if+pri2234LL, return 8' else return 5' ( void mostrar+struct nodo &pri, % struct nodo &au$' Bhile+pri234LL, % printf+3om!re) s 0 Helefono) s 0 /ail) s Fn"pri01dato.nom!re"pri0 1dato.telefono"pri01dato.mail,' au$2pri' pri2+&pri,.pro$imo' free+au$,' ( getch+,' (
Colas.
22
4na cola es una colección de elementos homog
•
•
Crear) se crea la cola vacía. Encolar +a-adir" entrar" insertar,) se a-ade un elemento a la cola. =e a-ade al final de esta. Desencolar +sacar" salir" eliminar,) se elimina el elemento frontal de la cola" es decir" el primer elemento que entró. Grente +consultar" front,) se devuelve el elemento frontal de la cola" es decir" el primer elemento que entró.
Esta es una variación de la implementación en el li!ro C R Data =tructures de una cola + GIG , construida so!re un array. /e intereso esa estructura de datos por ? 23
cosas. rimero" el hecho de que la estructura de datos era m#s que el array donde se guarda!an los datos" necesit#ndose una serie de varia!les asociados para usarlo y segundo el uso de la aritmstdio.h1 include >stdli!.h1 define /6S 85 9& Hhe ma$imum size of the queue &9 struct ca % int colaJ /6S K' int fin' int frente' int num7elems' (' typedef struct ca cola7array'
void insert+ cola7array &carr" int value , % if+carr01frente 22 carr01fin RR carr01num7elems 1 5, % printf+Cola Llenan,' ( else % carr01colaJ carr01fin K 2 value' carr01fin 2 + carr01fin ; 8, /6S' carr01num7elems ;;' ( ( int delete+ cola7array &carr , % int temp' if+ carr01num7elems 22 5 , % printf+Cola Aacian,' return 08' ( else % temp 2 carr01colaJ carr01frente K' 24
carr01frente 2 + carr01frente ; 8, /6S' carr01num7elems00' return temp' ( ( void listar+ cola7array &carr , % int $' if+ carr01num7elems 22 5 , % printf+Cola Aacia,' ( else % printf+3umero de Elementos) dt Grente) dt Gin) dn" carr0 1num7elems" carr01frente" carr01fin,' for+ $ 2 5' $ > carr01num7elems' $;;, % printf+dt" carr01colaJ + $ ; carr01frente , /6S K,' ( ( printf+n,' ( int main+, % int menu" value' cola7array carr' carr.fin 2 carr.frente 2 carr.num7elems 2 5' do % printf+=eleccione)n,' printf+8. Insertarn,' printf+?. Qorrarn,' printf+T. Listarn,' printf+U. =alirn,' scanf+d" Rmenu,' sBitch+menu, % case 8) printf+Aalor a Insertar +/ayor o Igual que 5,) n,' scanf+d" Rvalue,' insert+ Rcarr" value,' !reaV' case ?) value 2 delete+ Rcarr ,' if+value 12 5, % 25
printf+Aalor !orrado) d n" value,' ( !reaV' case T) listar+ Rcarr ,' !reaV' case U) return+5,' !reaV' default) printf+pcion no Aalida.n,' !reaV' ( ( Bhile+ menu 2 U ,' return+5,' ( La parte que m#s importante es esta) for+ $ 2 5' $ > carr01num7elems' $;;, % printf+dt" carr01colaJ + $ ; carr01frente , /6S K,' ( W en particular + $ ; carr01frente , /6S por el uso de la aritm
26
ara hacer la implementación se utilizar# una lista circular sin ca!ecera. La cola estar# inicialmente vacía. Cuando se a-adan elementos el puntero que mantiene la cola apunta al *ltimo elemento introducido" y el siguiente elemento al que apunta es al primero que est# esperando para salir. 0 ZCómo encolar[ =e crea el nuevo elemento" se enlaza con el primero de la cola. =i no est# vacía hay que actualizar el enlace del" hasta el momento de la inserción" *ltimo elemento introducido. or *ltimo se actualiza el comienzo de la cola" est< vacía o no. 0 ZCómo desencolar[ =i tiene un sólo elemento se !orra y se actualiza el puntero a un valor nulo. =i tiene dos o m#s elementos entonces se elimina el primero y el *ltimo apuntar# al segundo. Ejemplo gr#fico de encolado. artiendo de una cola que tiene el elemento T" se van a-adiendo el : y el \ +o!servar de izquierda a derecha,. 6 la hora de desencolar se e$trae el siguiente al que apunta Cola.
Ejemplo gr#fico de desencolado. artiendo de la cola formada anteriormente" se han quitado los dos primeros elementos introducidos +o!servar de izquierda a derecha,.
0 Declaración) struct tcola % int clave' struct tcola &sig' 27
('
0 Creación) void crear+struct tcola &&cola, % &cola 2 34LL' (
0 Gunción que devuelve cierto si la cola est# vacía) int vacia+struct tcola &cola, % return +cola 22 34LL,' ( 0 Encolado) void encolar+struct tcola &&cola" int elem, % struct tcola &nuevo' nuevo 2 +struct tcola &, malloc+sizeof+struct tcola,,' nuevo01clave 2 elem' if +&cola 22 34LL, nuevo01sig 2 nuevo' else % nuevo01sig 2 +&cola,01sig' +&cola,01sig 2 nuevo' ( +&cola, 2 nuevo' ( 0 Desencolado) void desencolar+struct tcola &&c8" int &elem, % struct tcola &au$'
28
&elem 2 +&c8,01sig01clave' if ++&c8, 22 +&c8,01sig, % free+&c8,' &c8 2 34LL' ( else % au$ 2 +&c8,01sig' +&c8,01sig 2 au$01sig' free+au$,' ( (
0 rograma de prue!a) include >stdio.h1 include >stdli!.h1 int main+void, % struct tcola &cola' int elem' crear+Rcola,' if +vacia+cola,, printf+FnCola vacia,' encolar+Rcola" T,' desencolar+Rcola" Relem,' return 5' ( Aer colasle.c para tener una implementación completa con listas enlazadas. 6l igual que en las pilas implementadas por listas enlazadas" es recomenda!le analizar el código devuelto por la función de asignación de memoria para evitar posi!les pro!lemas en un futuro.
tras consideraciones
29