You are on page 1of 10

Implementao de uma Lista Linear - Tutorial Este programa cria uma lista seqencial que possua uma chave

do tipo registro para inserir, localizar e remover, numero de matrcula do aluno, nome do aluno e sua nota de uma turma de 40 alunos. 1. 2. 3. 4. program Lista1; uses crt; const max = 40 min = 1;

5. type Ptr = integer; 6. Tipo_Aluno = record 7. NrMat : integer; 8. NomeAlun : string[25]; 9. Nota : real; 10. end; 11. Lista_Aluno = record 12. item_Aluno : array[min..max] of Tipo_aluno; 13. Primeiro : Ptr; 14. Ultimo : Ptr; 15. end; 16. { Procedimento para Fazer com que os apontadores primeiro e ultimo } 17. { apontem para a primeira posio da matriz da lista. } 18. procedure flvazia(var lista : Lista_Aluno); 19. Begin 20. Lista.Primeiro := min; 21. Lista.Ultimo := Lista.primeiro; 22. end; 23. { Funo utilizada para iniciar a lista como vazia. } 24. function vazia(var lista:Lista_Aluno): boolean; 25. begin 26. vazia := lista.primeiro = Lista.ultimo; 27. end; 28. { Procedimento de insero de dados. } 29. procedure insere(x : Tipo_Aluno ; var lista : Lista_Aluno); 30. begin 31. If lista.ultimo > max then 32. writeln('Erro: Lista Cheia') 33. else begin; 34. Lista.item_aluno[lista.ultimo] := x; 35. Lista.ultimo := Lista.ultimo + 1;

36. end; 37. end; 38. { Funo para localizar registro. } 39. Function localiza(y : integer; var Lista : Lista_Aluno) : integer; 40. var i : integer; 41. begin 42. for i := min to max - 1 do 43. if y = lista.item_aluno[i].NrMat then 44. begin 45. localiza := i; 46. exit; 47. end; 48. writeln('Nao existe este numero de Matricula na lista'); 49. writeln('Pressione ENTER para sair'); 50. end; 51. { Procedimento para retirar registro. } 52. Procedure retirar(p:ptr; var lista:lista_aluno; var y:tipo_Aluno); 53. var Aux : integer; 54. begin 55. if (vazia(lista)) or (p >= lista.ultimo) then 56. writeln('Lista Vazia! Impossvel remover registro') 57. else begin 58. y := lista.item_aluno[p]; 59. lista.ultimo := lista.ultimo - 1; 60. for aux := p to lista.ultimo - 1 do 61. lista.item_aluno[aux] := lista.item_aluno[aux + 1]; 62. end; 63. end; 64. { Mdulo Principal } 65. var Lista : lista_aluno; 66. Aux : integer; 67. Aluno : string[25]; 68. x: Tipo_Aluno; 69. begin 70. clrscr; 71. FlVazia(lista); 72. x.NrMat := 9999; 73. While (x.NrMat > 0) and (A.ultimo < max) do 74. begin 75. writeln('Entre com o numero de matricula do aluno'); 76. readln(x.NrMat); 77. Writeln('Entre com o Nome do Aluno');

