Está en la página 1de 57
a JP we wea ee a ae md or a EEE Capitulo 5 ‘Listas enlazadas ; vy INTRODUECION del texto hemos hecho referencia habitualmente a la palabra elistas. Este término "cla a una coleccién lineal de elementos. La Figura $-Ia) muestra una lista de compra, a Contiene un primer elemento, un segundo elemento... y uno ultimo Frecuentemente "9s 0 borramos elementos de una Ista. La Figura $-1(b) muestra Ia Ista de compras después de insert a Wes elementos al final de la misma y borrar otros dos de ella mifk (gs 33 tomatoes Apples oe Chick Cur Lettuce (b) Fig. $1 EI procesamicnto de datos implica con frecuericia el almacenamiento y manipulacién de datos organizados en lstas Una de las formas de almacenarlas es mediante arrays, como se ha discutido envel Capitulo 4 Tos arrays a relacin lineal existente entre los datos que contienen va implicita cn la relacion fsiea que existe ente ellos al colocarlos en posiciones consecutivas de memoria, no por algiin tipo de informacin especial que contengan los datos. Esto hace que podamos calculor on facilidad tas posiciones de cada elemento en el array) Por el contratio, tos arrays tienen desventajas importantes; puesto que puede Tesultar costoso insertar y eliminarGlementos. del mismo. (lambien, puesto que los arrays ooupan un bloque predefnido de celdas de memoria, no podemos doblar o triplicar el tamaiio de un array cuando es nevesario, (Por esta razon devimnos . que los arrays son listas densas o estructuras de datos estdticas) (tra forma de almacenar lista en memoria es la consistentz en aiiadir a cada dato un nuevo campo, llamado campo enlace o puntero, que comtiene la direccién que ocupa el siguiente elements de Ia lista,[De esta forma elementos eonsccutivos en la lista no nevesitan ocupsar posiclones consecutiZis én memoria) Esto puede persnitiraitadir y borrar con facilidad los elementos de ly lista, Consecuentemente si nuestro interés principal es buscar alo largo de la lista, con objeto de 130 Pt ° 131 CAP. 5) LISTAS ENLAZADAS de palabras, puede ser mis ‘a estructura citada recibe ol mos las denominadas Conjuntamente con ) en el procesamicnto la de array. La es! jo. También discutire senlazadas. elementos de ella, como ura en lugar de de este capitul lizaciones de las lista jas y desventaja. insertar y elim conveniente utilizar esta segunda estruct nombre de lista enlazada y es ¢! objetivo listas citculares y lstas dobles que son general su estructura discutiremos también sus venta 5.2 LISTAS ENLAZADAS > Una lista enlazada o lista unidireccional la co iamados nodes, donde el orden de los mismos se establece m cen dos partes: una primera que contiene la informacién asociace Tlamada campo de enlace o campo de puntero'al siguiente, que contiene nodo de la lista, ; La Figura 5-2 muestra un diagrama esquematico de una Jista enlazada eal Pe nodes, Cla nodo contiene dos partes, Ia parte izquierda de cada node represent OO i informacién que puede contener un registro completo (por ejemplo, NOMBRE, Raat dica'cl la parte derecha representa el campo de puntero de] nodo del cual emana una flecha a an 7 siguiente nodo de Ja lista. Esta es la representacion grafica habitual de las listas enla: . El ‘campo puntero del iiltimo nodo contiene un valor ‘especial, llamado valor ladder es una direccién no valida, (En la préctica 0 0 valores negativos suelen ser los mes utilizados para los punteros nulos) El puntero nul, simbolizado por X en el diagrama, seal final de la lista. Las lamada COMIE! it jon lineal de elementos, nstituyen una coleccion nt i iteros. Cada nodo se divide lee una segunda parte, da al elemento, ¥ Une k fa direccion del siguiente fistas enlazadas incorporan también una variable puntero especial Z( NOMBRE y conliene la direocn que ocupa el primer nodo de Ta lista, En la representacién grdfica esto se simboliza con una flecha que saliendo dé COMIENZO apunta al primer nodo. Un aso especiales el dela lista que no tiene inti nod, Esta lista recibe el nombre mula o lista vacia J se simboliza haciendo que la variable COMIENZO almacene el puntero nUl0. g-— EJEMPLO 5.1 Un pabellin de un hospital tiene doce camas, de ls cuales nueve estén ocupadas, tal como se mucsir® &? la Figura 53. Supongamas que queremos un listado alfabtico de pacientes. El listado puede obtener Heuidede el orden de les punteros de la lista (campo siguiente en Ia figura). Utiizamos Ia variable COMIENZO para apuntar al primer paciente. Asi COMIENZO almacenaré el valor 5, puesto que el primer paciente, Adams, ocupa la cama 5, A su vez el puntero asociado al nodo ocupado por Adams contiene el valor 5; puesto que Dean, que es el siguiente paciente en orden alfabético, ocupa la cama 3; siguiendo la lista Dean tiene como campo puntero el valor 11, que ese siguiente en la lista yas suoesivamente. El campo puntero del Lltimo paciente, Samuels, contiene el puntero nulo indicado por el valor 0. (En la figura sz ‘a.n pintado algunas flechas para indicar el orden de los pacientes} NOMBRE ° COMIENZO H+ i-- Puntero a siguiente del tercer nodo Parte de informacién del tercer nodo Fig. 5-2 Lista enlazada compuesta por seis nodos, te [cars LISTAS ENLAZADAS Nimero | paciente | [Siguiente de cama COMIENZ0 G4 | Rink 7 2 3 | Bes n + [Maxwell 2 5 | Adams 3 6 7 | Lane 4 8 | Green 1 ee Samuels | |_9-4 — 11 | Fields 8 p 12 | Nelson 9 Fig. 53 53 REPRESENTACION DE LISTAS ENLAZADAS EN MEMORIA Sea LISTA una lista enlazada, salvo que se indique lo contrario, Almacenaremos LISTA en memoria de la forma siguiente, Como minimo, LISTA estaré compuesta por dos arrays lineales, a Tos que llamaremos INFO y ENLACE, tales que INFO[K] y ENLACE[K] contiesgn Ia parte de informacion y el cainpo de puntero de cada nodo de LISTA respectivamente, Como ya se ha Gitado nevesitamos también una variable especial Ilamada COMIENZO que contiene la posicién cupada'por el primer elemento dela lista, y una marca espetial NULO que indica el final de a taismna. Puesto que los indices de los arrays INFO y ENLACE serin Tabitualmente positivos, el valor NULO serd el cero, salvo que digamos lo contrario. En os ejemplos siguientes resaltamos el hecho de que los nodos conseeutivos de una lista enlazada no necesitan ocupar posiciones adyacentes, y més alin, mostramos también que mis de tina lista distinta puede almacenarse en los inisnios arrays INFO y ENLACE. La tinica imposicién fs que cada lista debe tener su propia variable puntero para indicar el comienzo de 1a misma, EJEMPLO 5.2 La Figura §-4 muestra la epresentacin en memoria de una lista enlazada en la que cada nodo de la lista contiene en nico caricter, Podemos obtener la lista de caractees 0, en otras palabras, la cadena de la forma siguiente: - COMIENZO=9, luego INFO[9]=N primer carécter, ENLACE[9]=3, luego INFO[3]=0 segundo caricter. ENLACE[3]=6, luego INFO[6]=C) (cardcter blanco) teycer carécter. 133 CAP. 3} LISTAS ENLAZADAS INFO ENLACE 1 |} | 2 comtenzo [9 3/0 6 aft 0 | | [+ . a 4 ; 1|x 10 spot Hs Px] [=D [N.| ps CH 4 uf Ee 7 vf Fig. 54 ENLACE[6]=11, luego INFO[11]=E cvarto carécter. . ENLACE[I1]=7, luego INFO[7]=X quinto cardcter. ENLACE[7] = 10, luego INFO[10] =I sexto carécter. ENLACE[10]=4, luego INFO[4]=T cardcter séptimo. ENLACE[4]=0 valor nulo, luego termina la lista En otras palabras, la cadena seré la frase NO ‘EXIT. EJEMPLO 5.3 . La Figura 5-5 muestra cémo podemos almacenar en memoria la lista de notas de dos asignaturas, ALG y GEOM, utilizando los mismos arrays (EXAMEN, ENLACE). Obsérvese que en este caso utilizamos los nombres de las listas como variables puntero que contienen la primera direccidn de las listas respectivas, En este caso ALG contiene el valor 11 (posicién del primer nodo) y GEOM contiene $ que'es la posicién del primer nodo de su lista. Siguiendo los punteros podemos ver que ALG consiste en Ia lista de puntuaciones 88, 74, 93, 82 A su vez GEOM consiste en la lista de puntuaciones 84, 62, 74, 100, 74, 78 (Los nodos de ALG y algunos de GEOM estén indicados explicitamente en el diagrama) EJEMPLO 5.4 ‘Supongamos que una firma de agentes de Bolsa estd compuesta por cuatro agentes, cada uno de los cuales tiene su propia lista de clientes. Esta informacién puede almacenarse organizada como en Ia Figura 5.6. Es decir, Ia lista de todos los clientes puede almacenarse en un array lineal CLIENTE y el array ENLACE contiene los campos de enlace correspondientes. Adicionalmente definimos dos arrays AGENTE que contiene Tallista de agentes y APUNTA tal que APUNTA[K] indica el comienzo de la lista correspondiente al agente AGENTE[K]. iM LISTAS ENLAZADAS (CAP. 5 EXAMEN ENLACE 1 2| 74 14 | Nodo 2 de ALG 3 ALG | 4 | 82 0 | Nodo4 de ALG : 5 | 84 12 | Nodo 1 de GEOM 6 | 78 0 1 | 74] [8 | nodose ctom GEOM | 5 8 | 100 13 9 10 11 | 38 2 | Nodo 1 de ALG 2 | 7 | Nodo2de GEOM 13 | 74 6 14 | 93 4 | Nodo 3 de ALG 1s 16 De acuerdo con esto. la lista de clientes. del agente Bond consiste en los nombres Grant, Scott, Vito, Katz , como puede obtenerse siguiendo las flechas de la lista. Anélogamente, la lista de clientes de Kelly seri Hunter, McBride, Evans y la de Nelson Teller, Jones, Adams, Rogers, Weston La lista de Hall esté vacia puesto que APUNTAL3] contiene valor cero. ion de.un nodo puede ser e nera ite d , un registro con mas de un elemento de informacién. En tal caso los datos pueden almacenarse en und estructura de este tipo o bien en tun conjunto de arrays paralelus, tal como se ilustra en ef siguiente ejemplo. resin eee CAP) LISTAS ENLAZADAS 135 AGENTE APUNTA CLIENTE ENLACE 1 “1 | Vito =} 3 | pan Co Liane a # Laon | 4 | Kate 0 — 5 6 | Evans ° : 5 8 | Rogers 1s — 9 | Telter 10 10 | Jones 19 u 12 | Grant 7 . B r| 1 | McBride 6 15 | Weston 0 16 17 | Scott 1 18 19 | Adams 8 20 ro Fig. 56 EJEMPLO 5.5 Supongamos.que el archivo de personal de una pequeiia empresa contiene la informacion siguiente de cada uno de sus empleados: x Nombre, Numero de Seguridad Social, Sexo y Salario mensual Normalmente se necesitan Gnicamente cuatro arrays, NOMBRE, NSS, SEXO y SALARIO, para almace- nar Ia informacion..Sin embargo, en la Figura 5-7 puede verse la forma de almacenar los datos como una lista enlazada ordenada alfabéticamente, sin mas que afadir el array ENLACE para almacenar el puntero ‘a siguiente de la lista y la variable COMIENZO, que apunta al primer registro de la lista. Obsérvese que utilizamos el valor 0 como puntero nulo. 5.4 RECORRIDO DE UNA LISTA ENLAZADA Sea la lista enlazada, almacenada en memoria mediante dos arrays INFO y ENLACE. Adicionalmente definimos Ia variable COMIENZO que apunta al primer elemento dela lista y (OMW4 136 LINSTAS ENLAZADAS NOME ss KO SALAH. BMLACE — ' _ [e+ 2 own | Piven | | imi | | zi 3 | Kelly 165-64-9951 Varin 0 \ 4 Green 17556-2251 Yaron 2 ad Hemba | | 14700 ohk\ 7 18158-9939 Hembra 16400 10 5 |} i77-a4-ass7 | | Yaron 1900 2 10 | Rubin Hembra | | 15500 | | 0 : Ble p50 P| oF 168-56-6113 | | Varon 34200 4 14 | Harris | | 20856-1654 | | Hembra | | 22800 3] Fig, 5-7 suponemos que el titimo nodo de Ia lista contiene en su campo ENLACE el valor NULO. ‘Supongamos que queremos recorrer LISTA para procesar cada uno de sus nodos exactamente una Vez. En esta seccién presentamos el algoritmo que realiza esta tarea y que utilizaremos en otras aplicaciones. Nuestro algoritmo utiliza una variable puntero PTR que apunta siempre al nodo procesado en cada momento: Por ello ENLACE[PTR] indica el siguiente nodo a ser procesado. De esta forma la asignacién PTR:= ENLACE [PTR] tiene el efecto de mover el puntero al siguiente nodo de la lista, como se representa en Ia Figu- ra 5-8. can) LISTAS ENLAZADAS 137 La descripcion del algoritmo es ta siguiente, Inicializamos PTR a COMIENZO. A continua. cién procesamos INFO[PTR], es decir, ln informacion del primer nodo, En el paso siguiente actualizamos PTR mediante la asignacién PTR;~ ENLA ve que PTR apunte ahora al segundo nodo, Nuevamente tratamos la inform en INFO[PTR] (segundo nod) y tras esto volvemos a actualiza si sucesivamente, Este proceso de actualizacion y procesamiento continuard hasta que en una de las actualizaciones de PTR obtengamos que PTR=NULO, Una representacién formal del algoritmo es la siguiente: Algoritmo $.1: (Recorrido de una lista enlazada). Sea, LISTA una lista enlazadn que } almacenamos en memoria, El algoritmo recorre LISTA realizando la operacién PROCESO a cada elemento de LISTA. La variable PTR apunta en cada momento al nodo que se esti tratando. 1. PTR:=COMIENZO, [Inicializa el puntero]. 2. Repetir pasos 3 y 4 mientras PTR #0. 3. Aplicar PROCESO a INFO[PTR]. ; 4 PTR:= ENLACE[PTR]. [PTR apunta ahora al siguiente nodo]. [Fin del ciclo del paso 2). 5. Salir, Obsérvese la similitud entre el Algoritmo 51 y el Algoritmo 4.1, que recorrexun array lineal, La fausa de esta semejanza estriba eri el hecho de que tanto el array como este tipo de lista enlazada implican un orden lineal de sus elementos. : " recaucién: Al igual que ya se expuso en su momento para los arrays lineaes, la operacién PROCESO puede requerir Ia inicializacin previa de algunas variables antes de aplicatse a los nodos de la lista. Consecuentemente el algoritmo debe estar precedido por las operaciones de inicializacién necesarias. EJEMPLO 5.6 El procedimiento siguiente imprime la informacion contenida en cada nodo de Ia lista enlazida, Puesto que el algoritmo debe recorrer la lista, es muy similar al Algoritmo 5.1 Procedimiento: IMPR(INFO, ENLACE, COMIENZO) El procedimi ime la informacién contenida en cada nodo de la lista Repetir pasos 3 y 4 mientras PTR ¢NULO: Eseribir: INFO[PTR], PTR:= ENLACE[PTR]. (Actualiza el puntero], [Final del ciclo del paso 2) 5. Retornar, En defiitiva, podemos obtener el procedimiento anterior a partic del Algortimo 5.1, sin més. que sustituir el , aso donde se aplica la operacién PROCESO por la sentencia Escribir: INFO[PTR] 138) LISTAS ENLAZADAS (CAP. 5 EJEMPLO 5,7 El procedimiento siguiente calcula el nimero de elementos de la lista enlazada (NUM). Prosedimiento: CONTAR(UINFO, ENLACE, COMIENZO, NUM) 1. NUM:= 0. [Inicializa el contador] PTR:= COMIENZO. [Inicializa el punterd). Repetir pasos 4 y 5 mientras PTR#NULO. NUM:= NUM +1. [Incrementa NUM en uno], PTR:= ENLACE[PTR], (Actualiza el puntero]. [Final del ciclo del paso 3) 6 Retomar. pee Obsérvese que el procedimiento recorre {a lista para poder contar el nimero de elementos que contiene, Por tanto, el algoritmo es muy similar al Algoritmo 51 Sin embargo, en este caso es necesario inicializar 1a variable NUM antes de Pa recorrer la lista. En otras palabras, el procedimiento puede escribirse de la siguiente a: Procedimiento: “CONTAR (INFO, ENLACE, COMIENZO, NUM) 1. NUM:= 0. [Initializa el contador). 2 Llamar Algoritmo 5.1, donde reemplazamos el paso de PROCESO por: NUM:=NUM+1. 3. Retornar. ‘Como veremos en él Problema 53, la mayoria de los procesos de listado completo de lista tiene esta forma, 55 BUSQUEDA EN UNA LISTA ENLAZADA Sea LISTA una lista enlazada, como la de las Secciones 5.3 y 5.4, almacenada en memoria. En sta seceién discutimos dos algoritmos de biisqueda que localizan la posicién del nodo (LUG) en el cual un elemento dado (ELEMENTO) aparece por primera vez en la lista, El primer algoritmo no Necesita que la lista esté ordenada, mientras que el segundo sf lo exige. Si ELEMENTO es un valor de clave y buscamos en el archivo para encontrar el registro que 16 contiene, éste sélo puede aparecer una vez en la lista, Listas no ordenadas Supongamos que los datos de lista no estén ,ordenados (necesariamente). En este caso podremos localizar ELEMENTO sin més que recorret LISTA ulilizando el puntero PTR y comparando ELEMENTO con el contenido INFO[PTR] de cada nodo. Cada vez que actualicemos PTR. mediante la asignaci6n PTR:= ENLACE[PTR] necesitamos dos comprobaciones. Primero necesitamos ver si hemos alcai inzado el final de la lista, ¢s decir, comprobamos si PTR=NULO si no, entonces comprobamos si INFO[PTR]=ELEMENTO Las dos comparaciones no podemos realizarlas simultaneaménte, no existird INFO[PTR]. De acuerdo con esto utilizamos la primer: Ja ejecucién de un ciclo y realizamos la segunda comparacién dent puesto que si PTR=NULO a comparacién para controlar itro de éste, NR CAP. 5] LISTAS ENLAZ/ Algoritmo 5.2: BUSQ(INFO, ENLACE, COMIENZO, ELEMENTO, LUG) LISTA es una lista enlazada almacenada en memoria. El algoritmo encuentra la posicién LUG del nodo donde ELEMENTO aparece por primera vez en lista o devuelve LUG =NULO. 1. PTR:= COMIENZO. 2. Repetir paso 3 mientras PTR #NULO: 3 Si ELEMENTO=INFO[PTR], entonces: LUG:= PTR y Salir. Si no: PTI “guiente]. [Final de la estructura condicional). [Final del cicl6 del paso 2]. 4 (La bisqueds es falda). LUG . Salir. . NLACE[PTR]. [PTR apunta ahora la nodo si- NULO. La complejidad de este algoritmo es la misma del algoritmo de busqueda secuencial -para arrays discutidos en la Seccién 4.7. Es decir, el tiempo de ejecucién para el caso peor es proporcional al niimero n de elementos de la lista. El tiempo del caso medio ser aproximadamen- te proporcional a n/2, con la condicién de que ELEMENTO se encuentre en Ja lista, con la misma probabilidad de encontrarse en cualquiera de los nodos. EJEMPLO 5.8 * Sea el archivo de persorial de la Figura 5-7. EI médulo siguiente lee el niimero de Seguridad Social de un empleado, y le incrementa el sueldo en un 5%, 1. Leer: NSS. 2. Llamar BUSQ(NSS, ENLACE, COMIENZO, LUG), 3. Si LUG#NULO, ‘entonces: . SALARIO[LUG]:= SALARIO[LUG] +0005 + SALARIO[LUG]. Sino: |" g . Escribir: NSS no se encuentra en el archivo. [Final de Ia estructura condicional]. 4. Retornar. (El médulo tiene en cuenta el caso de que exista un error en el niimero de entrada.) Lista ordenada Supongamos que los datos de LISTA estén ordenados. De nuevo buscamos ELEMENTO en Ia lista recorriendo la misma utilizando una variable puntero y comparando ELEMENTO con el contenido de INFO[PTR] nodo a nodo. En este cso, sin embargo, podremos finalizar la biisqueda una vez que ELEMENTO sea inayor que INFO[PTR]. El algoritmo se muestra en la pagina 140. , . La complejidad del algoritmo es fa misma que la del otro algoritmo de busqueda lineal, es decir, el tiempo en el caso peor ¢s proporcional al nimero n de elementos, y el caso medio es aproximadamente proporcional a n/2, Recuérdese que cuando buscamos en arrays lineas ordenados podiamos aplicar un algoritmo cm —= on 40 LISTAS ENLAZADAS (CAP. 5 MIENZO, ELEMENTO, LUG) ; : que se encuentra en memoria. El algoritmo encuentra la posicién LUG del nodo donde se encuentra por primera vez ELEMENTO 0 bien devuelve LUG =NULO. ‘TO 3 | Hunter 4 4 | Katz 0 s[~ 20. i os OL 6 | Evans 0 7 |S 13 8 | Rogers 15 <9 | Teller 19 10 | Jones 9 n «| [8 12 | Grant "7 3B] >< 2a |7 14 | McBride 6 15 | Weston 0 16] —~ 5 17 | Scot | ~ 19 | Adams oes Fig. 5-12 144 LISTAS ENLAZADAS ‘ nro. pisp | 1 J Fig. 5.13, Recuperacién de espacio Supongamos que algunas zonas de la memoria pueden reutilzarse debido a que borramos un nodo de una lista, o incluso eliminamos uria lista completa durante la ejecucion de un programa. Evidentemente es necesario recuperat ese espacio para futuras utilizaciones. Uno de los métodos, utiliZados para esta recuperacién es el de insertar inmediatamente en Ja lista de espacio disponible aquellos lugares que vamos liberando. Este método lo seguiremos sobre todo cuando la lista enlazada la implementamos por medio de arrays lineales. Sin embargo, este método puede ser bastante costoso en tiempo para el sistema operativo, que puede elegir un método alternativo como el siguiente. EI sistema operativo de un computador puede recolectar periddicamente todo el espacio liberado e insertarlo en a lista de espacio disponible. Las técnicas que realizan esta recoleccién reciben el nombre de técnicas de recoleccidn de desperdicios y habitualmente constan de dos pasos. En un primer paso el sistema operativo recorre todas las listas marcando aquellas celdas que se estan utilizando en ese momento. En un segundo paso todas las celdas no marcadas se insertan en la lista de espacio disponible. Los mecanismos-de recuperacién de espacio por parte del sistema operativo suelen utilizarse cuando éste detecta la existencia de un espacio libre muy pequefio, 0 bien la lista de espacio disponible esta vacia, o bien cuando la CPU esta inactiva y por tanto tiene tiempo para realizar esta tarea. En cualquier caso esta tarea de recuperacin de espacio por el sistema operativo es transparente para el usuario. Cualquier otro tipo de discusién sobre estas técnicas se encuentran fuera de los propésitos de este texto. Overflow y underflow Cuando tratamos de insertar un elemento en una lista y esta lena, es decir, la lista de espacio disponible esti vacia, decimos que se ha producido orerflow: Esta situacién debe ser prevista por el programador mediante la impresion de un mensaje que le indique que debe aumentar el espacio ‘asignado a las listas utilizadas. Obsérvese que ocurrira overflow en nuestras listas enlazadas cuando DISPONIBLE=NULO y queremos realizar una insercién. CAP. 5) } LISTAS ENLAZADAS bo vac nme el término underflow hace referencia a la situacién en la que, teniendo eae be fatemos borrarun elemento dela misma. Agua queen el aso ane, el programed de pe ituacién provocando Ia correspondiente impresién de mensaje de ero" ¢ que usando listas enlazadas se produciré underflow cuando COMIENZO=NULO y ueremos realizar una eliminacion 5.7 INSERCION EN UNA LISTA ENLAZADA Sea LISTA una lista enlazada en la que los nodos A y B ocupan posiciones sucesivas en el orden impuesto en la lista, Figura 5-14(q), Supongamos que queremos insertaren ella un nodo N Que debe ocupar un lugar entre A y B. La representacidn esquematica de cémo se realiza esta Operacién se muestra en la Figura 5-14(b). En resumen, después de la operacin el nodo A apuntard al nodo N y éste apuntara a B, es decir, el nodo al que apuntaba antes A Supongamos que representamos en memoria la lista enlazada en la forma LISTA(INFO, ENLACE, COMIENZO, DISP) La Figura 5-14 no tiene en cuenta due el espacio de memoria necesario para el nuevo nodo N lo obtenemos de la lista de espacio disponible. Una representacién més adecuada de como insertamos el nuevo nodo en la lista se'refleja en la Figura 5-15. En dicha representacion podemos observar la necesidad de cambiar el valor de tres punteros para realizar‘la operacién. Estas operaciones son las siguientes: (1) El puntero del campo enlace de A apunta ahora al nado N o primer nodo de la lista de espacio disponible, (2) El puntero DISP apunta ahora al siguiente nodo a N en la lista correspondiente. (3) El puntero del campo enlace de N apuntaré ahora al nodo B al cual apuntaba anteriormente el puntero de! nodo A. comenz0 E-Lis}-—LE-CE-LE (a) Anis de a insercién, COMIENZO . Nodo B odo N (6). Después de ta insercién . Fig. Sad LISTAS ENLAZADAS [CAP. § 146 comenzo Lista de datos Nodo A Nodo B A ee ++ Disp Lista de espacio libre Fig, $15 Pueden darse dos casos especiales. Primero, si el nuevo nodo N que insertamos pasa a se: el primer nodo de la lista, entonces deberemos hacer que COMIENZO apunte a N. Segundo, si el nodo N pasa a ser el tiltimo de la lista en la que se inserta, en este caso el campo enlace de N debera contener el puntero nulo. EJEMPLO 6.13 (a) Considérese la lista alfabética de pacientes de un pabellin de la Figura 5-9. Supongamos que admitimos en el pabellén al paciente Hughes. En este caso: (i) Hughes ocupara la cama 10, que es la primera disponible. (ii) Deberemos insertar a Hughes en la lista entre Green y Kirk. Los cambios correspondiente de Jos punteros serdn: 1. ENLACE(8]=10. [Gréen apunta a'Hughes). 2. ENLACE[IO]=1. [Hughes apunta a Kirk]. 3. DISP=2 [DISPONIBLE apunta a la siguiente cama libre). (b) Consideremos ahora la lista de agentes y sus correspondientes clientes dé Ja Figura 5-12. Puesto que la lista-de clientes no esti ordenada asumimos que las inserciones de nuevos clientes se realizan al comienzo de la lista correspondiente a cada agente. Supongamos que Gordon es un nuevo cliente de Kelly. Entonces: i) Asignamos Gordon a CLIENTELI1] que es el primer nodo disponible. (ii) Insertamos Gordon antes que Hunter que constituia el anterior primer cliente de Kelly. Los cambios producidos en los correspondientes campos de enlace son: 1, APUNTA(2]=11. [Ahora la lista empieza por Gordon] 2, ENLACE[11}=3. [Gordon apunta a Hunter} 3, DISP=18. [DISP apunta ahora al siguiente nodo libre). (c) Supongamos que se insertan en una lista vacia las letras A, B, C, D, E y.E una detras de otra como se muestra en la Figura 5-13. Si suponemos que as inserciones se realizan siempre por el comienzo de la lista (no confundir comienzo de la lista con el primer elemento del array), después de seis inserciones F apuntard a E, éste a D, que a su vez apunta a C, que apunta a B, el cual apunta a A, conteniendo este {iltimo el puntero nulo, Por tanto, seran DISP=7 o-primer nodo libre y COMIENZO=6 que es la posicién del primer nodo de la lista. La Figura 5-16 muestra dicha lista (donde n= 10), CAP. 5] LISTAS ENLAZADAS "7 INFO ENLACE COMIENzO | 6 fa 0 2 1B. ifs DISP | 7 3 242 s alslole = 7 8 8 9 10 ' 10 0 Fig. 5-16 Algoritmos de insercién Tres son las situaciones més comunies que nos encontraremos cuando insertamos nodos en una lista, Primero cuando queremos insertar un nodo al principio de la lista, segundo cuando queremos insertar un nodo detrés de uno determinado, y tercerorcuands insertamos tn nodo en una lista previamente ordenada. A continuacion discutimos Tos algoritmios que llevan a cabo estas tareas suponiendo que Ta lista esté almacenada en memoria en la forma LISTA(INFO, ENLACE, COMIENZO, DISP) y que la variable ELEMENTO contiene le informacién que debe incor- porarse a la lista, * Puesto que nuestros algoritmos de insercién utilizarin nodos de la lista de nodos disponibles, todos'ellos deben incluir los siguientes pasos: (@)_Estudiar si existe espacio libre en la lista de espacio disponible, Si no es asi, es decir, si DISP=NULO, el algoritmo debe imprimir el mensaje OVERFLOW, ¥ (6) Extraer el primer nodo de la lista de disponibles. Si uilizamos la variable NUEVO, esta operacién puede realizarse mediante dos asignaciones (en este orden: NUEVO ENLACE[DISP] DISP,. ISP: (0) Incorporar la informacién a insertar en el nodo recién obtenido. Es deci: INEO[NUEVO]=ELEMENTO. En a Figura 5-17 se presenta un diagrama esquemético de estos dos iiltimos pasos. Ree 4s car. LISTAS ENLAZADAS. Nuvo, Lista de espacio libre feveMento| Fig. $17 Insercién al pri ipio de una lista pupongamos que nuestra lista no esté ordenada ni existe ninguna raz6n por la cual cualquier Podo que insertemos deba ocupar una determinada posicién. En este caso lo més sencillo sera Saautit ¢l nuevo nodo al comienzo de la misma, Un algoritmo que realiza esta operacion es el siguiente: ae Algoritmo 5.4: INSPRN(INFO; ENLACE, COMIENZO, DISP, ELEMENTO) El algoritmo coloca ELEMENTO como primer componente de la lista. 1, [{OVERFLOW?] Si DISP=NULO, entonces: Escribir: OVERFLOW y Salir, 2, [Extrae el primer nodo de la lista DISP]. NUEVO: =DISP y DISP: =ENLACE[DISP] INFO[NUEVO]: = ELEMENTO. [Copia el dato en el nodo}. ENLACE[NUEVO]: = COMIENZO. [EI nuevo nodo apunta ahora al que ocupaba antes ia primera posicién] - 5. COMIENZO: =NUEVO. [COMIENZO apunta ahora al elemento que ocupa la primera posicién de la lista], » 6. Salir Los pasos correspondientes entre el fy el 3 ya han sido discutidos al igual que la representacion esquematica de las operaciones de los pasos 2 y 3 (Fig. 5-17). La representacién esquematica de los pasos 4 y 5 se muestra en la Figura 5-18, ‘COMIENZO NUEVO A+ fetemenro] +} Fig. $18 Insercién al principio de una lista, y49 cap. 3) LISTAS ENLAZADAS EJEMPLO 5.14 os afiadir Ia Sea ta lista de fox resultados de eximenes de la Figura 5-10, y suponemos que avetetres 17 ppuntuacién 7S al principio de la lista de peometria, Si tenemos en cuenta que en este caso LEME INFO=EXAMEN y COMIENZO=GEOM, Ia evolucién del algoritmo seria ta siguiente INSPRIN(EXAMEN, ENLACE, GEOM, DISP, ELEMENTO) 1. Puesto que DISP4NULO, el control se transfiere al paso 2, NUEVO =9, entocnes DISP = ENLACE[9] = 10. 3. EXAMEN[9)}=75, 4. ENLACE[9]=5. 5. GEOM=9, 6 Salir, La Figura 5-19 muestra la estructura de datos después de afiadir 75 ala lista de geometria. Obsérvese que sélo ha sido necesario cambiar el valor de los tres punteros DISP, GEOM y ENLACE[9} EXAMEN ENLACE 1 16 2) m4 14 3 1 atc | 11 -~ 4| 2 0 s| a4 12 o| 0 [om | | orom |? 8 | 100 B Lolo +10 3 2} @ 7 3] 74 6 4] 93 4 15 0 16 15 Fig. 5:19 Inserci6n a continuacién de un nodo determinado Supongamos en este caso que se nos da un valor LUG que o bien representa la localizacién de un nodo A determinado o bien LUG=NULO. El algoritmo siguiente inserta ELEMENTO en la 1 EJ LISTAS ENLAZADAS 7 (CAP. 5. lista a continuacion de Ao 4 ELEME! , | ite wean de Ao bien coloca ELEMENTO como primer componente de Ia lista si al cat, €1 nuevo nodo (cuya posicién es NUEVO), Si LUG =NULO, entonces el nodo se coloca ft aie de Ia lista tal y como lo realiza el Algoritmo 5.4. En otro caso hacemos que N apunte implicn (que originalmente seguia a A) tal y como se muestra en la Figura 5-15. El proceso lica las siguientes asignaciones: NLACE{LUG] ENLACE[NUEVO] Después del cual N apunta a B y ENLACE[LUG]: =NUEVO Tras el cual A apunta al nodo N. Una representaci6n formal de este algoritmo es la siguiente: Algoritmo 5.5: INSLUG(INFO, ENLACE, COMIENZO, DISP, LUG, ELEMENTO) \ El algoritmo inserta ELEMENTO a continuacién del nodo que ocupa la posicién LUG 0 coloca ELEMENTO como primer nodo si LUG=NULO. 1. ({OVERFLOW?] Si DISP=NULO, entonces: Escribir: OVERFLOW y Salir. 2. [Extrae el primer nodo de la lista de disponibles]. NUEVO : =DISP y DISP: = ENLACE[DISP). 3. INFO[NUEVO]: =ELEMENTO. (Copia el dato en el nodo obtenido}. 4. Si LUG =NULO, entonees: [Lo inserta como primer nodo} «_ ENLACE[NUEVO]: =COMIENZO y COMIENZO Si ho: [Inserta detrds del nodo de posicién LUG). ENLACE[NUEVO] : =ENLACE[LUG] y ENLACE[LUG] : = NUEVO. [Final de la estructura condicional]. 5. Salir. Insercién de una lista enlazada y ordenada Supongamos que queremos insertar ELEMENTO en una lista enlazada y ordenada y que ELEMENTO cumple que INFO(A) ELEMENTO, o en otras palubras, la bisqueda finaliza cuando ELEMENTO Jones, tendremos que: LUG =AUX=8 y Retornar. (8) INSLUG(CAMA, ENLACE, COMIENZO, DISP, LUG, ELEMENTO). [Aqui LI 1. Puesto que DISP-ZNULO. se transfiere el control al paso 2 2. NUEVO=10 y DISP=ENLACE[10] =2. 3. CAMA[IO]=Jones. 4, Puesto que LUG #NULO, tendremos: ENLACE[I0] = ENLACE[8]=1 y ENLACE[8] =NUEVO=10. 5. Sali. L 8 UG=8]. En la Figura 5-21 ge muestra la estructura de datos después de afadir Jones a la lista de pacientes, Volvernos a recaloar que solamente hemos tenido que cambiar el valor de tres punteros, DISP, ENLACE(10] y ENLACE[8]. CAMA ENLACE COMIENZO | 5 Mi 1 | Kirk 7 2 “| 6 3 | Dean u 4 | Maxwell 12 . 5 | Adams 3 pisp | 24] 6 0 7 | Lane 4 8 | Green 10 9 | Samuels 0 10 | Jones 1 11 | Fields 8 12, | Nelson . Fig. 5-21 CAP. 5) LISTAS ENLAZADAS te Copiado Supongamos que queremos copiar toda o parte de una lista o bien construir una nueva concatenando dos listas. Esta operacion puede realizarse definiendo primero una lista vacia y a continuacién introduciendo uno a uno los elementos mediante algiin algoritmo de insercién. Una lista vacia se define fcilmente sin més que elegir un nombre de variable o puntero hacia la lista tal como NOMBRE, y posteriormente haciendo NOMBRE: =NULO. Estos algoritmos se discutiran en la seccién de problemas, 58 ELIMINACION DE UN ELEMENTO DE UNA LISTA ENLAZADA Sea LISTA una lista enlazada en la cual el nodo N se encuentra entre los nados A y B, como se muestra en la Figura 5-22(a). Supongamos que queremos eliminar el nodo N de ia lista. Una Tepresentacién esquemética de cémo hacerlo se muestra en Ia Figura 5-22(6). La eliminacién se produce tan pronto como el puntero de enlace siguiente del nodo A apunte al nodo B. (Por ello cuando realizamos eliminaciones debemos almacenat de alguna forma la direccién del nodo que precede al que vamos a borrar,) Supongamos que la lista enlazada se mantiene en memoria en la forma siguiente: LISTA(INFO, ENLACE, COMIENZO, DISP) La Figura 5-22 no tiene en cuenta que cuando eliminamos el nodo N de la lista debemos devolverlo inmediatamente a la lista de espacio disponible. Por facilidad en-el proceso esta devolucién se realiza insertando el nodo devuelto al principio de la lista DISP. Un diagrama esquemat ico de Ia operacién de borrado y devolucién se muestra en la Figura 5-23. Obsérvese que esta operacién implica cambiar tres punteros de la forma siguiente: (1) El puntero siguiente del nodo A debe cambiarse para apuntar al nodo B, al que apuntaba previamente N. (2) El puntero del nodo N se cambia y se le hace apuntar al primer nodo de la lista de nodos disponibles. COMIENZO Nodo A Nodo N Nodo B Ur of feet [ef Ie x (@) Antes de borrar. COMIENZ0 Nodo A Nodo N Nodo B \f [4 eof x (6). Después de borrar. Fig. 5-22 154 LISTAS ENLAZADAS [cap. 5 CoMtENz0 Lista de datos Nodo A Nodo N “TH : Disp Lista de espacio libre Fig. $-23 GB) EL Puntero DISP se cambia y pasa de apuntar al antiguo primer nodo de la lista de disponibles para apuntar a N que sera el nuevo primer nodo. Existen dos casos especiales que implican actuaciones distintas. Si el nodo N que eliminamos es el Nae de a lista, el puntero COMIENZO deberd cambiarse para apuntar al nado B. En cambio, 5! N es el iiltimo de la lista, entonces el puntero de A deberd ponerse a NULO. EJEMPLO 5.16 (2) Considérese la lista de pacientes de un pabellén de uni hospital de la Figura 5-21. Supongamos que se da de alta a Green. En este caso la CAMA[8] debera figurar como vacia. Para realizar esta operacién sobre Ja lista deberemos cambiar tres punteros en la forma siguiente: ENLACE{I1]=10 ENLACE[8]=2 DISP=8 Con ‘el primer cambio, Fields, que originalmente precedia a Green, apunta ahora a Jones, que era el siguiente a Green. Los cambios segundo y tercero afiaden la cama vacia a la lista DISP. Obsérvese que antes de realizar a eliminacién necesitamos encontrar el nodo CAMA[11] que originalmente apunta a CAMAT8] Fle ') Sea la lista de agentes de bolsa y sus respectivos clientes de la Figura 5-10. jupongamos que se elimina al primer cliente Teller de la lista de Nelson, Para mantener la lista tendremos que cambiar tres punteros: APUNTA[4]=10 ENLACE[9]=11 DISP=9 Con el primer cambio, Nelson apunta ahora a Jones anterior segundo cliente. El segundo y tercer cambio afiaden' el nodo eliminado a la lista de disponibles. Supongamos que se eliminan E, B y C uno detras de otro de la lista de la Figura 5-16. El estado en que queda Ia lista se muestra en la Figura 5-24. Obsérvese que los tres primeros nodos disponibles son: INFO[3}, que originalmente contenia C INFO[2}, que originalmente contenia B INFOS], que originalmente contenia E Obséivese también que el orden en que se encuentran los nodos en DISP es el inverso al orden que se sigue al borrarlos de la lista. Bi tees Pe a /eteel fee Se Di Ie eee eee | CAP. 5) LISTAS ENLAZADAS. 155 INFO ENLACE comnzo [6 | ifa] [oe 2 5 DIsP | 3 - 3 2 4 D 1 f 7 of] [a , 3 s! | fel ; 10 wl] Ce] vig. 824 Algoritmos de eliminacién Los algoritmos que eliminan nodos de una lista son utilizados en distintas situaciones. En este epigrafe discutiremos dos de ellas. La primera situacién es la que implica borrar el nodo siguiente a ‘uno dado, La segunda situacién implica borrar un nodo que contiene un determinado elemento. En todos los algoritmos suponemos que la Tista enlazada se almacena en memoria de la forma: LISTA(INFO, ENLACE, COMIENZO, DISP). “También en todos ellos devolvemos el nodo eliminado a la lista de nodos disponibles, insertndolos al principio de ésta. Por ello nuestros algoritmos incluiran las siguientes asignacio- nes, donde LUG es la posicién del nodo N borrado: ENLACE[LUG]:=DISP y DISP: =LUG Estas dos operaciones se representan en Ia Figura 5-25. ‘Algunos de nuestros algoritmos pueden borrar o bien el primer elemento de la lista o bien el iltimo. Cualquier algoritmo que haga esto: debe analizar primero si éxiste algin elemento en la lista, Si no existe ninguno, es decir, si COMIENZO=NULO, el algoritmo imprimir el mensaje UNDERFLOW. LuG \ Lista de espacio libre 156 LISTAS ENLAZADAS [caP. 5 ién del nodo sucesor de uno determinado Sea LISTA ; LISTA dl aa lista, enlazada almacenada en memoria. Supongamos que queremos eliminar de aN ea 1 node N que ocupa el lugar LUG y que conooemas ugar LUGP del nodo que precede de la han. en si el nodo N es el primero LUGS-NULO. E] algoritmo siguiente elimina N Algoritmo 58: Igoritmo 5.8: BOR(INFO, ENLACE, COMIENZO, DISP, LUG, LUGP) El algoritmo elimina de la lista el nodo N que ocupa la posicién LUG, siendo LUGP la posicién del nodo que precede a N o bien LUGP=0 si N es el primero de Ia lista. 1. Si LUGP=NULO, entonces: . COMIENZO: = ENLACE[COMIENZO}. [Elimina el primer nodo}. Si no: ENLACE[LUGP]: = ENLACE[LUG]. [Elimina el nodo NJ. [Final de Ia estructura condicional). 2. Devolvemos el nodo a Ia lista DISP). ENLACE[LUG]: =DISP y DISP: =LUG. 3. Salir. La Figura 5-26 muestra.un esquema de la asignacién COMIENZO: =ENLACE[COMIENZO]} do de Ia lista, es decir, el caso es que N es el primer nodo de ésta. En la que elimina el primer no cir, el c 1 esquema de la asignacién Figura 5-27 se muestra el ENLACE[LUGP]: =ENLACE[LUG] ic Ja lista. ‘ocemos previamente la posicién de LUGP del N cuando éste no es el primer nodo d de las aplicaciones deberemos calcular mo es debida a que con nla mayoria que elimina La simplicidad del algorit nodo que precede al que queremos borrar. E primero el valor de LUGP. ‘COMIENZO Nodo 2 Nodo 3 Fig. 5-26 COMIENZO: =ENLACE[COMIENZO]. ee atRsEndde de fet isos aaPs dusben int ea ane ENED ee ae CAP. 3) LISTAS ENLAZADAS ey 3 Fig. $27 ENLACE[LUGP]: =ENLACE[LUG]. | 4 Nodo N CoMiENzo LuGP Lue | Eliminacién de un nodo que contiene un determinado elemento de informacién Sea LISTA una lista enlazada almacenada en memoria. Supongamos que queremos climinar de \ la lista el primer nodo N que contenga la informacién ELEMENTO. (Si ELEMENTO es un valor de clave, slo puede contenerlo un nico nodo.) Recuérdese que antes de borrar el nodo N que 4 contiene a ELEMENTO debemos conocer que nodo precede a N en la lista. Por ello veremos previamente un procedimiento que localiza Ia posicién LUG del nodo N que contiene a ELEMENTO y Ia posicin LUGP del nodo que precede a N. En el caso de que N sea el primer nodo de la lista, el procedimiento devuelve LUGP =NULO y en caso de que ELEMENTO no se encuentre en la lista devolveré LUG=NULO. (Como puede verse el procedimiento es similar al Procedimiento 5.6.) Procedimiento 9: ENCBUNFO, ENLACE, COMIENZO, ELEMENTO, LUG, LUGP) " E| procedimiento encuentra. la posicién LUG del primer nodo N que contiene a ELEMENTO y la posicién LUGP del nodo anterior a N. Si | ELEMENTO no se encuentra en la lista, el procedimiento devuelve | LUG=NULO y si ELEMENTO se encuentra en el primer nodo, entonces hace LUGP = NULO. 1, [{Lista vacia?] Si COMIENZO: =NULO, entonces: LUG: =NULO y LUGP: =NULO y Retornar, [Final de la estructura condicional]. 2. [gSe encuentra ELEMENTO en el primer nodo? Si INFO[COMIENZO]=ELEMENTO, entonces: LUG: =COMIENZO y LUGP=NULO y Retornar. [Final de la estructura condicional] 3, AUX: =COMIENZO y PTR: cializamos los punteros}. 4, Repetir pasos 5 y 6 mientras PTR NULO. 5. Si INFO[PTR]=ELEMENTO, entonees: LUG: =PTR y LUGP: =AUX y Retornar. [Final de la estructura ‘condicional}. 6. AUX:=PTR y PTR: =ENLACE[PTR]. [Actualizamos los punteros]. [Final del ciclo del paso 41, 7, LUG: =NULO. [Bisqueda fallida), 8. Retornar. | | [ [ [ seacecowiezoy tov | lf [ [ LISTAS ENLAZADAS. [caP. 5 ee ‘Procedimiento recorre Ia lista uilzando dos punteros PTR y AUX. Con PTR recorremos la 8 ¥ comparamos sucesivamente ELEMENTO con INFO[PTR}, En cada momento AUX Qpunta al nodo anterior al apuntado por PTR. Por ello después de cada comparacin falda ualizamos ambas de la siguiente forma: AUX:=PTR = y PTR: =ENLACE[PTR] baer) de la lista contintia mientras que INFO[PTR]# ELEMENTO o, en otras palabras, la dire gitminard cuando INFO[PTR]=ELEMENTO. En ese momento PTR=LUG 0 Ta rare odo N bussado y AUX apuntaré al nodo anterior. que a emalizacion de este procedimiento se establece a continuacién. En ella se puede observar Bese atm por separado los casos en que la lista est vaca y el caso en que N es el primer nodo. De ae i debido a que ambos casos no precisan Ia utilizacion de la variable AUX, « mop sabuis de desarollar este procedimiento estamos en condiciones de disefar un algoritmo in Selle que elimina de una lista enlazada aquel nodo N en el que aparece por primera vez ka informacion ELEMENTO. La simplicdad de este algoritmo exriba en que la localizacion de N y le su predecesor puede realizarse utilizando el Procedimiento 5.9 Algoritmo 5.10: ELIMINAR(INFO, ENLACE, COMIENZO, DISP, ELEMENTO) El algoritmo elimina de la lista enlazada el primer nodo N que contiene la informacion ELEMENTO. 1. [Utilizamos el Procedimiento 5.9 para encontrar la posicion de N y su predecesor en la lista.) Llamar ENCB(INFO, ENLACE, COMIENZO, LUG, LUGP). 2. Si LU ULO, entonces: Escribir: ELEMENTO no se encuentra en la lista y Salir. 3. [Eliminamos el nodo]. Si LUGP=NULO, entonces: COMIENZO: =ENLACE{COMIENZO}. [Eliminamos el pri- ' mer nodo} Si no: ENLACE[LUGP]: = ENLACE[LUG] [Final de la estructura condicional]. 4, [Devolvemos el nodo eliminado a la lista de nodos disponibles]. ENLACE[LUG]: =DISP y DISP: =LUG. 5. Salir. Comentario: El lector puede observar que los pasos 3 y 4 del algoritmo también aparecen en el Algoritmo 5.8. En definitiva podemos sustituir estos dos pasos por la sentencia de llamada Llamar BOR(INFO, ENLACE, COMIENZO, DISP, LUG, LUGP) que est més en consonancia con el estilo de programacion en médulos. EJEMPLO.5.17 Considérese la lista de pacientes de la Figura 5-21 y supongamos que se da de alta a Green, En el eercicio simulamos el Procedimiento 59 para encontrar la posicién de éste y de su predecesor LUG y LUGP. Posteriormente simulamos el funcionamiento del Algoritmo 5.10 para eliminar Green de la lista. En estas condiviones ELEMENTO = Green, INFO=CAMA, COMIENZO=5 y DISP=2 —$$ $$ ann LISTAS Whe AZAtns CMa ENLACE conanwro [5] — 12 | Netion Vig. $28 (0) ENCUCAMA, PLACE, COMIENZO, ELEMENTO, LUG, LUGP) y fuesta que COMIENZO 4 NULO, ve transite ef control al paso 2. 4, Ror et CAMAL5] = Adar Green, ef control ve transfert al paso 3 AUX= 5 FAK = ENLACES} 1 4. Lan paws 5 y 6 ve epiten en la forma siguiente (2) CAMALS~ Dean 4 Green, hice AUX 3 y PTR = ENLACE[3} = 1 1) CAMAL IT ickls/ Green, luego AUX = 11 y PTR = ENLACE(I] <8 (0 CAMALS] = Green, por tanto obtencinon LUG = TTR =H y LUGP©AUX = LT y Retornas. (1) ELIMINARICAMA, ENLACE, COMIENZO, DISP, ELEMENTO) 1 Lamar ENCICAMA. ENLACE, COMIENZO, ELEMENTO, LUG, LUGP) JE procedinnenta devuclve LUG = & y LUGP = 11] 2 Pucsto que LUG 4 NULO, se transficre el control al paso 3 1 Pucsto que LUGE Y NULO, tendresmos que ENLACE} = ENLACE[S) © 10 4 ENLACE[H]=2 y DISP 8. 5. Sale 1a Figura $28 muests edna queda ta etzutura de datos desputs de eliminar a Green de ls tata de paces Vales aia que a peracén slo vp el cambio dels tes punter ENLACE Te ENLACELAY y DISP, 89 LISTAS ENLAZADAS CON CABECERA Una lita enlacada con cabecera es uns lista cnlazada que contiene un nodo especial, Mamado. odo cabecera, al principio de la misma. Los dos siguientes tipos son los mas utilizados peneralmente 160 LISTAS ENLAZADAS [cars (1) Lista con cabecera y tierra es una lista con cabecera cuyo tiltimo nodo contiene el puntero “hulo. (ET término tierra», aunque parece fanacronico] se utiliza por el hecho de que muchos textos simbolizan el puntero nulo mediante el mismo simbolo que se utiliza en electricidad para indicar la tierra de un circuito) (2) Lista circular con cabecera es una lista enlazada en la que el iltimo nodo apunta hacia el nodo cabecera, La Figura 5-29 muestra la representacién esquemitica de estos tipos de listas. En lo sucesivo, salvo que se indique lo contrario, nuestras listas con cabecera serdn siempre circulares. Por ello el nodo cabecera actuar como centinela o marca que indica el final de la lista. Obsérvese que el puntero COMIENZO siempre apuntara al nodo cabecera. De acuerdo, con esto, ENLACE{COMIENZO] =NULO indicard que una lista con cabecera y tierra esté vacia; sin embargo, ENLACE[COMIENZO}=COMIENZO nos indica que la que est vaca es una lista circular. : Aunque nuestras estructuras de datos podamos representarlas en memoria mediante listas con cabecera, la lista DISP la representaremos siempre como una lista enlazada normal. EJEMPLO 5.18 Considérese el archivo de personal de la Figura 5-11. Este archivo puede organizarse también como una lista con cabecera (Fig. 5-30). En este caso LUG=5 e& la posicién del registro cabecera; por tanto, COMIENZO =5, y como Rubin es el iltimo empleado, ENLACE[I0]=5. El registro de cabecera puede utilizarse para almacenar informacion acerca del archivo. Por ejemplo, en Ja Figura 5-30 tenemos que NSS[5]=9 que indica el niimero total de empleados y SALARTO= 191.600 que indica la suma de todos los salarios que se pagan a los empleados. El término «nodo» habitualmente hace referencia a un nodo ordinario y no al nodo cabecera. Por tanto, el primer nodo de una lista con cabecera es siempre’el siguiente al nodo cabecera y su posicién sera ENLACE[COMIENZO] y no COMIENZO como en las listas ordinarias, El Algoritmo 5.11, que utiliza la variable PTR para recorrer una lista circular, es esencialmente el mismo que el Algoritmo 5.1, que recorre una lista ordinaria, salvo que ahora el algoritmo (1) comienza con Ja asignacién PTR: =ENLACE[COMIENZO] (no con PT! (OMIENZO) y (2) termina cuando PTR=COMIENZO (no cuando PTR=NULO). coMIENzO oa al +} I ++ x] (a) , Lista con cabecera y tierra, (6) Lista circular con eabecera. Fig. 5.29 ae LISTAS ENLAZADAS NOMBRE NSS SEXO SALARIO._ ENLACE COMIENZO. 1 9 5 2 | Davis 192-386-7222 2 Kelly 16564-3351 7 4 | Green | | 175-56-2251 1“ DISP 5 on 6 8 6 | Brown 17852-1065 Hentre 9 7 | Lewis 121-56-9939 | | Hentre | | 1620] | 10 8 n 9 | Coben | | s77ss45s7 | | Varéa ison | | 2 10 | Robin 13546-6262 Hembra 1550 5 un B 12 | Evans | | 162568113 | | Varco sao} | 4 B 1 14 | Hanis | | 20eset6ss | | Hentre | | ze] | 3 Fig. $30 Las listas circulares con cabecera se usan frecuentemente, en lugar de las ordinarias, debido 2 que muchas operaciones se pueden realizar e implementar mas fécilmente en las primeras que en las tiltimas. Esto es debido a las dos propiedades siguientes, que presentan las listas cixculares con cabecera. (1) No necesitamos utilizar el puntero nulo y, por tanto, todos los punteros contienen direcciones vélidas. (2) Cada nodo (ordinario) tiene un predecesor, por lo que el primer nodo no es un caso especial. El ejemplo siguiente ilustra Ia utilidad de estas propiedades. Algoritmo 5.11: (Recorre una lista circular con cabecera.) Sea LISTA una lista circular con cabecera en memoria. El algoritmo recorre LISTA*aplicando lz operacién PROCESO a cada nodo de ésta. 1. PTR: =ENLACE[COMIENZO}, [Inicializamos el puntero PTR]. 2 Repetir pasos 3 y 4 mientras PTR#COMIENZO: 3. ‘Aplicar PROCESO a INFO[PTR]. 4. PTR: =ENLACE[PTR] [PTR apunta ahora al siguiente nodo]. [Final del ciclo del paso 2). 5. Salir. ICAP. 5 162 «LISTAS ENLAZADAS EJEMPLO 5.19 Supongamos que LISTA es una lista enlazada almacenada en memoria y que nos dan un determinado ELEMENTO de informacién. (@) En Algoritmo 52 encuentra la posicién LUG del primer nodo de Ia lista que contiene ELEMENTO cuando LISTA es una lista enlazada ordinaria. El siguiente es un algoritmo equivalente pero pars listas circulares con cabecera. Algoritmo 5.12: BUSCLC(INFO, ENLACE, COMIENZO, ELEMENTO, LUG) . LISTA es una lista circular con cabecera. El algoritmo encuentra Ia posicién LUG que ocupa el primer nodo de la misma en que ELEMENTO aparece por primera vez'o devuelve LUG=NULO. 1, PTR: =ENLACE[COMIENZO}. 2. Repetit mientras INFO[PTR]#ELEMENTO y PTR ¢COMIENZO: PTR:=ENLACE[PTR]. [PTR apunta ahora al nodo siguiente). [Final de ciclo} 3. Si INFO[PTR]=ELEMENTO, entonces: LUG: =PTR. Sino: LUG: =NULO. [Final de la estructura condicional). 4. Sali, Las dos condiciones que controlan el ciclo de bisqueda del Algoritmo 5.12 no pueden evaluarse simulténeamente en el algoritmo que busca en listas ordinarias, Es decir, en el Algoritmo 52 no podemos utilizar una sentencia anloga como Repetit mientras INFO[PTR]#ELEMENTO y PTR#NULO: puesto que para listas enlazadas ordinarias INFO[PTR] no esti definido cuando PTR=NULO. (8) El Procedimiento 59 encuentra la posicién LUG del primer nodo N que contiene ELEMENTO y ta posicién LUGP del nodo que precede a N en la lista. El algoritmo siguiente realiza la misma operaciin ‘cuando LISTA es una lista circular con cabecera. Procedimiento 13: ENCLC(INFO, ENLACE, COMIENZO, ELEMENTO, LUG, LUGP) 1. AUX: =COMIENZO y PTR: = ENLACE[COMIENZO}. [Inicializa el puntero]. 2. Repetir mientras INFO[PTR]#ELEMENTO y PTR #COMIENZO: ‘AUX: =PTR y PTR: =ENLACE[PTR], [Actualiza los punteres) inal del ciclo). NFO[PTR] =ELEMENTO, entonces: LUG: =PTR y LUGP: «AUX. Si no: LUG: =NULO y LUGP: = AUX. [Final de la estructura condicional). 4 Sali. CObeérvese la simplicidad de este procedimiento comparando con cl Prosedimiento $9. En este caso no fenemos que comparar el ciso especial en que ELEMENTO se encventra en el primer nodo y acemis podemos realizar simultineamente las comparaciones que coatrolan el ciclo, CAP. 5] LISTAS ENLAZADAS ' 163 indo LISTA es una lista (EL Algoritmo’5.10 elimina el MENTO, cust elimina el primer nodo N en que aparece ELEMENTO, cuando FIST MO ae cenlazada ordinaria, El algoritmo siguiente es uno equivalente a aquél, pero irculares con cabecera. Algoritmo $.14: ELIMINAR(INFO, ENLACE, COMIENZO, DISP, ELEMENTO) 1. [Utizainos el Procedimient 5:13 para encontrar Ia poscién de N y su nodo predecesor}) Llama ENCBLC[INFO, ENLACE, COMIENZO, ELEMENTO, LUG, LUGP). Si LUG=NULO, entonces: Eseribir: ELEMENTO no se encuentra en Ja lista y Sali. |. ENLACE[LUGP]: =ENLACE[LUG]. [Borra e! nodo]. [Devolvemos el nodo eliminado a la lista DISPONIBLE} ENLACE[LUG]: =DISP y DISP: =LUG. Sali. 5 a De nuevo no tenemos que considerar el caso especial en que ELEMENTO se encuentre en el primer nodo de la lista como haciamos en el Algoritmo 5.10 "Comentario: Existen otras dos variaciones de las listas enlazadas que suelen aparecer en la literatura: | (1) Listas enlazadas simples en que el tiltimo nodo apunta al primer nodo en lugar de contener el puntero nulo, Estas reciben el nombre de listas circulares. (2) Listas enlazadas que contienen dos nodos especiales uno de cabecera al comienzo de la lista y otro al final de la misma. La Figura 5-31 muestra la representacién esquemitica de estos dos tipos de listas. ‘COMIENZO Gy | Chit | (0) Lista entazada circular, comienzo Nodo eee enol | Noh] + + 2! 7 (b) List elazad con nodoseabeceasemolaue 7 Fig. 5:31 rt hel LISTAS ENLAZADAS fear. 4 : 4 Polinomios | Las listas enlazadas con cabecera suelen uilizarse para almacenar en memoria los polinomios El nodo cabecera juega un papel importante en esta representacién puesto que es necesario poder Fepresentar los polinomios de grado cero. Esta representacién de los polinomios la introduciremos mediante un ejemplo, EJEMPLO 5.20 ‘Sea p(x) el siguiente polinomio de una variable (conteniendo cuatro términos distintos de cero}: pla)= 2x8 Sx7= 3x2 +4 Este polinomio puede representarse mediante la lista con cabecera que se muestra en la Figura 5-32{a), donde cada nodo corresponde a un término distinto de cero. Concretamente, la parte de informacién de cada nodo se compone de dos campos conteniendo cada uno de ellos el coeficiente y el exponente de cada término respectivamente; enlazandose los nodos de acuerdo al orden decreciente de los exponentes. ‘Obsérvese que el puntero a la liste POLIN apunta a un nodo cabecera, el cual contiene en el campo exponente un ntimero negativo, en este caso el —I. La representacién mediante arrays dela lista precisa tres arrays que llamaremos COEF, EXP y ENLACE. Esta representacién se muestra en la Figura 5-32(0). POLI a G Covent del témino (Pome ente =a ae me & & (@) Pout [1 3] 2 8 4 ee me a ul km oe le od ht é{~| fe] 8 pisp [2 Sx? 32 +4. Ml td A Hb 1 } too et ek ox CAP. 5} 165 LISTAS ENLAZADAS S10. LISTAS DOBLES Todas las listas discutidas anterioumente reciben el nombre de listas simples 0 wnidireccionales, Puesto que sélo existe un modo de recorrtrlas. Asi, empezando con Ia variable puntero COMIENZO y utilizando el campo puntero ENLACE que apunta al siguiente nodo de a lista, s6lo podemos recorrer la lista en una direccién, Por ello, dada Ia posicidn LUG de un nodo N de la lista, tenemos acceso inmediato al nodo siguiente (evaluando ENLACE[LUG)}, pero no tene- ‘mos acceso a nodos precedentes sin recorrer parte de la lista. Esto significa, concretamente, que debemés atravesar aquella parte de la lista que precede a N para eliminarlo de la lista. En esta seccién introduciremos una nueva estructura, denominada lista doble 0 bidiceccional, que puede recotrerse en dos direcciones. En sentido directo del principio hacia el final de la lista 0 en sentido inverso del final. hacia el comienzo de la misma, Por ello, dada la posicidn LUG de un nodo N de la lista, tendremos acceso inmediato al nodo sucesor y.predecesor del mismo. Esto significa que es posible eliminar un nodo de la lista sin necesidad de recorrer ésta. Una lista doble es una coleccién lineal de elementos, llamados nodos, donde cada nodo est * dividido en tres partes: — (1) Un campo de informacién INFO que contiene el dato de N. (2) Un campo puntero SIG que contiene la direccién del siguiente nodo de la lista. (3) Un campo puntero ANT que contiene la posicién de! nodo anterior en Ja lista. La lista necesita ademas dos punteros que apunten hacia ella, PRIMERO que apunta al primer nodo de la misma y ULTIMO que lo hace al sltimg nodo. La Figura 5-33 muestra uni diagrama esquemiticd de esta organizacién, Obsérvese que l campo SIG del tltimo nodo contiene el untero nulo, al igual que el campo ANT del primer nodo de la lista : PRIMERO ULTIMO ‘Campo INFO del odo N [4 {Campo putero ANT del nodo N GB (r Camp punteo SIG del redo N be] Fig, 5-33 Lista doble. c Con esta organizacién, utilizando la variable PRIMERO y el puntero SIG, podemos recorrer la lista en el sentido habitual. Andlogamente, utilizando la variable ULTIMO y el campo puntero ANT, podremos recorrerla en sentido inverso. . Supongamos que LUGA y LUGB son tas posiciones de los nodos A y B de una lista doble. Por la forma en que-los puntefos SIG y ANT estan definidos, podemos escribir que: Propiedad de los punteros: SIG[LUGA]=LUGB si y solo si. ANT[LUGB]=LUGA & en, que afirmar que el nodo B sigue al nodo A es equivalente a decir que el nodo A antecede al B. . __ Las listas dobles pueden representarse en memoria mediante arrays lineales, al igual que las listas simples. La Gnica diferencia con éstas es que necesitaremos dos arrays de punteros SIG y pen : a ae ae | =a =a & bd LISTAS ENLAZADAS {CAP. 5 ANT cn ugar de ray de puntros ENLACE de sistas simples Amie nee dos puteros hacia la lita PRIMERO y ULTIMO en lugar de puntero COMIENZO En cambio la ae le nodos disponibles podemos mantenerla en la misma forma en que la representébamos, Sto que insertamios y borramos en ella siempre por el mismo sitio. EJEMPLO 5.21 Ay Gonsidremos de nuevo la lista dela Figura 5-9 que almacena los pacientes de un pabellén com 12 camas, « Figura 534 muesira cémo podemos organiar allabéicamente Ia Ist utlcando, ona Te dobe. iF rvese que los valores de PRIMERO y SIG son los mismos que los de COMIENZO y ENLACE, ‘spectivament; por el, I lista puede recorresealiabeticament como anes, Pore one wtiizando Samueia, los punteros ANT, podremos recorrerla a su vez en orden inverso. Ast ULTIMO apunta 2 ena campo ‘ANT de Samuels apunta a Nelson, el puntero ANT de éste apunta a Maxwell y asi PRIMERO CAMA SIG ANT 3 1 | Kirk 7 8 2 6 Ee 3 | Dean n 5 9 4 | Maxwel || 12 7 5 | Adams 3 0 DIsP 6 0 10 7 | Lane 4 1 8 | Green 1 n 9 | Samuels 0 2| 10 2 11 | Fields 8 3 12 | Nelson 9 4 Fig. 5-34 dobles con cabecera Las ventajas de las listas dobles y de las listas citculares con cabecera pueden combinarse en las denominadas listas circulares dobles con cabecera (Fig. 5-35). La lista es circular debido a que los nodos extremos apuntan hacia el nodo cabecera, Obsérvese ademas que esta lista sélo’ necesita tuna variable puntero hacia ella COMIENZO y que apunta al nodo cabecera. Esto es debido a que los dos campos punteros del nodo cabecera apuntan uno a cada extremo de la lista CAP. 5} LISTAS ENLAZADAS COMIENZO ‘I s Nod N Fig. 535. Lista doble, circular y con eabecera EJEMPLO 5.22 ‘Sea el archivo de personal de la Figura 5-30, que esta organizado como ut Partiendo de esta organizacion podemos representar los datos como una lista ci mis que afiadir otro array ANT que contenga las posiciones de los nodos precedentes. Esta estructura se representa en la Figura 5-36, donde ENLACE se renombra como SIG. Nuevamente la lista DISP permanece ‘como una lista Gnica simple, ina lista circular con cabecera. jrcular, dable con cabecera sin 167 = NOMBRE Nss SEXO SALARIO. SIG ANT i 0 ee 2 | pais | [asza6me2 | [emia | | 2200 | [2 3 | Key | | 165.643351 | | varén 1900 | | 7] | 4 | Green] | 175-56:2251 | | varén am | [14 | | 12 Dis 5 S| |e. 08 ls } | 10 | 8 6°] Brown | | 17¢-52-1065 | | Hembra | | 14700 9 7 | Lewis | | 181-58-9939.| | rtembra | [16400 | | 10 8 u 9 | cohen | | 177444557 | | varén woo | | 2 6 10 | Robin | | 13546-6062 | | tember | [ assoo | | s 7 u B 12 | evans | | 168568113 | | Varon um | fa] [2] 3 | 14 | Harris | [ 208-56-1654 | | vember} [22800 3| [a Fig, 5.36 ——— a ee ee —— ee ~~ — 1d) = See se a ee ode de de ee seebee es 1a LISTAS ENLAZADAS (CAP. 5 Luc Nodo Fig. 5.37 Borrado del nodo N. Operaciones con listas dobles Supongamos que LISTA es una lista doble almacenada en memoria. En esta subsecci6n discutimos una serie de operaciones sobre la lista. _Recorrido. Si queremos recorrer LISTA para procesar una tinica vez cada nodo, podemos utilizar el Algoritmo 5.1 si LISTA es una lista doble ordinaria o el Algoritmo 5.11 sila lista contiene un nodo cabecera. En este caso no existe ninguna ventaja si utilizamos una lista doble en lugar de una lista simple. Basqueda. Supongamos que conocemos un ELEMENTO de informacién (un valor de clave) Y queremos encontrar la posicién LUG que ocupa ELEMENTO en LISTA. En este caso podremos utilizar el Algoritmo 5.2 si LISTA se organiza como una lista doble ordinaria o bien el Algoritmo 5.12 si lista tiene nodo cabecera. La ventaja que ‘obtenemos si utilizamos una lista doble es que podemos buscar ELEMENTO en sentido inverso si sospechamos por alguna razbn que éte se encuentra cerca del final de ellae Por ejemplo, supongamos que LISTA esta compuesta por tun conjunto de nombres ordenados“alfabéticamente, Si ELEMENTO=Smith, entonces podemos buscar en lista en orden inverso. Por el contrario, si ELEMENTO = Davis, deberemos buscar en direct Eliminar. Supéngase que conocemos la posicién LUG de.un modo N de LISTA y queremos eliminar el nodo N de la inisma. Suponemos que LISTA es una lista circular doble con cabecera. Natese que ANT[LUG] y SIG[LUG] son las posiciones de los nodos anterior y posterior a N, respectivamente. Debido a esto, tal como se refleja en Ia Figura 5-37, eliminamos N de la lista sin mas que cambiar los siguientes punteros: sIG[LUG] y ANT[SIG[LUG]]: = ANT[LUG] SIG[ANT[LUG]] ‘A continuacién devolvemos el nodo N a la lista DISP mediante las asignaciones: SIG[LUG]:=DISP, y ISP: =LUG Una representacién formal del algoritmo expuesto es la siguiente: BORLD(INFO, SIG, ANT, COMIENZO, DISP, LUG) 1. [Elimina el nodo}. SIG[ANT[LUG]}: =SIG[LUG] y ANT[SIG[LUG]}: = ANT[LUG). [Devuelve el nodo a DISP]. Algoritmo 5.15: SIG[LUG]: = DISP y DISP: = LUG. Salir. CAP. 5] LISTAS ENLAZADAS ud Luca Luan Fig. 5-38 Insercién del nodo N. En este algoritmo podemos ver una de les principales ventajas de les lstas dobles: Si Jos datos estuvieran organizados en una lista simple, para eliminar N, tendriamos que recorrer Ia lista para localizar el nodo anterior’a N. Tncercién, Supongase que conocemos la posiciones LUGA y LUGB de dos nodos adyacentes Avy Bde LISTA y que queremos insertar ELEMENTO entre Jos dos, como en el caso de tivas auicecionales cattnemps previamente un nodo de la lista DISP, utilizando la variable NUEVO pata Toclizar su posiin y posteriormente copiamos ELEMENTO en el nodo N: es decir, acemos: NUEV( Isp, DISP: =SIG[DISP], __ INFO[NUEVO]: =ELEMENTO Posteriormente, como se representa en la Figura 5-38, insertamos el nodo N que contiene ELEMENTO en [a lista cambiando Jos punteros siguientes: SIG[LUGA]:=NUEVO, — SIG[NUEVO- ANT[LUGB]:=NUEVO, — ANT[NUEVO] LUGB UGA Una formalizacién del algoritmo es la siguiente: Algoritmo 5.16: INSLD(INFO, SIG, ANT, COMIENZO, DISP, LUGA, - Sag IsLDM IGA, LUGB, ELE 1. {Oveow!] Si DISP-=NULO, entones: Esritiz: OVERFLOW y salir. 2. NUEVO:=DISP, DISP:=SIG[DISP], INFO[NUEVO]:=ELE- MENTO. [Extrae un nodo de la lista disponible pee wade en nuevo nodo). [Inserta el nodo en la lista]. SIG[LUGA]: = NUEVO, SIG[NUEVO]: = LUGB, , ANTELUGE] UEVO, ANTINUEVO] UGA. i. Sali. = a ae LISTAS ENLAZADAS (car. 5 ne un nodo cabecera. Por tanto, LUGA 0 N se insertard como primer nodo 0 como 10s considerar los casos en | caso en que En el Algoritmo 5.16 suponemos que LISTA contie LUGB pueden apuntar al nodo cabecera, en cuyo caso ‘ultimo nodo de la lista. Si LISTA no contiene nodo cabecera, deberem que LUGA=NULO y, por tanto, N se inserta como primer nodo de la lista y ¢! LUGB=NULO y N se inserta como tltimo nodo de la misma. | . Comentario: En general, almacenar datos en una lista doble que requiere espacio de memor'# extra y tiempo adicional para cambiar punteros, no suele ser ventajoso, respecto del caso de lista simple, nada mas que cuando necesitamos encontrar con frecuencia el nodo que precede al que ‘queremos tratar, como es el caso de eliminacién. Problemas resueltos LISTAS ENLAZADAS 5.1 Obtener las cadenas de caracteres almacenadas en las cuatro listas enlazadas de la Figu- ra 5-39, Los punteros hacia cada lista se almacenan en el array CIUDAD. Empezando por CIUDAD[L] recorremos la lista siguierido el orden marcado por los enlaces y obtendremos la cadena PARIS. A continuacién, y a partir de CIUDAD[2], recorremos la lista para obtener la cadena LONDON. Puesto que CIUDAD[3]=NULO (por convenio el cero), la tercera lista se encontrara vacia; por tanto, la cadena almacenada sera A, que simboliza la cadena vacia, Finalmente, empezando en CIUDAD[4], recorremos Ia lista hasta obtener ROMA. En resumen, las cuatro cadenas son PARIS, LONDON, A y ROMA. 52 Asignamos la siguiente lista de nombres y por este orden a los componentes de un array que denominamos INFO: Mary, June, Barbara, Paula, Diana, Audrey, Karen, Nancy, Ruth, Eileen, Sandra, Helen E§ decir, INFO[1]=Mary, INFO[2]=June,..., INFO[12}=Helen. Asignar valores a un array ENLACE y a una variable puntero COMIENZO, de tal forma que el conjunto INFO, ENLACE y COMIENZO representen una lista enlazada ordenada alfabéticamente. El orden alfabético de los nombres es ¢l siguiente: Audrey, Birbara, Diana, Eileen, Helen, June, Karen, Mary, Nancy, Paula, Ruth, Sandra Los valores que deben contener los elementos de ENLACE y el valor de COMIENZO se obtienen de a forma sigui (a) INFO[6]=Audrey, luego asignamos COMIENZ (6) INFO[3]=Barbara, por tanto asignamos ENLACE{6]=3. (6) INFO[S]=Diana, luego asignamos ENLACE[3}=5. (a) INFO[10]=Eileen, luego asignamos ENLACE[5]=10. Y asi sucesivamente. Puesto que INFO[I1]=Sandra es el iltimo nombre, debemos asignar ENLACE[IIJ=NULO. En la Figura 5-40 se muestra la estructura en la que suponemos que INFO tiene espacio para 12 nombres s6lo, por lo que debemos hacer DISP=NULO. CAP. 5) LISTAS ENLAZADAS cupad CAR ENLACE Va | tya] [as als 2{o] [o> 3] 0 3] a 0 r «Las | afi Is sft " o|™ 3 7[N o sin 2 sfo 7 wo 6 nfo 8 2|P 1 13-] R 10 wfR 4 s|s ° 16 Fig. 5:39 INFO ENLACE ‘COMIENZO 1 | Mary 8 [é 2 | June 7 3 | Barbara 5 DIsP 4 | Paula 9 [ 0 ] 3 | Diana 10 6 | Audrey 3 7 | Karen 1 8 | Nancy 44 9 | Ruth n 10 | Eileen 12 1 | Sandra 0 12 | Helen 2 Fig. 5-40 m1 op pps ss = 3 mp n LISTAS ENLAZADAS- (CAP. 5 53 Sea LISTA una lista slmacenada en memoria, Eseribir un procedimiento que: (a) pes el niimero de veces NUM que se encuentra un determinado ELEMENTO en (6) Obtenga el niimero NUM de elementos distintos de cero de LISTA. (c) Sume un determinado valor K a cada elemento de LISTA. Cada procedimiento utiliza el Algoritmo 5.1 para recorrer la lista. (a) Procedimiento PS.3A: 1. =0. [Inicializa el contador]. 2 Llama Algoritmo 5.1, reemplazando el paso proceso por: Si INFO[PTR]=ELEMENTO, entonces: NUM: =NUM +1. Retornar. 3 (0) Procedimiento PS.3B: 1, NUM: =0, [Inicializa el contador). 2 Llama Algoritmo 5.1, reemplazando el paso proceso por: Si INFO[PTR] #0, entonces: NUM: =NUM +1. 3. Retornar. (6) Procedimiento P53C: 1. Llama Algoritmo 5.1, reemplazando el paso proceso por: INFO[PTR]: =INFO[PTR]+K. 2. Retomnar. va ray 54” Dada Ia lista de pacientes de la Figura 5-9, determinar los cambios introducidos en la estructura de datos si: (a) Afiadimos Walters a la lista. (b) Después de la operacion anterior eliminamos Kirk de la misma, (@) Obsérvese que debemos colocar a Walters en la cama 10, que es la primera disponible y que debe insertarse después de Samuels, que es el iltimo paciente de la lista. Los cambios en los campos unteros que debemos realizar son los siguientes: 1, ENLACE{9]=10. [Ahora Samuels apunta a Walters}. 2, ENLACE[10]=0. [Ahora Walters es el ultimo paciente de la lista). 3. DISP=2. [Ahora DISP apuntard a la siguiente cama vacia] ‘COMIENZO CAMA ENLACE 5 1 2 2 6 3 | Dean u 4 | Maxwent | | 12 DisP 5 | Adams 3 1 6 0 7 | Lane 4 8 | Green 7 , 9 | Samuels | | 10 10 | Walters 0 | 11 | Fields 8 12 | Nelson 9 Fig. S41 eee Wh cab. 3) LINTAS PHLAZADAS wun en teen cole (6) Presto que eliminatno w Kitk, CAMAL I] quedrd vacla. Harn elt relia siguientes en los punteros: ENLACE[R]=7 ENLACE I= 2 itt 1 { ae pana wae ie Con el primer cambio, Green, que originalmente precedia w Kith, rants egal Hit # fiverormente regan Kirk, Lox ein sun ytrcero aen ee gad | lista de nodos disponibles, Recalcanos nuevarnente que antes wl neds CAMAAL TL dcheremos localizar el node CAMALK], que origiualmente aptnta Ht 1 queremos borrar, En la Figura 5-41 se muestra tn nueva estructura inittno ‘i GA, Liscribir un algoriten 2 Supongamos que se almacena en memoria fa lista enlarada LISTA, Eserib que climine ef tiltimo nodo de LISTA, wicion del genic norte sk Etim nod séo puede eliminate cuando eonocernos a posi del gente naa 7 lista. Para ello debe corset esta uid on panteron #1 Ry AU de tl ern ae ie 4g Retualiemos TTR AUX deberd npuniy a sto ue antes ett TR Crane CELPTR] = NULO, PTR estara apuntando al dltimo nodo y por tanto AL ele ee a Pema ‘caso en que LISTA contenga un dnico node se trata por separado, ya que AUX silo p LISTA contiene al menos dos nodos. El algoritina es el siguiente: Algoritmo P5.5: BORULT(INFO, ENLACE, COMIf.NZO, DISP) E! algoritmo elimina ef ditimo nodo de ta lista ‘ 7 y 1. [Lista vacin?) Si COMIENZO = NULO, entonces: Escribit; UNDERE LOW Sa ey 2 {ata tite contene un slo elementa Si ENLACE[COMIBNZO} = MULE slg COMILNZO: = NULO, [Bini e nd] OMIENZO: =: NULLO, (Eliminamos el odo), | - th) ENEACH(COMIENZO}: =DISP y DISP: »COMIENZO, (Devol vemos el niodo a ta lista de disponibles} | (o Salt. on al de la estructura condicional), . a 3 ft 1 SENLACELCOMIENZO) H] y AUK: = COMIENZO, [Inicializarion los punteros], Repetir mientras titimo nodo}. AUX: = PTR y PTR: = ENLAC [Final del ciclo}. : : 5. ENLACE[AUX]: = ENLACE{PTI) (Eliminamos el Gltimo nodo 6 ENLACELPTR]: = DISP y DISP: = PTR, (Devolvemos el nodo a la lista de disponibles}, 1. Sali. ILACE[PTR] / NULO, [Recorremos la lista en busca def WEN), [Actualizamos lor punteros) 5.6 Sea NOMBRE! una lista enlazada almacenada en memoria, Escribir un algotitmo que copie la lista NOMBRE en otra Ilamada NOMBRE2, Primeramente hacemos NOMBRE2: = 1 para crear una lista vacia. A continuaciom eecorrermon la lista NOMBRE! utilizando el punteso PTR y mientras vsitamos cada nodo de NOMBREI copinrnon Su contenido en otro nodo, el cual insertamos a final de-¢NOMBRE2. En Ia Figura 5-42 ue ynosstre tg ssituacién de PTR y LUG antes de afiadir el euarto nodo a la lista NOMBRE2. En este caso utilizamos EUG para apuntar el iltimo nodo de NOMBRE2 durante todo el recorsido de NOMBRE. (None Ae odemos utilizar el Algoritmo $.5 para insertar los nodos en NOMUKED, detes del rocks seus LUG) La inserién del primer nodo en NOMBIE2 debe tratarve por eparado, puesto ieiante: 72 4 defnido hasta que NOMBRE? tenga como minimo un odo, El sgoritivg cs e siguiente: \ Boi lea a ee \ ee — = 174 Algoritmo P56 COPIAR(INFO, ENLACE, NOMBRE! LISTAS ENLAZADAS SOMBRE? DISP) iizando NOMBRE2 como El algoritmo realiza una copia de la Esta NOMBREL variable puntero hacia la noéva Ista. 1. NOMBRE2: =NULO. [Isicslizeros la sta vecis]. 2. [/NOMBREI esté vacia7] Si NOMBREI=NULO, extoaces: Soir. 3. [Insertamos el primer nodo de NOS Llamas INSLUGNFO, ENLACE, NOMBRE2, DISP, NULO. INFO[NOMBRE!)) 0 bie: . (a) Si DISP=NULO, extonces Escribix OVERFLOW y Sel. () NUEVO: =DISP y DISP: =ENLACE[DISP]. [Extremes el pr mer nado de le lista disponible). (9 INFO[NUEVO]: =INFO[NOMBRE!}. {Copiames el éato = et nuevo nodo} (2) [nsertamos el nuevo nodo como primer nodo de NOMBRE]. ENLACE[NUEVO]: = NOMBRE? y NOMBRE2: =NUEV( 4. [Inicializamos los punteros PTR y LUG]. PTR: =ENLACE[NOMBREI] ¥ LUG: =~ NOMBRE? 5. Repetir pasos 6 ¥ 7 SULO: 6 Lamar INSLUG(INFO. ENLACE, NOMBRE2, DISP, LUG, INFO[PTR]) 0 biex: (@) Si DISP=NULO, extonces: Excibir: OVERFLOW ¥ Sali. ®) =DISP y DISP: =ENLACE[DISP]. © INFO[PTR]. [Copiames e! dato ea el nuevo )MBRE2 2 continuacién del nodo (2) [asertamos el nuevo nodo ex con direcoiéa LUG]. ENLACE[NUEVO}:=ENLACE{LUG] y ENLACE[LUG]:= NUEVO. 7. -ENLACE[PTR] y LU ENLACE[LUG]. [Actualizamos PTR y LUG]. [Final del ciclo del paso 5). 8. Salir. NOMBREL ™ AAA [e}—e BBB ccc | DDD Eee |e} +--- sows we mesa . 175, CAP. 5} LISTAS ENLAZADAS LISTAS CON CABECERA, LISTAS DOBLES Silo 1 57 Convertir en listas circulates con cabecera las listas simples de la Figura 5-1]. Elegimos EXAMENT1] como nodo cabecera pata la lista ALG y EXAMEN[I6] como nodo cabecera de la lista GEOM. Entonces para cada lista (a) Cambiamos el puntero hacia la lista de forma que apunte al nodo cabecera. (6) Cambiamos el nodo cabecera de forma que apunte al primer nodo de la lista (c) Cambiamos el tiltimo nodo de forma que apunte al nodo cabecera. Finalmente reorganizamos la lista DISP. La Figura $-43 muestra la estructura de datos actualizad EXAMEN ENLACE ge u Pa 3 15 auc | 1 4] 8 1 s] #] [2 6 | 7% | | 16 Geom [16 | a sim] | o 9 10 10 3 pisp | 9 un] 2 2] 7 13 | 74 6 Wf 93 4 15 0 6 5 Fig. 5-43 58° Obtener los polinomios POLII y POLI2 almacenados en Ia estructura de la Figura 5-44, Empezando por POLI recorremos la lista siguiendo los punteros para obtener el polinomio: pilsl=3x— 40° + 6x—5 Sree = 2 2 SS SS = = SS "6 LISTAS ENLAZADAS (CAP. 5 COEF EXP ENLACE Tpeo) 5 2 roun [7 | roun [10 “[3} 2) ] 0 stale} [os 6 2 8 9 fos] Pol [a le se CC 10 =| | « Fig 5.4 Comenzando con POLI2 recorremos la lista, siguiendo los punteros para obtener el polinomio palx)= 2x8 4 Tx8 —3? En la representacign COEF[K] y EXP(K] contienen el valor del coeficiente y del exponente de cada término respectivamente. Obsérvese que los nodos cabecera tienen asignado el valor ~1 en el campo EXP. / 59 Sea plx, y, 2) un polinomio en las variables x, y z. Decimos que el polinomio esté ordenado Texicogréficamente cuando los términos se colocan de acuerdo con el orden decreciente del ‘exponente x. Si dos términos tienen igual valor del exponente de x, los ordenamos por orden decreciente del de y, finalmente aquellos con igual valor del exponente de ambos se ordenan de la misma forma segin el exponente de z. Supongamos que el polinomio es pls, ys )=8x2y22—6y2" +324 Daye Sty Any"? (a) Ordenar el polinomio lexicograficamente, {b) Supongamos que el polinomio se almacena en el orden anteriormente expuesto, en los, arrays lineales COEF, XEXP, YEXP y ZEXP cada uno de los cuales contiene un nodo cabecera. Asignar valores al array ENLACE de tal forma que la. lista enlazada resultante almacene el polinomio ordenado lexicograficamente. El primer término serd 3x%yz, puesto que es el de mayor grado en x. El siguiente término lo debemos elegir entre 8x7) y ~5x7y°, pues tiene igual grado en x. Pero como —Sx?s? tiene mayor grado en y, deberemos colocarlo delante del otro, Este proceso lo repetiremos hasta que s€ fagoten todos los términos. El resultado final sera (a ort 3x Sxty°4 8s2y42— Any"? +2 ples. (b) La Figura 5-45 muestra la estructura de datos resultante. r L 177 5 2 1 1 3 p 6) -5 2 0 2 c 7) - 1 3 5 . Q 8 , re 5.10 Sefialar las ventajas, si existen, de las listas dobles frente a las simples al realizar las siguientes’ operaciones: 23 (a) Recorrer la lista para procesar todos los nodos. (6) Eliminar un nodo cuya posicién LUG es conocida. (c) Buscar en una lista desordenada un determinado ELEMENTO. (a) Buscar en una lista ordenada un ELEMENTO. (e) Insertar un nodo delante de otro de posicién LUG conocida, (/)_Insertar un nodo detrés de otro de posicién LUG conocida. fo ee (a) No existen ventajas. (6) Necesitamos conocer Ia posicin del nodo anterior. Las listas dobles contienen esta informacion, tras que en las listas simples necesitamos recorrer la misma. ] (c)_ No existen ventajas. (@ No existen ventajas salvo que sepamos que ELEMENTO se encuentra al final de la lista, en cuyo caso podemos recorrer la lista al revés. Por ejemplo, si buscamos Walker en una lista ordenada, es mas répido recorrer Ia lista en orden inverso. (e) Como en el caso (b), la lista doble es més eficiente. (N No existen ventajas. Comentario: En general, una lista doble no es mucho més eficente i taro: l le que una simple salvo en cas muy especiales. " ~ { Sl Suponsames que LISTA es una lista enlazada circular con cabecera almacenada en ria, Escribir ur it imine el tlt ai meme, Eicon Algoritmo que elimine el iltimo elemento de LISTA. (Comparese con El algoritmo es el mismo Problema 5. pt Mos oF caso que el del Problema 5.5, excepto que ahora poder Podemos omitir el cas especial en que ISTA jenga un solo nodo. Es decir. podemos definir de forma inmediata AUX 178, 5.12 “Zia) A, LISTAS ENLAZADAS [ear. 5 Algoritmo PSI: BORLSTC(INFO, ENLACE, COMIENZO, DISP) EL algoritmo elimina el tiltimo nodo de una lista con cabecera, 1. '[aLista vacia?) $i ENLACE[COMIENZO) =NULO, entonces: Escribit UNDER~ FLOW y Sali. : 2 PTR: =ENLACE[COMIENZO] y AUX:=COMIENZO, [Inicializamos los punteros). 3. Repetir mientras ENLACE{PTR]#¢COMIENZO, [Recorremos la lista buscando al tiltimo nodo}. AUX: =PTR y PTR: =ENLACE[PTR}. [Actualizamos punteros). [Final de ciclo 4. ENLACE[AUX]: =ENLACE[PTR]. (Eliminamos el iitimo nodo). 5. ENLACE[PTR]: =DISP y DISP : = PTR. [Devolvemos el nodo a Ia lista DISP]. 6. Salir. Convertir las listas simples con cabecera de la Figura 5-43 en listas dobles. Recorremos la lista ALG y obtenemos: ALG a « Necesitamos también los punteros inversos. Estos los tenemos que calcular nodo a node. Por ejemplo, €l iltimo nodo (con posicién LUG =4) debe apuntar al peniiltimo (con posicién LUG= 14, Por tanto: ANT(A)=14 El peniltimo nodo (én la posicién 4) debe apuntar al nodo anterior (en la posicién LUG =2). Lucgo: ANTUI4]=2 Y asi sucesivamente. El nodo cabecera (con la posicién LUG=1) debe apuntar el ailtimo (con la posicion 4}. Por tanto: ANTE =4 Un procedimiento similar es el que debemos seguir pura realizar la misma operaci6n con 1a lista GEOM. En la Figura 5-46 se muestran las listas dobles resultantes, Obsérvese que no existen modili- caciones en los arrays ENLACE y SIG. Puesto que el Unico que debe calcularse es el array ANT. Problemas suplementarios LISTAS ENLAZADAS En la Figura $-47 se muestra una lista que contiene el nombre y ntimero. de habitacién de cinco pacientes de un hospital. (a) Asignar valores a COMNOM y NENLACE para obtener una lis Enlazada ordenada alfabéticamente. (b) Asignar valores a COMHAB y HENLACE para obtener unt lista ordenada por nimeros de habitucion, b La Figura 5-48 muestra una lista enlazada almacenada en memoria. mY fro CAP.) ALG \ GEOM ISP. LISTAS ENLAZADAS examen SiG ANT (Pa e) es afm Poe] fan | 3 sf] {| sfPelfo] be] s| #| [2] [a6 «| wl] {wo} | 3 : Taw} | e] [2 100 13 | 7] | | | 3 «| [2] [a @|{7|[s «| Del [a o{ fel [2 0 ies] LS 6 Fig. 5-46 (a) Obtener la secuencia de caracteres de Ia lista (6) Supéngase que se borran F y C de la lista por este orden y posteriormente se afiadé G al ccomienzo de la misma, Obtener la estructura final obtenida. (ce) Supéngase que se eliminan C y F dela lista por este orden y que posteriormente insertamos G al comienzo de la misma. Obtener la estructura final : (a) Supongamos que se inserta G al comienzo de Ia misma y posteriormente se eliminan F y G, por este orden, de la lista. Obtener la estructura final. | bom [0 sum [a a name [7H veo a TE. = q ~ LISTAS ENLAZADAS eas 4 G] A [ = Fig. S48 ' Wat abe \ tn 4 ; * tn A Lt PIRES eae Cis) Supongamos que LISTA es una lista enfazada almacenadi en memoria y que contiene sblo valores 4) numéricos, Escribir los procedimicntos que realizan las siguientes tareus’ ws £4) Caleular el miximo valor contenido en LISTA, ¢ | (6) Cateular ta media de los valores de LISTA. (6) Caleular el producto de los elementos de LISTA. i ; 5.16 Dado un entero K, escribir un procedimiento que elimine el k-ésimo elemento de una lista enlazada, S17 Escribir un procedimiento que aflada ELEMENTO al final de una lista enlazacda Gay Eseribir un procedimiento que extraiga el primer elemento de una lista y lo atada al inal de La misma, sin cambiar el valor de INFO. (Solo deben alterarse los valores de CONOCIMIENTO y ENLACE) 5.19. Escribir un procedimiento INTER(INFO, ENLACE, COMIENZO, K) que intercambie los elementos Ky K+1 de la lista sin cambiat los valores de INFO. Escribir un procedimiento ORD(INFO, ENLACE, COMIENZO) que ordene una lista sin cambiar ringin valor de INFO. (Aywla: Utilizar el procedimiento INTER del Problema 5,19 junto con el método de la burbuja,) Sa a ae ae = & 521 Supongamos que AAA y BBB son lists enlazadas y ordenadas compuestas por distintos elementos y flmacenadas ambas en los arrays INFO y ENLACE, Escribir un procedimiento que mezcle las dos Tistas en una tnica lista enlazada CCC, de tal forma que esta dltina esté asimismo ordenada y sin cambiar ningiin valor de INFO. En los Problems del 5.22 al 524 se supone que las eadenas de caracteres se almacenan en listas enlazadas almacenando cada nodo un eardeter y compartiendo todas las cadenas los mismos arrays INFO y ENLACE, = 5.22 Sea CADENA una cadena de caracteres almacenada en memor (a) Eseribir un procedimiento SUBCADENA(CADENA, K. N) que imprima tn subeadena de CADENA que empieza en el h-ésimo cardicter y tenga Jongitud N, fe et (6). Escribir un procedimiento que eree en memoria una nueva cadena SUBKN, tal que: SUBKN=SUBCADENA(CADENA, K, N) CAP. 5] LISTAS ENLAZADAS 523. ‘Sean CADI y CAD? dos cadenas de caracteres almacenadas que sea el resultado de la concatenacién de CAD! y CAD: $24 Sean TEXTO y SECUENCIA dos cadenas almacenedas INDEX(TEXTO, SECUENCIA) que obtenga la posicién de aparece por primera vez en el mismo, LISTAS CON CABECERA; LISTAS DOBLES la CARTI9] y CARLI8] comio nodos cabecera. Almacenamos tres cadenas de caracteres en las listas enlazadas de la Figura cadenas. (b) Formar tres listas circulares con cabecera a partir de estas li 181 bi jento en memoria. Escribir un procedimien 2 rocedimiento emoria, Escribir un procedinietr TEXTO a partir de la cual SE TEXTE 5.49. (a) Obtener las tres istas utilizando CAR[20)- ESTADO CAR ENLACE — a fea aft 4 Y 2 [fs 2|i 14 It 3 uo sfa| [4s 4 a|o s|M 6|s 0 7|0 9 DisP stel be * o|H 1 —_ wo | T 8 ule 0 nia 2 3 |x 3 win " 15 0 16 15 v 16 tf 18 7 19 18 20 [9] Fig. 5-49 a LISTAS-ENLAZADAS IcaP.s 526 Obtene los tres polinomios almacenados en las tes listasenlazadas de Ia Figure $-50- coer EXP_-ENLACE Jl Gl o be 2 0 ; 6 6 3 5 1 wf-s} | of [2 nD | | B uBf | 1s fs 7 : ° (=) Dado potinonio piss ps) 22g Beye Hays Sey 672 (a) Ordenar lexicograficamente el polinomio. (0) Supéngase qu ls términos se almacenan ordenados en la form expuesta en los arrays COEF. XtReP. YEXP y ZEXP. Asignar valores a un array ENLACE de tal forma que ta lista enfazada ‘esultante contenga el polinomio ordenado lexicogrificamente, (Véase Prob. $9.) Eseribie un procediniento CABINFO, ENLACE, COMIENZO, DISP) que transforlhe una lista cnlazada simple en otra circular con cabecera. ‘ 15.20 utilizando una lista circular con cabevera en lugar de \. 529 Resolver nuevamente los Problemas 5.16 al mos son ahora mucho mis sencillos) tuna lista simple. (Obsérvese que los algorit ios de una variable almacenados en listas circulares con cabecera / 530 Scan POLI y POLI2 dos potinom XP y ENLACE. Escrbit un procedimiento compartiendo los arrays COEF, ED SUMICOEF, EXP, ENLACE, POLI, POLI2, DISP, SUMPOLI) | ean 9) | USTAS ENLAZADAS 183 gue obtenga ta utilizando COE SUMPOLI Py ENLACES POEM y POLI2. (EI resultado debe almacenarse también S3U_Para tos potinomios POLI y POLI2, MULTCOEF, escribir un procedimiento ENLACE, POLII, POLI2, DISP, PRODPOLI) salcule el producto PRODPOLI de los polinomios POLI y POLI2. \ S28) Formar tres tistas dobk a . lista 6s con cabecera a partir de las listas simples de la Figura 5-49 utilizando, al gual que en el Problema 525, CAR[20], CAR[19] y CAR[I8] como nodos cabecera. S33 Dado un entero K, que + escribir un procedimiento BORK(INFO, SIG, ANT, COMIENZO, DISP, K) . Gue climine el k-ésimo nodo de una lista doble circular y con cabecera, OV Se Sca LISTAUNFO, ENLACE, COMIENZO, DISP) una lista simple citcular y con cabecera ‘slmacenada en memoria, Escribir un procedimiento DOBLE(INFO, ENLACE, ANT, COMIENZO) Que asigne valores a un array ANT pata formar una lista doble a partir de la primera, Problemas de programacién Los Problemas 5.35 al $40 hacen referencia a la estructura de datos de la Figura 5-51, que consiste en cuatro listas de clientes, ordenadas alfabéticamente y sus correspondientes abogados. S35 Escribir un programa que Iea un entero K ¢ imprima la lista de clientes del abogado K. Probar el programa para cada K posible. $36 Escribir un programa que imprima el nombre y el abogado de cada cliente cuya edad sea L 0 mayor. Probar el programa usando (a) L=41 y (b) L=48. 537 Escribir un programa que lea el nombre LLL de un abogado ¢ imprima su lista de clientes. Probar el programa utilizando (a) Rogers, (b) Baker y (c) Levine. 5.38 Escribir un programa que lea el nombre (NOMBRE) de un cliente e imprima dicho nombre, edad de &te y abogado que le corresponde. Probar el programa utilizando (a) Newman, (b) Ford, (c) Rivers y (@) Hall. 539 Escribir un programa que lea el nombre de un cliente y elimint de la estructura el registro que se le signa. Probar el programa utilizando (a) Lewis, (b) Klein y (c) Parker. 540 Escribir un programa que lea el registro de un nuevo cliente, consistente en nombre del cliente (NOMBRE), edad (EEE) y abogado (AAA). € inserte el registro en la estructura, Probar el programa utilizando (a) Jones, 36, Levine, y (b) Olien, 44, Nelson. Los Problemas 5.41 al 5.46 hacen referencia a la lista de empleados de la Figura 5-30, que se almacenan como listas circulares con cabecers. 541 Escribir un programa que imprima toda la lista de empleados. : L L > = S>5> 5 SS 44 == 4 “a 184 LISTAS ENLAZADAS EDAD ENLACE 7 3 | Netson 21 3 | Ford 47 25 + fre] fe] [=] 7 | 26 I . 11 | Todd 25 oO 13: | Newman 46 ‘6 : 7 a a Eisen 32 1 a [asm] [ae] [8 neo | [| [= a [re] [=] Pe 25 | Graves 42 nn 2 v0 27 | Parker 50 9 2B 7 29 | Singer | 45 0 30 | Lewis 28 | 2 Fig. 5-51 Icar.s CaP. sy LISTAS ENLAZADAS 185 S42 Escribir un programa que lea el nombre NNN de un empleado e imprima el registro de éste en la list. Probar el programa utilizando (a) Evans, (b) Smith y (e) Lewis. S43___Escribir un programa que lea el nlimero de seguridad social SSS de un empleado e imprima el registro * de empleados. Probar el programa utilizando (a) 165-64-3351, (b) 136-46-6262 y (2) 17744-5555. " is 544° Escribir un programa que lea un entero K e imprima el nombre de cada empleado varén cuando ra ie el de los empleados mujeres cuando K =2. Probar el programa utilizando (a) K =2, (b) K=5 y@K= SAS __Escribir un programa que lea el nombre NNN de un empleado y elimine de la estructura el registro de dicho empleado. Probar el programa utilizando (a) Davis, b) Jones y (c) Rubin. 546 Escribir un programa que lea el registro de un nuevo empleado y lo inserte en el archivo. Probar el Programa utilizando (a) Fletcher, 168-52-3388, Mujer, 21.000; y (b) Nelson 175-32-2468, Varon, 19.000. Comentario: Recuérdese que hay que actualizar el registro cabecera cada vez que se realice una insercién © borrado. Institute Tecnoldgice de Acapulco ‘Gsnire de Informacién

También podría gustarte