View
11
Download
0
Category
Preview:
DESCRIPTION
Explicación de listas con pascal
Citation preview
LISTAS - CONTINUACINExplicacin Prctica 12Algoritmos Datos y Programas 2014Facultad de Informtica - UNLP
LISTAS DOBLEMENTE ENLAZADAS
Estas listas ordenan la informacin por un nico criterio, pero permiten obtener 2 vistas de la misma.
Ejemplo: Lista con informacin de alumnos (apellido, nombre, dni ) ordenada por apellido, de forma que permite acceder a la informacin en forma ascendente y descendente.
Cada nodo posee: - Datos (un campo es el criterio de orden) - 1 puntero al nodo siguiente - 1 puntero al nodo anterior
Si recorro a partir de Pri, y sigo los enlaces al siguiente obtengo listado ascendenteSi recorro a partir de Ult y sigo los enlaces al anterior obtengo listado descendentePara acceder a la estructura se lleva un puntero al primero y un puntero al ltimo nodo de la lista.
LISTAS DOBLEMENTE ENLAZADASDeclaracin de tipo:
Type alumno = record apellido, nombre:string; numero, dni: integer; end;
lista = ^nodo; nodo = record dato: alumno; ant: lista; sig: lista; end; lista_doblemente_enlazada = record pri: lista; ult: lista; end;Declaracin de variable:
var lde: lista_doblemente_enlazada;
LISTAS DOBLE ENLACE
Estas listas ordenan su informacin por 2 criterios de orden diferentes. As tenemos 2 vistas de los mismos datos.
Ejemplo: Lista con la informacin de alumnos (apellido, nombre, nroAlumno) accesible por dos rdenes diferentes: apellido (orden primario) y dni (orden secundario)
Cada nodo cuenta con: - Datos (un campo es el criterio de orden) - 1 puntero al nodo siguiente por el primer criterio - 1 puntero al nodo siguiente por el segundo criterio
Debemos llevar un puntero al primero por cada criterio de ordenCriterio 1: apellidoCriterio 2: nroAlumnoNILAlCoriaHughPlotReyZita925122220NILPri_apePri_nro
LISTAS DOBLE ENLACEDeclaracin de tipo:
Type alumno= record apellido:string; nombre:string; numero: integer; end; lista = ^nodo; nodo = record dato: alumno; sig_ape: lista; sig_nro: lista; end;
lista_doble = record pri_ape, pri_nro: lista; end;Declaracin de variable:
var ld: lista_doble
{Inicializacin de la lista doble}Procedure inicializarListaDoble(var ld:lista_doble)Begin ld.pri_ape:= nil; ld.pri_nro:= nil;End;
NILAlCoriaHughPlotReyZita925122220NILLd.pri_apeLd.pri_nro
LISTAS DOBLE ENLACE
Una vez cargada la lista, si quiero imprimir un listado en pantalla de la informacin ordenada por apellido podra hacer lo siguiente:
Procedure imprimirXapellido(ld: lista_doble);Begin while (ld.pri_ape nil ) do begin ImprimirAlumno(ld.pri_ape^.dato); ld.pri_ape:= ld.pri_ape^.sig_ape; end;end;
Procedure ImprimirAlumno(a: alumno);Begin writeln(apellido: , a.apellido); writeln(nombre: , a.nombre); writeln(nro alumno: , a.numero); writeln(dni: , a.dni);end;NILAlCoriaHughPlotReyZita925122220NILLd.pri_apeLd.pri_nro
LISTAS DOBLE ENLACE
ENUNCIADO: Realizar un mdulo que reciba la lista doble ld de alumnos y un apellido X elimine de ld el nodo cuyo apellido coincida con X.
Procedure eliminarXapellido (var ld: lista_doble; X:string; var ok: boolean)
NILAlCoriaHughPlotReyZita925122220NILLd.pri_apeLd.pri_nroPasos Borrado en lista doble-enlace
Buscar por el criterio apellido el nodo a borrar llevando un anterior y un actual Si se encuentra Marcar campo nro con NRO_NULO (-1) Rehacer enlaces por criterio apellido (CASOS?) Buscar nodo marcado (numero = -1) por el otro criterio Rehacer enlaces por criterio nro (CASOS?) Borrar el nodo con DISPOSE-1
Procedure eliminarXapellido (var ld: lista_doble; X:string; var ok: boolean);Var ant,act:lista;Begin ant:= nil; act:= ld.pri_ape; BuscarXapellido(act, ant, X, ok); {Busco por orden apellido-Como se vio en la teora} if (ok) then begin act^.dato.numero:= -1; {Marco el nodo a borrar} RehacerEnlacesOrdenApe(ld.pri_ape, act,ant); {Rehace enlaces por orden apellido} ant:= nil; act:= ld.pri_nro; BuscarXnumero(act, ant, -1, ok); {Busco por orden nro, ok siempre vendr en true} RehacerEnlacesOrdenNro(ld.pri_nro, act,ant); {Rehace enlaces por orden nro.} dispose(act); end; End;
{Rehace enlaces por orden apellido}procedure RehacerEnlacesOrdenApe (var pri: lista; act,ant: lista);Begin If (ant=nil) then {No avanz en buscar} pri:= act^.sig_ape Else ant^.sig_ape:= act^.sig_ape;End;
Procedure eliminarXapellido (var ld: lista_doble; X:string; var ok: boolean);Var ant,act:lista;Begin ant:= nil; act:= ld.pri_ape; BuscarXapellido(act, ant, X, ok); {Busco por orden apellido} if (ok) then begin act^.dato.numero:= -1; {Marco el nodo a borrar} RehacerEnlacesOrdenApe(ld.pri_ape, act,ant); {Rehace enlaces por orden apellido} ant:= nil; act:= ld.pri_nro; BuscarXnumero(act, ant, -1, ok); {Busco por orden nro, ok siempre vendr en true} RehacerEnlacesOrdenNro(ld.pri_nro, act,ant); {Rehace enlaces por orden nro.} dispose(act); end; End;
procedure BuscarXnumero(var act, ant:lista; X:integer; var ok:boolean); begin while (act nil) and (act^.dato.numero X) do begin ant:=act; act:= act^.sig_nro; end; ok:= (act nil);End;procedure RehacerEnlacesOrdenNro(var pri: lista; act,ant: lista);Begin if (ant = nil) then pri:= act^.sig_nro else ant^.sig_nro:= act^.sig_nro;End; Se puede obviar preguntar por (act nil) para este problema ?Por qu en este caso la 2da condicin es (act^.dato.numero X) ?
Ejercicio: Pensar en modificaciones para borrar TODOS los alumnos cuyo apellido sea X. Utilice los mdulos vistos.
Procedure eliminarVariosXapellido (var ld: lista_doble; X:string; var borrados:integer);Var ant,act,ult:lista; i: integer; ok:boolean;Begin ant:= nil; act:= ld.pri_ape; BuscarXapellido(act, ant, X, ok); {Busco por orden apellido} if ok then begin borrados:= 0; {cuento los nodos a borrar} while (act nil) and (act^.dato.apellido = X) do begin act^.dato.numero:=-1; {Marco el nodo a borrar} borrados := borrados +1; ult:= act; act:= act^.sig_ape; end; RehacerEnlacesOrdenApe(ld.pri_ape, ult,ant); {Rehace enlaces por orden apellido} ant:= nil; act:= ld.pri_nro; for i:= 1 to borrados do begin BuscarXnumero(act, ant, -1, ok); {Busco por orden nro} RehacerEnlacesOrdenNro(ld.pri_nro, act,ant); borrar:= act; act:=act^.sig_nro; {ant queda igual, avanzo en act porque dicho nodo se borrar} dispose(borrar); end; end;End;Todos los apellidos X estn seguidos, busco cul es el ult. que aparece.ult ser el ltimo nodo marcado a borrar que aparece con dicho apellido
Programacin de Computadoras - Curso 1996 -Programacin de Computadoras - Curso 1996 -*Programacin de Computadoras - Curso 1996 -*Programacin de Computadoras - Curso 1996 -*Programacin de Computadoras - Curso 1996 -*Programacin de Computadoras - Curso 1996 -*Programacin de Computadoras - Curso 1996 -*Programacin de Computadoras - Curso 1996 -*
Recommended