78. read(x.NomeAlun); 79. writeln('Entre com a Nota do Aluno'); 80. readln(x.Nota); 81. Insere(x, Lista); 82. end; 83. Writeln('Entre com o numero de matricula a ser retirado'); 84. readln(x.NrMat); 85. Aux := localiza(x.NrMat,Lista); 86. retirar(Aux, Lista, x); 87. writeln('Dados do Aluno retirado da Lista'); 88. writeln('Matricula = ', x.nrmat); 89. writeln('Aluno = ', x.nomealun); 90. writeln('Nota = ', x.nota:3:2); 91. writeln('Pressione ENTER para sair'); 92. readln; 93. end. Explicao passo a passo: Uma lista utilizada para gerenciar, dentre vrias aplicaes, a memria RAM da mquina. Em caso de listas lineares, os itens so armazenados em posies contguas de memria. Neste caso a lista pode ser percorrida em qualquer direo. A insero de um novo item pode ser realizada aps o ltimo item. A insero de um novo item no meio da lista requer o deslocamento de tens para preencher o espao deixado vazio. Objetivo Neste exemplo, foi implementado um registro com trs atributos que so: Nmero de Matrcula, Nome de um aluno e sua Nota. Sero criados procedimentos e funes para inserir, localizar e, depois, remover um registro de dentro da lista. O Incio do Programa As linhas de 1 a 4, iniciam o programa. A linha 1 d um nome ao programa. A linha 2 inicia a biblioteca CRT com a clusula Uses, para realizar operaes de manipulao de tela. As linhas 3 e 4 definem constantes que iro dimensionar o tamanho do arranjo (vetor), onde os dados sero armazenados. A Definio das variveis das Estruturas de Dados da Lista Os intervalos das linhas 5 a 15 definem tipos de variveis globais a serem utilizadas pelo usurio. Para isso, utiliza-se a instruo TYPE para declarar as variveis a ser utilizada em todo programa, at mesmo em funes e procedimentos. Na linha 5 a varivel PTR, do tipo integer, foi declarada para definir as variveis apontadoras que iro controlar o deslocamento dos elementos do vetor. Elas funcionam como um contador para realizar tais deslocamentos.

Na linha 6, foi criada uma varivel chamada Tipo_Aluno, do tipo Record, com a finalidade de receber os dados dos atributos do aluno, ou seja, o seu nmero de matrcula (NrMat do tipo integer, na linha 7), o seu Nome (NomeAlun do tipo string para 25 caracteres, na linha 8) e sua nota (Nota do tipo real, na linha 9). A linha 10 (end) o final do Record. Das linhas 11 a 15, construda a estrutura onde o registro, com os dados de cada aluno, ser armazenado. Na linha 11 criado um novo Record chamado de Lista_aluno. Este Record ter trs atributos: Um vetor e dois apontadores. neste vetor que os atributos da varivel Tipo_Aluno ser estruturada. Na linha 12 criado um vetor de tamanho estabelecido pelas constantes criadas nas linhas 3 e 4 do incio do programa. Este vetor definido como Tipo_Aluno, ou seja, est preparado para armazenar os dados do aluno conforme ilustrao abaixo: Itens
NRMAT (1) NomeAlun Nota NRMAT (2) NomeAlun Nota NRMAT (3) NomeAlun Nota

NRMAT (N) NomeAlun Nota

MAX Tam

Primeiro

ltimo - 1

ltimo

As linhas 13 e 14 definem os apontadores Primeiro e ltimo, respectivamente, que controlam o deslocamento e os limites dos elementos do vetor. Isto tem que ser projetado porque, embora o vetor tenha um tamanho definido, as linguagens de programao no controlam os limites do vetor. Assim, temos que criar tais delimitaes para evitar que os limites do vetor sejam extrapolados. A linha 15 fecha o Record iniciado na linha 11. As Linhas 16 e 17 so linhas de comentrio. A Procedure FLVazia Na linha 18 inicia-se o procedimento para fazer com que a lista torne-se vazia, ou seja, a inicializao dos apontadores com relao ao vetor Lista_Aluno. Se os apontadores Lista.Primeiro e Lista.Ultimo apontam para o primeiro elemento do vetor, significa que o vetor est vazio.
NRMAT (1) NomeAlun Nota NRMAT (2) NomeAlun Nota NRMAT (3) NomeAlun Nota

NRMAT (N) NomeAlun Nota

MAX Tam

Primeiro

ltimo

Aps inserirmos os dados do primeiro aluno, a varivel Lista.Ultimo se deslocar para o prximo elemento, mostrando assim, onde a insero de um novo aluno ser armazenada.
NRMAT (1) NomeAlun Nota NRMAT (2) NomeAlun Nota NRMAT (3) NomeAlun Nota

NRMAT (N) NomeAlun Nota

MAX Tam

Primeiro

ltimo

