EP12-2014 Listas - Continuacion

  • Upload
    facuq

  • View
    9

  • Download
    0

Embed Size (px)

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 -*