Escolar Documentos
Profissional Documentos
Cultura Documentos
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...
x1
x2
...
xn
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;
x1
x2
ltimo
pNovo
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;
ltimo
ltimo
x1
paux
x2
x3
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
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.