A Linhas 23 linha de comentrio. A Function Vazia A linha 24 inicia a funo como vazia e testa se os apontadores Lista.Primeiro e Lista.Ultimo, esto posicionados no primeiro elemento do vetor (Linhas 26). Caso isto seja verdadeiro, uma varivel com o mesmo nome da funo (vazia), recebe a o valor boleano True. Este valor ser enviado para fora da funo para que outros procedimentos sejam iniciados. As linhas 25 e 27, iniciam e terminam o corpo da funo (begin e end). A Procedure Insere O Bloco que vai da linha 28 a 38, inicia o procedimento de insero de dados. Este procedimento ir inserir dados sempre no final da lista, ou seja, no prximo elemento vazio da lista depois do ltimo inserido. A procedure insere declara como parmetros duas variveis: Uma chamada de X, definida como Tipo_Aluno e outra chamada Lista definida como Lista_Aluno. A varivel X recebe como parmetro os dados do aluno enviados via teclado. Como X uma varivel do Tipo Record (o Tipo_Aluno um Record), ela poder receber os dados que so passados pelo mdulo principal do programa (Linhas 73 a 81). Nas linhas 31 e 32, If lista.ultimo > max then writeln('Erro: Lista Cheia') testamos se a varivel apontadora Lista.Ultimo maior que o limite mximo definido no incio do programa (linha 3). Se for maior, uma mensagem de Erro ser mostrada (Linha 32), informando que a lista est cheia, tornando impossvel a insero de um novo aluno. Caso contrrio, else (Linha 34, 35 e 36), Lista.item_aluno[lista.ultimo] := x; Lista.ultimo := Lista.ultimo + 1; a varivel Lista recebe os dados da varivel X, e os armazena no vetor Item_Aluno na posio Lista.Ultimo.

A linha 36 mostra o deslocamento da varivel apontadora Lista.Ultimo para a prxima posio do vetor, que ser Lista.Ultimo + 1. Assim a varivel apontadora mostra onde ser inserido um novo aluno no prximo elemento do vetor. A linhas 37 finaliza a procedure. A Funo Localiza A funo localiza tem como objetivo descobrir a posio do vetor em que se encontra armazenado um determinado nmero de matrcula que ser removido na procedure retirar. Para que o registro seja excludo da lista, necessrio que seja passada procedure retirar a posio do vetor onde o aluno a ser removido se encontra armazenado. Na linha 39, Function localiza(y : integer; var Lista : Lista_Aluno) : integer; a function localiza estabelece como parmetro a varivel Y do tipo inteira e o vetor Lista do tipo_aluno, onde o registro de cada aluno est armazenado. Esta function dever retornar ao mdulo principal do programa a posio do vetor onde o nmero de matrcula (NrMat) foi localizado. Esta posio uma varivel do tipo integer. A varivel Y o nmero de matrcula recebido pela function atravs do mdulo principal do programa. A varivel Y recebe o nmero de matrcula armazenado na varivel x.NrMat, por ocasio da linha 84 do mdulo principal do programa. Na linha 40, criada a varivel i do tipo integer. Esta varivel, que ser implementada num lao do tipo FOR, ir descobrir a posio do vetor onde est armazenado o nmero de matrcula do aluno que ser removido. Na linha 41, inicia-se o corpo da function. for i := min to max - 1 do if y = lista.item_aluno[i].NrMat then begin localiza := i; exit; end; Na linha 42, a varivel i iniciada a variar desde a primeira posio (min) at a penltima posio do vetor (Max 1). Esta varivel desloca at a posio Max 1, porque a varivel apontadora ultimo reserva a ltima posio sempre como vazia para que nela possa ser inserido um novo dado. Sendo assim, existem dados armazenados at a posio anterior posio mxima do vetor. A linha 43, realiza um teste para verificar se o nmero de matrcula armazenado na varivel y, o mesmo da varivel NrMat na posio i do vetor lista.item_aluno. Caso a igualdade seja verdadeira, ento a posio i do vetor ser armazenada na varivel localiza de mesmo nome da function. Assim, esta posio ser retornada ao mdulo principal do programa. A linha 46 realiza a sada da function e a 47 fecha o lao iniciado no begin do comando if.

