UL 04 Ocupação Circular Listas com Descritor Ocupação Circular Ocupação circular Ocupação circular utilizando parte do arranjo Final da LL Início da LL Final da LL Início da LL 1 2 3 4 5 6 7 8 9 10 11 12 13
Ocupação Circular duas listas sobre o mesmo arranjo 10 11 4 14 17 18 20 56 24 18 24????????? 9 10 24 25 26 27 Espaço para L1 Espaço para L2 Tipo de dados para armazenar os elementos da lista Componentes para controle da estrutura lista inicializa(): Cria lista insere(): Insere um nodo na k-ésima posição da lista remove(): Remove o k-ésimo nodo da lista consulta(): Consulta o k-ésimo nodo da lista altera(): Substitui o nodo na k-ésima posição da lista por outro Destroi(): destrói a lista type Lista = array [1..n] of Info; início e final da lista tamanho do arranjo procedure inicializa (var ini, fim : integer); // inicializa com zeros o início e o fim da lista function insere (var x: Lista; k: integer ; val: Info; var ini, fim: integer): boolean; // insere um nodo em uma lista, na posição K function removek(var x: Lista; k: integer; var ini, fim: integer): boolean; // remove um nodo da posição K function removeval(var x: Lista; val: info; var ini, fim: integer): boolean; // remove um nodo cujo valor é val function altera (x: Lista; k, ini, fim: integer; var val: Info): boolean; // altera o nodo da posição K function consulta (x: Lista; ini, fim: integer; val:info): integer; // devolve a posição (o índice no arranjo) do nodo para o qual o campo valor é igual ao valor buscado (val)
Listas Lineares com Descritor Listas com Descritor Descritor contém diversas informações sobre a lista linear : localização acesso estrutura conteúdo 3 8 6 7 4 7 9 2 5 1 4... 3 4 5 6 7 8 9 10 1 2 11 12 13 Exemplo de descritor índice do início da lista índice do final da lista comprimento da lista índice do menor valor contido na lista índice do maior valor contido na lista Lista vazia com descritor Primeiro nodo da lista DescrLL 0 0 0 Último nodo da lista Comprimento da lista DLista 3 8 6 7 4 Descritor de LL 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 7 9 2 5 1 4 1 2 3 4 5 6 7 8 9 10 11 12 13
cesso à LL com Descritor em forma de arranjo TipoNodo = registro cod: inteiro; nome: string; valor: real; Fim; cesso à LL com Descritor em forma de registro TipoDescritor = registro IndIni: inteiro; IndFim: inteiro; MaiorValor: real; Fim; [DLista[2]].Nome Nome contido no primeiro nodo da lista [DLista[3]].Valor Valor contido no último nodo da lista DLista[4] comprimento da lista. informação está contida diretamente no descritor, não sendo necessário percorrer a lista para obtê-la. [DL.IndIni].Nome Nome contido no primeiro nó da lista [DL.IndFim].Valor Valor contido no último nó da lista DL.MaiorValor Maior valor contido no campo valor de todos os nós da lista. Neste caso não é necessário acessar o arranjo, pois a informação já está contida no descritor. Vantagens da utilização de descritor Descritor informando espaço disponível para a lista no arranjo Índice de início da lista Índice de final da lista facilidade de referência à lista Proc Constroi_ll (var DLista: TipoDescritor) em vez de Índice de início do espaço disponível no arranjo Nr. Nodos da lista Índice de final do espaço disponível no arranjo Proc Constroi_ll (var Ini,Fim: TipoLista; var N: inteiro, ) DLista 1 3 6 8 13 afastamento do usuário dos detalhes da representação interna ÍNDICES!!! 1 2 3 4 5 6 7 8 9 10 11 12 13
Descritor informando espaço disponível para a lista no arranjo Duas LL implementadas sobre o mesmo arranjo, com descritores I IL N FL F 10 11 4 14 17 18 20 5 24 24 DLista 12 13 6 18 22 9 10 24 25 26 27 Espaço para L1 Espaço para L2 Declarações para os algoritmos apresentados TipoDescr registro I : inteiro; IL : inteiro; N : inteiro; FL : inteiro; F : inteiro; fim; : arranjo [11.. 23] de TipoNodo lgoritmos implementando a alocação circular - mais complexos mas mais eficientes 11 13 6 18 23 Lista vazia com descritor L 1 2 3 4 5 6 7 8 9 10 11 12 13 1 0 0 0 I IL N FLF DescrL 11 0 0 0 23 OU L DescrL 13 DescrL I IL N 11 10 0 10 FLF 23
Inicialização do descritor para lista vazia com descritor Inserir novo nodo LL com descritor - contigüidade física Proc InicializarDescritor (var DescrL: TipoDescritor; Inirea, Fimrea: inteiro); início IL := 0; FL := 0; N := 0; I := Inirea; F := Fimrea; fim InicializarDescritor; No início No final 11 13 6 18 23 No meio Inserir novo nodo no início LL com descritor - contigüidade física 11 12 13 76 18 23 Inserir novo nodo no final LL com descritor - contigüidade física 11 13 67 19 18 23 11 11 67 19 18 23 11 16 15 89 23 18 23??
Inserir novo nodo no meio LL com descritor - contigüidade física 11 13 67 18 19 23 Pos = 3????????? FL = F - abrir espaço para a frente, alterando IL Tipo de dados para armazenar os elementos da lista Componentes para controle da estrutura lista inicializa(): Cria lista insere(): Insere um nodo na k-ésima posição da lista remove(): Remove o k-ésimo nodo da lista consulta(): Consulta o k-ésimo nodo da lista altera(): Substitui o nodo na k-ésima posição da lista por outro Destroi(): destrói a lista type Lista = array [1..n] of Info; Descritor = record inirranjo : integer; fimrranjo : integer; inilista : integer; fimlista : integer; num : integer; end
procedure inicializa(var d: Descritor; ini, fim: integer); // inicializa a lista. ini e fim representam a área a ser ocupada pela lista function insere(var d: Descritor; val: Info; k: integer; var x: Lista): boolean; // insere um nodo em uma lista, na posição K function removek(var d: Descritor; k: integer; var x: Lista): boolean; // remove um nodo da posição K function removeval(var d: Descritor; val: info; var x: Lista): boolean; // remove um nodo cujo valor é val function altera (d: Descritor; x: Lista; k: integer; var val: Info): boolean; // altera o nodo da posição K function consulta (d: Descritor; x: Lista; val: Info): inteiro; // devolve a posição (o índice no arranjo) do nodo para o qual o campo valor é igual ao valor buscado (val)