Você está na página 1de 16

LISTAS SIMPLESMENTE ENCADEADAS

LISTAS
Definio: seqncia de zero ou mais elementos a1,a2, ...,an sendo ai elementos de um mesmo tipo n o tamanho da lista linear Propriedade fundamental: os elementos tm relaes de ordem na lista ai precede ai+1 (e ai sucede ai-1); a1 o primeiro elemento da lista an o ltimo elemento da lista

Listas
So estruturas flexveis, que podem crescer ou diminuir durante a execuo do programa, de acordo com a demanda So mais adequadas para aplicaes nos quais no possvel prever a demanda por espaos
Ex.: Gerncia de memria, manipulao de smbolos, etc...

LISTAS COM IMPLEMENTAO ATRAVS DE PONTEIROS

Estrutura da Lista usando Ponteiros


Cada elemento da lista trabalhado como um n Utilizao de dois ns cabeas, um apontando para o incio da lista, e outro apontando para o final da lista, para facilitar as operaes de Insero e Busca Os ns (itens) da lista so registros com um ponteiro para guardar o endereo do seu sucessor Primeiro ltimo

x1

x2

...

xn

Implementao da Lista Simplesmente Encadeada


type Ponteiro TipoItem = ^TipoNo; = record chave: TipoChave; {outros componentes desejadas...} end; TipoNo = record Item: TipoItem; Prox: Ponteiro; end; TipoLista = record Primeiro: Ponteiro; ltimo : Ponteiro; end; var L: TipoLista;

Implementao: Inicia_Lista e Lista_Vazia


procedure Inicia_Lista (var L: TipoLista); begin New (L.Primeiro); L.ltimo := L.Primeiro; L.Primeiro^.Prox := nil;{L.ltimo^.Prox := nil} end; function Lista_Vazia (var L: TipoLista): boolean; begin Lista_Vazia := L.ltimo = L.Primeiro; end;

Procedimento de Insero
procedure Insere (var L:TipoLista; x:TipoItem); { A insero feita direita do ponteiro ltimo } var pNovo: Ponteiro; begin new(pNovo); L.ltimo^.Prox := pNovo; L.ltimo := pNovo; L.ltimo^.item := x; {pNovo^.item := x} L.ltimo^.Prox := nil; {pNovo^.item := nil} end;

Insero em lista simplesmente encadeada


Primeiro ltimo ltimo

x1

x2
ltimo

pNovo

new(pNovo); L.ltimo^.Prox := pNovo; L.ltimo := pNovo; L.ltimo^.item := x; L.ltimo^.Prox := nil;

Implementao: Retira_Lista
procedure Retira_Lista(p: Ponteiro; var L: TipoLista; var Item: TipoItem; var flag: boolean); { o item a ser removido o sucessor do apontado por p } var paux: Ponteiro; begin if Lista_Vazia(L) OR (p = nil) OR (p^.Prox=nil) then begin writeln (`Erro: Lista Vazia ou Posio no existe`); flag := FALSE; end else begin flag := TRUE; paux:= p^.Prox; Item :=paux^.Item; p^.Prox:= paux^.Prox; if p^.Prox = nil then L.ltimo := p; dispose(paux); end; end;

Remoo em lista simplesmente encadeada


Primeiro

ltimo

ltimo

x1
paux

x2

x3

p : ponteiro para o n anterior ao que ser removido

paux:= p^.Prox; Item:= paux^.Item; p^.Prox:= paux^.Prox; if p^.Prox = nil then L.ltimo := p; dispose(paux);

x2

Implementao: Imprime_Lista
procedure Imprime_Lista(var L: TipoLista); var Aux: Ponteiro; begin Aux:= L.Primeiro^.Prox; while (Aux <> nil) do begin writeln (Chave: , Aux^.Item.Chave); Aux := Aux^.Prox; end; end;

Exemplo
Seja uma lista de alunos da disciplina X Registro para cada aluno:
Chave Nota Curso :1..999; {nmero de inscrio/matrcula} :0..10; {mdia final} :1..20; {cdigo do curso}

Problema: a partir da lista de alunos, gerar a lista dos alunos aprovados e reprovados na disciplina
Aprovado: Nota >= 7.0 Reprovado: caso contrrio

Imprimir a lista dos aprovados e dos reprovados

Soluo
Program TestaListaAlunos; Uses crt, ALUNOS; var Aprovado, Reprovado : TipoLista; x: TipoItem; ok, fim: boolean; tecla: char; p, paux : TipoLista; begin clrscr; writeln('####Programa com Listas de Alunos####'); writeln; Inicia_Lista(Aprovado); Inicia_Lista(Reprovado); fim:=false;

Soluo (cont)
while NOT (fim) do begin { Entrada de dados } writeln ('Entre com o numero de matricula ou -1 para sair'); readln(x.chave); if (x.chave > 0) then begin writeln ('Entre com a media'); readln(x.nota); writeln ('Entre com o codigo do curso'); readln(x.curso); if (x.nota>=7) then begin Insere_Lista(x,Aprovado,ok); if ok then writeln('Inserao em Aprovado ok'); end else begin Insere_Lista(x,Reprovado,ok); if ok then writeln('Inserao em Reprovado ok'); end end else fim:=true; end;

Soluo (cont)
writeln; writeln; writeln('####Lista dos Aprovados####') Imprime_Lista(Aprovado); writeln; writeln; writeln('####Lista dos Reprovados####') Imprime_Lista(Reprovado); tecla:= readkey; clrscr; end.

Você também pode gostar