Caso contrrio, se o nmero de matrcula no for localizado, as Linhas 48 e 49 mostram mensagens informando ao usurio que o nmero de matrcula procurado no foi encontrado. Isto significa que o nmero de matrcula da varivel y foi procurado em todas as posies do vetor lista e no foi encontrado. Ou seja, o nmero de matrcula NrMat no igual ao nmero de matrcula armazenado na varivel y. O end da linha 50 fecha o corpo da funo. A Procedure Retirar O objetivo deste procedimento retirar um registro em qualquer posio da lista, esteja este registro no incio, meio ou fim da lista. Assim, se um registro foi retirado do meio da lista, todos os registros que estiverem em posies direita daquele que foi retirado, sero deslocados para a esquerda afim de ocupar o espao em branco deixado pelo registro excludo. Na linha 52, Procedure retirar(p:ptr; var lista:lista_aluno; var y:tipo_Aluno); o procedimento iniciado recebendo como parmetro as variveis p do tipo ptr, a varivel lista do tipo lista_aluno e a varivel y definida como tipo_Aluno. Nesta linha, toda varivel que est acompanhada da clusula Var ser devolvida para fora da procedure, ou seja, ao mdulo principal do programa, como passagem por referncia. A varivel p do tipo integer, recebe da procedure Localiza a posio do vetor referente ao registro que ser excludo. A varivel Lista do tipo lista_aluno, contm todos os registros armazenados pelo usurio via teclado. dela que iremos excluir um determinado registro de um aluno. A varivel y, definida como tipo_aluno, ir receber os dados do aluno que ser excludo. Como ela tipo_aluno, ou seja, um Record, ela foi estruturada para receber os trs atributos do registro excludo (NrMat, NomeAlun e Nota). A linha 53 declara a varivel Aux do tipo integer, cuja finalidade receber a prxima posio do vetor em relao posio que foi retirada. Esta varivel desloca o contedo do registro seguinte posio do registro excludo para a posio em branco deixada pelo registro que foi excludo. A linha 54 abre o corpo da procedure. Na linha 55, existe um if para testar se a lista est vazia ou se a posio p excede ltima posio do vetor. if (vazia(lista)) or (p >= lista.ultimo) then writeln('Lista Vazia! Impossvel remover registro') Se a lista estiver vazia, no h como retirar nenhum registro de dentro dela. Se a posio p excede ultima posio do vetor, significa que o nmero de matrcula a ser retirado, foi procurado em todas as posies do vetor e no foi encontrado. Assim, na linha 56, uma mensagem informa ao usurio a impossibilidade de remover o registro solicitado.

Caso contrrio (linha 57), y := lista.item_aluno[p]; lista.ultimo := lista.ultimo - 1; se o nmero de registro solicitado foi encontrado numa posio p do vetor lista.lista_aluno, a varivel y (linha 58), receber os dados do aluno referentes ao registro a ser excludo na posio p (posio passada, por referncia, pela procedure localiza). Na linha 59, inicia-se a implementao do deslocamento dos registros direita daquele que foi excludo, para a posio onde o registro excludo se encontrava. for aux := p to lista.ultimo - 1 do lista.item_aluno[aux] := lista.item_aluno[aux + 1]; O primeiro passo deslocar o apontador lista.ultimo da posio onde ele est para a posio anterior a esta, ou seja, lista.ultimo - 1. Assim, ele apontar para o prximo elemento vazio do vetor onde poder ser inserido um novo registro. (Ver ilustraes a seguir) Esta figura mostra o elemento a ser retirado e onde o apontador lista.ultimo se encontra.
NRMAT (1) NomeAlun Nota NRMAT (2) NomeAlun Nota NRMAT (3) NomeAlun Nota NRMAT (4) NomeAlun Nota NRMAT (5) NomeAlun Nota NRMAT (6) NomeAlun Nota

PROXIMO

elemento vazio

Lista.Primeiro

Elemento a ser retirado da lista

Lista.ltimo

A figura a seguir, mostra o registro excludo. A linha 60, faz a varivel aux variar da posio p (onde est o registro a ser excludo) at a posio lista.ultimo 1, onde est o ltimo registro inserido. Lista.ultimo mostra a posio vazia do vetor onde um prximo registro poder ser inserido.
NRMAT (1) NomeAlun Nota NRMAT (2) NomeAlun Nota NRMAT (3) NomeAlun Nota NRMAT (5) NomeAlun Nota NRMAT (6) NomeAlun Nota

PROXIMO

elemento vazio

Lista.Primeiro

Elemento retirado da lista

Lista.ltimo - 1

Lista.ltimo

A figura a seguir, mostra o deslocamento do apontador lista.ultimo para a posio anterior lista.ultimo 1, (estabelecido na linha 59).
NRMAT (1) NomeAlun Nota NRMAT (2) NomeAlun Nota NRMAT (3) NomeAlun Nota NRMAT (5) NomeAlun Nota NRMAT (6) NomeAlun Nota

PROXIMO

elemento vazio

Lista.Primeiro

Elemento retirado da lista

Lista.ltimo

Na figura abaixo podemos ver o deslocamento dos registros para as posies anteriores qual eles estavam. A linha 61, atravs da instruo lista.item_aluno[aux] := lista.item_aluno[aux + 1]; mostra a implementao de como ocorre o deslocamento dos registros direita do registro excludo para a nova posio que eles devero ocupar. Assim, a posio da varivel Aux do vetor lista.item_aluno que se inicia na posio p (cujo registro foi retirado) ir receber o registro posicionado na posio Aux + 1 do vetor lista.item_aluno. Assim, o registro de nmero 5 (aux + 1) ocupar a posio ocupada pelo registro de nmero 4 (Aux) que foi excludo. Na prxima passagem do lao (For), o registro de nmero 6 ser Aux + 1, ocupar a posio que anteriormente era ocupada pelo registro de nmero 5, posio Aux.
NRMAT (1) NomeAlun Nota NRMAT (2) NomeAlun Nota NRMAT (3) NomeAlun Nota NRMAT (5) NomeAlun Nota NRMAT (6) NomeAlun Nota PROXIMO Elemento vazio

OUTRO

elemento vazio

Lista.Primeiro

Lista.ltimo

Mdulo Principal Este mdulo que se inicia na linha 64, declara nas linhas 65 a 68, a variveis que sero utilizadas para a carga de dados. Assim, a varivel Lista do tipo Lista_aluno, ser utilizada como estrutura de armazenamento dos dados de cada aluno. A varivel Aux do tipo integer foi declarada com a finalidade de receber a posio do nmero de matrcula do vetor encontrado na function localiza. A varivel X definida como Tipo_Aluno (Record), ir receber os dados dos alunos que sero enviados via teclado. O corpo do programa que se inicia na linha 69, recebe a instruo clrscr na linha 70 que ir limpar a tela. Na linha 71, a function vazia chamada para testar se o estado atual da lista realmente vazio.

Verificada esta condio, na linha 72 fazemos a varivel x.NrMat receber o nmero de matrcula 9999. Isto foi feito para que o nmero de matrcula no se inicie zerado e, assim, possa tornar verdadeira a condio estabelecida pelo lao While na linha 73, ou seja, While (x.nrmat > 0) and (Lista.ultimo < max) do. O corpo do lao While que varia das linhas 74 a 82, recebe a carga dos dados dos alunos (x.NrMat, nmero de matrcula; x.nomealun, nome do aluno e x.nota, nota do aluno). A linha 81 Insere(x, Lista), chama a procedure insere para realizar as inseres dos dados dos alunos contidos na varivel x para serem armazenados no vetor lista. As linhas 83, 84, 85 e 86 respectivamente: Writeln('Entre com o numero de matricula a ser retirado'); readln(x.nrmat); Aux := localiza(x.NrMat, Lista); retirar(Aux, Lista, x) Nesta parte do programa, a varivel x.NrMat recebe o nmero de matrcula que ser retirado da lista. A varivel Aux na linha 85, chama a funo localiza e solicita se localize o nmero de matrcula armazenado em NrMat do vetor Lista. A funo Localiza devolve varivel Aux a posio do vetor lista onde se encontra o registro a ser removido. Na linha 86, realizada a chamada da procedure retirar. As variveis Aux, Lista e X, passam por referncia, respectivamente, a posio do vetor, o prprio vetor Lista carregado de dados, e o registro que dever ser retirado na posio do vetor. No nosso exemplo, supondo que o registro da posio 4 ser retirado, faz-se a seguinte leitura desta lunha: Retirar na posio 4 do vetor Lista os dados do aluno fulano de tal armazenados na varivel X. Das linhas 87 a 90, so mostrados na tela, os dados do aluno que foi retirado da lista. Nas linhas 91 a 93 esto as instrues de encerramento do programa.

You might also like