Listas Lineares2
-
Upload
sergio-vieira -
Category
Documents
-
view
251 -
download
0
Transcript of Listas Lineares2
-
7/21/2019 Listas Lineares2
1/34
Tpascal - Trabalhos em [email protected]
Aplicaes de Listas
www2.50megs.com/tpascal
1
-
7/21/2019 Listas Lineares2
2/34
LISTAS LINEARES
1- INTRODUO
A lista linear ma !orma "e representa#$o% como estrtra linear% on"e o ob&etivo 'e a representa#$o "e "a"os "e m problema no compta"or se&a "e tal maneira% 'e oalgoritmo 'e os tilize se&a a(ilia"o em sa tare!a "e obter ma sol#$o "e !ormacon!i)vel e e!iciente.
Para a compreens$o "o !ncionamento "a lista% necess)rio compreen"ermos o!ncionamento "a mem*ria "o compta"or.
A mem*ria "o compta"or m recrso 'e po"e ser acessa"o "e "as !ormaspor m programa+
Primeiro% m algoritmo po"e alocar estrtras "e "a"os no 'e chamaremos "ememria esttica% aloca#$o esta 'e "eve ser !eita antes "e sa e(ec#$o,
egn"o% m algoritmo po"e tilizar-se "a memria dinmica"o compta"or%alocan"o estrtras na me"i"a "o necess)rio "rante a e(ec#$o "o algoritmo.
m ambos os casos% po"emos imaginar 'e a mem*ria organiza"a como masrie se'encial "e cllas. Associa"os a ca"a clla est$o "ois atribtos+ o en"ere#o "oinicio "a clla e se tamanho. As cllas n$o precisam ser "e tamanho ni!orme.
tamanho "e ma clla "a"o nma ni"a"e pecliar ao e'ipamento em'est$o% mas geralmente a ni"a"e !n"amental o bte% 'e o espa#o necess)rio pararepresentar m caractere% por e(emplo a letra a3. 4m bte composto "e bits% sen"o'e m bit m "igito bin)rio 60 o 17. T"o 'e represent)vel nm compta"or !n"amental ma se'8ncia "e bits.
A maioria "os programa"ores est) acostma"a a trabalhar com a aloca#$o est)tica"e mem*ria% 'e nos obriga a "e!inir com antece"8ncia o tamanho m)(imo "as estrtras"e "a"os. A segn"a !orma nos "esobriga "essa "e!ini#$o e% portanto% mito mais!le(9vel% embora este&a s&eita a perigos 'e lhe s$o caracter9sticos.
2-LISTAS LINEARES
A lista linear a mais simples estrtra "e "a"os 'e e(iste na maioria "aslingagens "e programa#$o. : conheci"a mais commente como vetor o arra 6emingl8s7% e implementa"a na mem*ria est)tica.
;ormalmente representamos a lista A% conten"o n elementos% "a seginte !orma+
2
-
7/21/2019 Listas Lineares2
3/34
A < 6a1%...%an7% n 0.
=hamamos "e a>?s "e n*s% e geralmente impomos a con"i#$o "e 'e to"os os n*s"e ma lista "evem pertencer ao mesmo con&nto% por e(emplo% to"os os a >?s "evem sernmeros inteiros. s n*s po"em ser listas tambm% pro"zin"o assim o 'e conhecemos
por matrizes "e "as o mais "imenses. A lista A po"e ser tambm vazia% correspon"en"oao caso especial em 'e n
-
7/21/2019 Listas Lineares2
4/34
pr*prio =% ao invs "o L. na posi#$o 5 acharemos =% e assim at o !inal "a lista. Abai(oser) apresenta"o o algoritmo 'e !az este "eslocamento+
!imK,para i "e !im at H !a#a
"a"oDiF1E "a"oDiE,!im para,!im!im F1,
Ap*s a e(ec#$o "esta rotina% a lista !icar) "a seginte !orma+
Posi#$o 1 2 H I 5 J K La"o A M = = L ; N
Agora po"eremos colocar o "a"o G na posi#$o H% ten"o a certeza 'e o restante"a lista !oi preserva"o. Para isto+
"a"oDHE G?,
Oogo% teremos+
Posi#$o 1 2 H I 5 J K La"o A M G = L ; N
Bota-se tambm% 'e 'anto maior a lista e 'anto menor !or o valor "a posi#$o
em 'e "ese&amos !azer a inser#$o% mais tempo ser) necess)rio para o processamento.ste problema po"e ser solciona"o se colocarmos o in9cio como sen"o ma vari)vel.Assim% po"emos "eslocar tanto os elementos "a es'er"a como os "a "ireita. steproce"imento est) es'ematiza"o abai(o+
Pos. 1 2 H I 5 J K Q 10 11La"o
A M = L ; N
in9cio H,!imQ,
Assim% po"er9amos inclir G entre M e =% "eslocan"o somente A e M para aes'er"a. Para esta% veri!ica-se tambm a necessi"a"e "e come#armos com A% na posi#$o"e H para 2% por 2 se tratar "e ma posi#$o vazia.
Para e(clirmos m n*% o proce"imento mais !)cil% pois basta "eslocarmos to"osos n*s a sa "ireita% at o !im% ma posi#$o para a es'er"a. ponhamos 'e "ese&emosretirar a letra L "a lista abai(o+
I
-
7/21/2019 Listas Lineares2
5/34
-
7/21/2019 Listas Lineares2
6/34
sta caracteriza#$o "o n* "e ma lista enca"ea"a bastante !le(9vel% emborase&amos !or#a"os a ter m tipo "e n* "i!erente "eclara"o para ca"a tipo "e "a"o 'e"ese&armos armazenar e m con&nto "e rotinas para maniplar ca"a tipo "e lista.
A !igra abai(o mostra a estrtra t9pica "e ma lista enca"ea"a homog8nea. Belavemos m ponteiro ao inicio "a lista% bem como a conectivi"a"e entre n*s "a lista pormeio "os ponteiros. Bote 'e o ltimo elemento "a lista "istingi"o "os otros pelo !ato"e se ponteiro ter o valor especial / 3% 'e a"otaremos como conven#$o gr)!ica parain"icar 'e o ponteiro n$o aponta para lgar algm. valor / 3 e'ivalente ao BRO% "oPascal.
Bo caso "e ma lista enca"ea"a heterog8nea% mostra"a na !igra acima% saestrtra parece-nos bem mais comple(a% mas apenas estamos maniplan"o m agrega"o"e listas% na"a mais.
O DESCRITOR
elemento "escritor "e ma lista enca"ea"a armazena as re!erencias ao in9cio e ao!im "a lista. To"o acesso a lista ser) sempre e!eta"o atravs "o "escritor.
n* "escritor "e ma lista po"e conter otras in!orma#es sobre a lista como a'anti"a"e "e n*s na lista 6como nos mo"elos apresenta"os neste trabalho7% "escri#$o "os"a"os conti"os nos n*s% etc.
LISTAS ENCADEADAS SIMPLES
J
-
7/21/2019 Listas Lineares2
7/34
4ma lista enca"ea"a simples a'ela 'e em ca"a n* possi apenas mare!er8ncia. sta re!er8ncia serve para in"icar se n* scessor.
LISTAS DUPLAMENTE ENCADEADAS
4ma lista "plamente enca"ea"a a'ela 'e em ca"a n* possi "as re!er8ncias.stas re!er8ncias servem para in"icar se n* scessor e se pre"ecessor.
4ma lista "plamente enca"ea"a tem a seginte proprie"a"e+
6pS.pre"ecessor7S.scessor < 6pS.scessor7S.pre"ecessor < p
OS OPERADORES DE LISTAS
Rmaginemos 'e as opera#es abai(o !ossem "e interesse na tiliza#$o "e listasenca"ea"as+
isitar to"os os n*s "a lista, inserir m novo "a"o no !im 6o inicio "a lista7, remover o primeiro 6o ltimo7 n* "a lista,bscar m n* na lista.
=hamaremos as !n#es e os proce"imentos 'e maniplam ma estrtra "e"a"os "e opera"ores "a'ela estrtra% em analogia aos opera"ores "ispon9veis para ostipos "e "a"os b)sicos "e ma lingagem "e programa#$o.
A "e!ini#$o completa "e ma estrtra "e "a"os incli tanto sa !orma estrtralcomo a "isciplina "e acesso% o 'e "e!ine sa cole#$o "e opera"ores v)li"os.
Por 'est$o "e "isciplina e boa !orma "e programa#$o% ma estrtra "e "a"os"eve ser manipla"a apenas por meio "e ses opera"ores. sse % em parte% o gran"esegre"o "o valor "o so "e estrtra "e "a"os para promover o correto !ncionamento "eprogramas.
pera#es tais como impress$o o somat*rio "e to"os os elementos "e ma listaenvolvem o manseio "e to"os os n*s "e ma lista "a lista enca"ea"a. processo "evisita#$o3 "e m n* t$o particlar a ma "a"a aplica#$o 'e "i!9cil generaliz)-lo na!orma "e m proce"imento. s'ematicamente% porm% visitar os n*s "e ma lista mitoesclarece"or 'anto U manipla#$o "essa estrtra "e "a"os.
A segir "emonstraremos e comentaremos os principais opera"ores "e listassimples e "plamente enca"ea"as atravs "e programas mo"elos em PascalV.
V A escolha "a lingagem Pascal !oi !eita pelo motivo "e ser ma lingagem simples% 'epossi a manipla#$o "e vari)veis tipo ponteiro e tambm por ser conheci"a amplamente.sses mo"elos 6Go"elo1.pas e Go"elo2.pas7 est$o em lingagem Pascal no "is'ete "o
K
-
7/21/2019 Listas Lineares2
8/34
trabalho e mais "ois e(emplos "e aplica#es "e listas 6(emplo1.pas - arran&ar em or"emal!abtica m grpo "e palavras, e (emplo2.pas - m pe'eno e(emplo "e manipla#$o"e banco "e "a"os7.
-
7/21/2019 Listas Lineares2
9/34
PROGRAM modelo_lista_linear_simples;
TYPEpont= ^no;WLe!ine o tipopontcomo m ponteiro paran* "a listaX
no= RECORD
{Definio do tipo de dado do n. Exempo! nome "TR#$G%&'(;)
W: nesta linha 'e o programa"or "e!ine aestrtra "e "a"os "o n*X
proximo!pont;W=omo a lista simplesmente enca"ea"a%s* po"er) haver ponteiro em ma "ire#$oX
E$D;
TYPE tipo_descritor= RECORD
nos! #$TEGER; inicio* fim!pont;
WLe!ini#$o "o registro "o "escritor% on"enos a 'anti"a"e "e n*s "a lista, inicioe
fim% respectivamente s$o os ponteiros parain9cio e !im "a listaX
E$D;
+AR descritor! tipo_descritor;WLeclara#$o global "a vari)vel descritorX
PROCED,RE inicializa;Wsta PY=L4Y serve para inicializaro "escritor "a listaX
-EG#$
descritor.nos!=';W=omo a lista est) vazia o nmero "e n*s
"ever) ser 06zero7X
descritor.inicio!=$#; descritor.fim!=$#;
We a lista est) vazia% obviamente o in9cio e!im "a lista n$o e(istemX
E$D;
Q
-
7/21/2019 Listas Lineares2
10/34
PROCED,RE insere_direita;WRnserir a "ireita signi!ica% inserir o n* naltima posi#$o "a listaX
+ARp!pont;WLeclarapcomo m ponteiro para o novo
n* "a listaX
-EG#$ $E/0p1;
WAloca mem*ria para o n* aponta"o porpX
{Rotina pa2a ent2ada de dado3* exempo READ$0p^.nome1;)
p^.proximo!=$#;W=omo o novo n* est) sen"o inseri"o naltima posi#$o "a lista% n$o e(iste nenhmn* a sa !renteX
#4 descritor.nos=' T5E$ descritor.inicio!=pWe n$o e(istia nenhm n* antes "ainser#$o ent$o isso signi!ica 'e este n* tambm o primeiro "a listaX
E"E 0descritor.fim1^.proximo!=p;
Wen$o% esta linha !az com 'e o n*pr*(imo ao ltimo n* "a lista aponte parao novoX
descritor.fim!=p; WZ) esta linha "e!ine 'e o novo n*inseri"o o ltimo "a listaX
#$C0descritor.nos1;WAmenta o nmero "e n*s e(istentes no"escritor em 1X
E$D;
PROCED,RE insere_esquerda;WRnserir a es'er"a signi!ica% inserir o n*
na primeira posi#$o "a listaX
+ARp!pont;WLeclarapcomo m ponteiro para o novon* "a listaX
-EG#$
$E/0p1;
10
-
7/21/2019 Listas Lineares2
11/34
WAloca mem*ria para o n* aponta"o porpX
{Rotina pa2a ent2ada de dado3* exempo READ$0p^.nome1;)
p^.proximo!=descritor.inicio;W;az com 'e o n* seginte ao novo n*
6aponta"o por p7 aponte para o antigoprimeiro n* "a listaX
descritor.inicio!=p;WLe!ine o novo n* como o primeiro "alistaX
#4 descritor.nos=' T5E$ descritor.fim!=p;We n$o e(istia nenhm n* antes "ainser#$o ent$o isso signi!ica 'e este n* tambm o ltimo "a listaX
#$C0descritor.nos1; WAmenta o nmero "e n*s e(istentes no"escritor em 1X
E$D;
PROCED,RE insere_posicao0n! #$TEGER1;WRnserir em ma posi#$o n 'al'ersigni!ica inserir m n* em ma posi#$ointerme"i)ria "a listaX
+ARp*q!pont;
WLeclara p e q como ponteiros para n*.n"epapontar) para o novo n* "a lista, eqpercorrer) a listaX
-EG#$
$E/0p1;WAloca mem*ria para o n* aponta"o porpX
#4 00n671 OR 0n8descritor.nos9711 T5E$ {Rotina de e22o);Wsta linha prev8 m erro na entra"a "a
posi#$o. limite sperior ma ni"a"eacima "o total "e n*s e(istentes "a lista
por'e o s)rio po"er) inserir m n* naltima posi#$oX
#4 n=7 T5E$ -EG#$ insere_esquerda;
W=aso especial on"e o s)rio estar)inserin"o o n* no in9cio "a lista% por issochama-se a PY=L4Yinsere_esquerdaX
11
-
7/21/2019 Listas Lineares2
12/34
E:#T;
Wai "a PY=L4Y X
E$D;
#4 n=descritor.nos97 T5E$ -EG#$insere_direita;
W=aso especial on"e o s)rio estar)inserin"o o n* no !im "a lista% por issochama-se a PY=L4Y insere_direitaX
E:#T;Wai "a PY=L4YX
E$D;
{Rotina de ent2ada de dado3* exempo! READ$0p^.nome1;)
q!=descritor.inicio;W;az com 'e o ponteiro q aponte para o
primeiro n* "a listaX
4OR n!=n-1DO/$TO & DO q!=q.proximo;Wsta linha !az com 'e o ponteiro q
percorra a lista at chegar ao n* anterior aposi#$o "o novo n* a ser inseri"oX
p^.proximo!=q.proximo;W n* seginte ao novo n*6p7 aponta para
o n* seginte "o anterior6q7X
q.proximo!=p;W n* seginte ao n* aponta"o pelo
ponteiro q aponta para o novo n*6aponta"o porp)X
#$C0descritor.nos1;WAmenta o nmero "e n*s e(istentes no"escritor em 1X
E$D;
PROCED,RE remove_direita;WYemover a "ireita signi!ica remover oltimo n* "a listaX
+ARp*q!pont;WLeclara p e q como ponteiros para n*.n"e q apontar) para o n* 'e ir) serremovi"o, eppercorrer) a listaX
12
-
7/21/2019 Listas Lineares2
13/34
i! #$TEGER;W[n"ice para a instr#$o ;YX
-EG#$
CA"E descritor.nosO4
' ! {Rotina de e22o);We n$o e(istirem n*s na lista% n$o ser)
poss9vel a remo#$o% "a9 chama-se marotina "e manipla#$o "o erroX
7 ! -EG#$We e(istir apenas m n* na lista ent$o+X
p!=descritor.inicio;W ponteiropaponta para o primeiro n* "alistaX
inicializa;WZ) 'e a lista !icar) vazia po"emos !azer omesmo proce"imento "e inicializar o"escritorX
D#"PO"E0p1;WLesaloca a mem*ria cria"a "o n*aponta"o por pX
E:#T;Wai "o PY=L4YX
E$D; E$D;
p^.proximo!=descritor.inicio;W pro(imo "o ponteiro p aponta para o
primeiro n* "a listaX
4OR i!=7 TO descritor.nos7 DOp!=p^.proximo;Wsta linha !az com 'eppercorra a listaat chegar a m n* anterior ao 'e vai serremovi"oX
q!=p^.proximo; WAgora q aponta para o n* seginte emrela#$o ap% o se&a% aponta para o n* 'evai ser removi"oX
p^.proximo!=$#;W=omo a lista linear o ponteiro p(oltimo) aponta para BROX
1H
-
7/21/2019 Listas Lineares2
14/34
descritor.fim!=p;WRn"ica 'e o n* aponta"o por p ser) oltimo "a listaX
D#"PO"E0q1;
WLesaloca a mem*ria cria"a "e n*aponta"o por qX
DEC0descritor.nos1;WLimini a vari)vel "o "escritor "e'anti"a"e "e n*s em ma ni"a"eX
E$D;
PROCED,RE remove_esquerda;WYemover a es'er"a signi!ica remover o
primeiro n* "a listaX
+ARp!pont;WLeclara pcomo ponteiro para o n* 'evai ser removi"oX
-EG#$
CA"E descritor.nosO4
' ! {Rotina de e22o);We n$o e(istirem n*s na lista% n$o ser)
poss9vel a remo#$o% "a9 chama-se ma
rotina "e manipla#$o "o erroX 7 ! -EG#$
We e(istir apenas m n* na lista ent$o+X
p!=descritor.inicio;W ponteiro o aponta para o primeiro n* "alistaX
inicializa;WZ) 'e a lista est) vazia po"emos !azer omesmo proce"imento "e inicializar o"escritorX
D#"PO"E0p1;WLesaloca a mem*ria cria"a "o n*aponta"o por pX
E:#T;Wai "o PY=L4YX
E$D;
1I
-
7/21/2019 Listas Lineares2
15/34
E$D;
p!=descritor.inicio;W ponteiropaponta para o primeiro n* "alista% este ser) removi"oX
descritor.inicio!=p^.proximo;W primeiro n* "a lista ser) o n* seginteapX
p^.proximo!=$#;WPor 'estes "e segran#a !azemos com'e o n* seginte apaponte para BROX
D#"PO"E0p1;WLesaloca a mem*ria cria"a paraarmazenar o primeiro n*X
DEC0descritor.nos1;WLimini o nmero "e n*s "a lista em 1X
E$D;
PROCED,RE remove_posicao0n! #$TEGER1;WYemover ma posi#$o n 'al'ersigni!ica remover m n* em ma posi#$ointerme"i)ria "a listaX
+ARp*q!pont;WLeclara p e q como ponteiros para n*.
n"e q apontar) para o n* 'e ser)removi"o "a lista, e p 'e percorrer) alistaX
i! #$TEGER;W[n"ice para ser tiliza"o na instr#$o;YX
-EG#$
#4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o);Wsta linha prev8 m erro na entra"a "a
posi#$oX
#4 n=7 T5E$ -EG#$ remove_esquerda;
W=aso especial on"e o s)rio estar)removen"o o primeiro n* "a lista% por issochama-se a PY=L4Yremove_esquerdaX
15
-
7/21/2019 Listas Lineares2
16/34
E:#T;Wai "o PY=L4YX
E$D;
#4 n=descritor.nosT5E$ -EG#$ remove_direita;
W=aso especial on"e o s)rio estar)removen"o o ltimo n* "a lista% por issochama-se a PY=L4Y remove_direitaX
E:#T;Wai "o PY=L4YX
E$D;
p^.proximo!=descritor.inicio;WBesta linha o pr*(imo "o ponteiro paponta para o primeiro n* "a listaX
4OR i!=7 TO n7 DOp!=p^.proximo;Wsta rotina !az com 'eppercorra a listaat o n* anterior U listaX
q!=p^.proximo;W ponteiro qaponta para o n* 'e vai serremovi"oX
p^.proximo!=q.proximo;W n* seginte ao ponteiropaponta para o
n* seginte "o n* seginte aponta"o por qX
q.proximo!=$#;WPor 'estes "e segran#a !azemos qapontar para BROX
D#"PO"E0q1;WLesaloca a mem*ria cria"a "o n*aponta"o por qX
DEC0descritor.nos1;WLimini o nmero "e n*s "a lista em 1X
E$D;
PROCED,RE consulta0n! #$TEGER1;WYotina para a conslta "os "a"osarmazena"os no n* "a posi#$o nX
+ARp!pont;
1J
-
7/21/2019 Listas Lineares2
17/34
WLeclara#$o "o ponteiro 'e ir) percorrer alistaX
-EG#$
#4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o);
Wsta linha prev8 m erro na entra"a "aposi#$oX
p^.proximo!=descritor.inicio;W pr*(imo "o ponteiro p aponta para o
primeiro n* "a listaX
4OR n!=nDO/$TO 7 DOp!=p^.proximo;Wsta rotina !az com 'eppercorra a listaat o n* "ese&a"oX
{Rotina de imp2e33o do3 dado3 do n na tea* * exempo!
/R#TE$0p^.nome1;)
E$D;
PROCED,RE modifica0n! #$TEGER1;WYotina para a mo"i!ica#$o "os "a"osarmazena"os no n* "a posi#$o nX
+ARp!pont;WLeclara#$o "o ponteiro 'e ir) percorrer alistaX
-EG#$
#4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o);Wsta linha prev8 m erro na entra"a "a
posi#$oX p^.proximo!=descritor.inicio;
W pr*(imo "o ponteiro p aponta para oprimeiro n* "a listaX
4OR n!=nDO/$TO 7 DOp!=p^.proximo;Wsta rotina !az com 'eppercorra a listaat o n* "ese&a"oX
{Rotina de ent2ada do3 dado3 do n na tea* * exempo! READ$0p^.nome1;)
E$D;
1K
-
7/21/2019 Listas Lineares2
18/34
PROGRAMmodeo
-
7/21/2019 Listas Lineares2
19/34
E$D;
PROCED,RE insere_direita;WRnserir a "ireita signi!ica inserir o n* naltima posi#$o "a listaX
+ARp!pont;WLeclarapcomo m ponteiro para o novon* "a listaX
-EG#$
$E/0p1;WAloca mem*ria para o n* aponta"o porpX
{Rotina de ent2ada de dado3* exempo! READ$0p^.nome1;)
p^.proximo!=NIL; W=omo a lista linear % o ltimo n* "a listatem 'e apontar para BROX
p^.anterior!=descritor.fim;W=omo o novo n* ser) o ltimo ele "ever)ser prece"i"o "o ltimo n* antigoX
#4 de3>2ito2.no368' T5E$ -EG#$ 0descritor.fim1^.proximo!=p;
We a lista n$o estiver vazia ent$o o n*seginte ao ltimo n* antigo "ever)apontar para o novoX
E$D E"E -EG#$ descritor.inicio!=p;
Wen$o% estar) sen"o inseri"o o primeiron* "a lista% "a9 a necessi"a"e "e "e!ini-lotambm como o primeiro n* "a listaX
E$D;
descritor.fim!=p;Wsta linha "e!ine 'e o novo n* inseri"oestar) na ltima posi#$o "a listaX
#$C0descritor.nos1;WAmenta o nmero "e n*s e(istentes em1X
E$D;
PROCED,RE insere_esquerda;
1Q
-
7/21/2019 Listas Lineares2
20/34
WRnserir a es'er"a signi!ica% inserir o n*na primeira posi#$o "a listaX
+ARp!pont;WLeclarapcomo m ponteiro para o novon* "a listaX
-EG#$
$E/0p1;WAloca mem*ria para o n* aponta"o porpX
{Rotina de ent2ada de dado3* exempo! READ$0p^.nome1;)
p^.proximo!=descritor.inicio;W;az com 'e o n* seginte ao novo n*6aponta"o por p aponte para o antigo
primeiro n* "a listaX
p^.anterior!=$#;W=omo o n* est) sen"o inseri"o na "ireita%ele n$o estar) sen"o prece"i"o por nenhmotro n*X
#4 de3>2ito2.no368' T5E$ 0de3>2ito2.ini>io1^.ante2io2!=p
We a lista n$o estiver vazia o n* anteriorao antigo primeiro ser) o novoX
E"E
de3>2ito2.fim!=p; Wen$o% como a lista est) vazia o novo n*tambm ser) o ltimo "a listaX
descritor.inicio!=p;WLe!ine o novo n* como o primeiro "alistaX
#$C0descritor.nos1;WAmenta o nmero "e n*s e(istentes em1X
E$D;
PROCED,RE insere_posicao0n! #$TEGER1;WRnserir em ma posi#$o nsigni!ica inserirm n* em ma posi#$o interme"i)ria "alistaX
+ARp*q!pont;
20
-
7/21/2019 Listas Lineares2
21/34
WLeclara p e q como ponteiros para n*.n"epapontar) para o novo n* "a lista, eqpercorrer) a listaX
-EG#$
$E/0p1;WAloca mem*ria para o n* aponta"o porpX
#4 00n671 OR 0n8descritor.nos9711 T5E$ {Rotina de e22o)Wsta linha prev8 m erro na entra"a "a
posi#$o. limite sperior ma ni"a"eacima "o total "e n*s e(istentes "a lista
por'e o s)rio po"er) inserir m n* naltima posi#$oX
#4 n=7 T5E$ -EG#$ insere_esquerda;
W=aso especial on"e o s)rio estar)inserin"o o n* no in9cio "a lista% por issochama-se a PY=L4Yinsere_esquerdaX
E:#T;
Wai "a PY=L4Y X
E$D;
#4 n=descritor.nos97 T5E$ -EG#$insere_direita;
W=aso especial on"e o s)rio estar)inserin"o o n* no !im "a lista% por issochama-se a PY=L4Y insere_direitaX
E:#T;Wai "a PY=L4Y X
E$D;
{Rotina de ent2ada de dado3* exempo! READ$0p^.nome1;)
q^.proximo!=descritor.inicio;W;az com 'e o pr*(imo "o ponteiro 'aponte para o primeiro n* "a listaX
4OR n!=nDO/$TO & DO q!=q.proximo;Wsta linha !az com 'e qpercorra a listaat chegar ao n* anterior a posi#$o "o novon* a ser inseri"oX
p^.proximo!=q.proximo;
21
-
7/21/2019 Listas Lineares2
22/34
W n* seginte ao novo n*6p7 aponta paraon"e o n* seginte "o anterior6q7 apontaX
p^.anterior!=q;W n* anterior ao n* aponta"o por paponta para qX
q.proximo!=p;W n* seginte ao n* aponta"o pelo
ponteiro qaponta para o novo n*6aponta"oporp7X
0p^.proximo1^.anterior!=p;WPara !echar a ca"eia% o n* seginte aonovo "ever) estar conecta"o com o novon*X
E$D;
PROCED,RE remove_direita;WYemover a "ireita signi!ica remover oltimo n* "a listaX
+ARp,q!pont;WLeclara p e q como ponteiros para n*.n"e q apontar) para o n* 'e ir) serremovi"o, eppercorrer) a listaX
-EG#$
CA"E de3>2ito2.no3 O4
' ! {Rotina de e22o);We n$o e(istirem n*s na lista% n$o ser)
poss9vel a remo#$o% "a9 chama-se a rotina"e manipla#$o "o erroX
7 ! -EG#$We e(istir apenas m n* "a lista ent$o+X
p!=descritor.inicio;W ponteiro aponta para o primeiro n* "alistaX
inicializa;WZ) 'e a lista !icar) vazia% po"emos !azero mesmo proce"imento "e inicializar o"escritorX
D#"PO"E0q1;WLesaloca a mem*ria cria"a "o n*aponta"o porpX
22
-
7/21/2019 Listas Lineares2
23/34
E:#TWai "a PY=L4YX
E$D;
E$D;
p!=0descritor.fim1^.anterior;W ponteiropaponta para o penltimo n*"a listaX
p^.proximo!=$#;W=omo a lista linear o ponteiro p6oltimo7 aponta para BROX
0descritor.fim1^.anterior!=$#;W=omo agora o penltimo n* ser) o ltimo%
n$o e(iste nenhm otro n* seginte% "a9por'eproximoaponta para BROX
q!=descritor.fim;W;az com 'e q aponte para o n* a serremovi"o% o se&a% o ltimo "a listaX
D#"PO"E0q);WLesaloca a mem*ria cria"a "o n*aponta"o por qX
descritor.fim!=p;
WRn"ica 'e o n* aponta"o por p ser) oltimo "a listaX
DEC0descritor.nos1;WLimini o nmero "e n*s "a lista em 1 X
E$D;
PROCED,RE remove_esquerda;WYemover a es'er"a signi!ica remover o
primeiro n* "a listaX
+ARp!pont;WLeclarap'e ser) o n* removi"oX
-EG#$
CA"E descritor.nosO4
' ! {Rotina de e22o);
2H
-
7/21/2019 Listas Lineares2
24/34
We n$o e(istirem n*s na lista% n$o ser)poss9vel a remo#$o% "a9 chama-se marotina "e manipla#$o "o erroX
7 ! -EG#$We e(istir apenas m n* na lista ent$o+X
p!=descritor.inicio;W ponteiropaponta para o primeiro n* "alista% este ser) removi"oX
p^.anterior!=$#; p^.proximo!=$#;
WPor 'estes "e segran#a% !azemos com'e o n* aponta"o por p este&acompletamente isola"oX
inicializa;
WZ) 'e a lista est) vazia po"emos !azer omesmo proce"imento "e inicializar o"escritorX
D#"PO"E0p1;WLesaloca a mem*ria cria"a "o n*aponta"o porpX
E:#TWai "a PY=L4YX
E$D; E$D;
p!=descritor.inicio;W ponteiropaponta para o primeiro n* "alistaX
descritor.inicio!=p^.proximo;WAgora o segn"o n* "a lista torna-se o
primeiroX
0de3>2ito2.ini>io1^.anterior!=$#;W n* anterior "o primeiro n* "e ma listalinear n$o e(iste% por isso se anterior
nloX
p^.proximo!=$#;WPor segran#a aterra-se o ponteiropX
D#"PO"E0p1;WLesaloca a mem*ria cria"a paraarmazenar o antigo primeiro n*X
2I
-
7/21/2019 Listas Lineares2
25/34
DEC0descritor.nos1;WLimini o nmero "e n*s "a lista em 1 X
E$D;
PROCED,RE remove_posicao0n! #$TEGER1; +ARp!pont; i! #$TEGER;
-EG#$ #4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o);
Wsta linha prev8 m erro na entra"a "aposi#$oX
#4 n=7 T5E$ -EG#$ remove_esquerda;
W=aso especial on"e o s)rio estar)removen"o o primeiro n* "a lista% por issochama-se a PY=L4Yremove_esquerdaX
E:#T;Wai "o PY=L4YX
E$D;
#4 n=descritor.nosT5E$ -EG#$ remove_direita;
W=aso especial on"e o s)rio estar)removen"o o ltimo n* "a lista% por issochama-se a PY=L4Y remove_direitaX
E:#T;Wai "o PY=L4YX
E$D;
p^.proximo!=descritor.inicio;WBesta linha o pr*(imo "o ponteiro paponta para o primeiro n* "a listaX
4OR i!=7 TO nDOp!=p^.proximo;Wsta rotina !az com 'eppercorra a listaat o n* 'e ser) removi"oX
0p^.anterior1^.proximo!=p^.proximo;Wsta rotina !az com 'e o n* seginte aoanterior "o aponta"o por p aponte para oseginte "epX
25
-
7/21/2019 Listas Lineares2
26/34
0p^.proximo1^.anterior!=p^.anterior;Wsta rotina !az com 'e o n* seginte aoanterior "o aponta"o por p aponte para oanterior a pX
p^.proximo!=$#; p^.anterior!=$#;
WAterramos o n* aponta"o por p por'estes "e segran#aX
D#"PO"E0p1;WLesaloca a mem*ria cria "o n* aponta"o
porpX
DEC0descritor.nos1;WLimini o nmero "e n*s "a lista em 1X
E$D;
PROCED,RE consulta0n! #$TEGER1;WYotina para a conslta "os "a"osarmazena"os no n* "a posi#$o nX
+ARp!pont;WLeclara#$o "o ponteiro 'e ir) percorrer alistaX
-EG#$
#4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o);Wsta linha prev8 m erro na entra"a "a
posi#$oX p^.proximo!=descritor.inicio;
W pr*(imo "o ponteiro p aponta para oprimeiro n* "a listaX
4OR n!=nDO/$TO 7 DOp!=p^.proximo;Wsta rotina !az com 'eppercorra a listaat o n* "ese&a"oX
{Rotina de imp2e33o do3 dado3 do n na tea* * exempo!
/R#TE$0p^.nome1;)
E$D;
PROCED,RE modifica0n! #$TEGER1;WYotina para a mo"i!ica#$o "os "a"osarmazena"os no n* "a posi#$o nX
2J
-
7/21/2019 Listas Lineares2
27/34
+ARp!pont;WLeclara#$o "o ponteiro 'e ir) percorrer alistaX
-EG#$
#4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o);Wsta linha prev8 m erro na entra"a "a
posi#$oX p^.proximo!=descritor.inicio;
W pr*(imo "o ponteiro p aponta para oprimeiro n* "a listaX
4OR n!=nDO/$TO 7 DOp!=p^.proximo;Wsta rotina !az com 'eppercorra a listaat o n* "ese&a"oX
{Rotina de ent2ada do3 dado3 do n na tea* * exempo!
READ$0p^.nome1;)
E$D;
2K
-
7/21/2019 Listas Lineares2
28/34
2
-
7/21/2019 Listas Lineares2
29/34
APNDICE - LISTAS CIRCULARES
Gesmo n$o sen"o parte "o conte"o% bom se comentar m poco sobre listascirclares. Bas p)ginas segintes se encontra m mo"elo "e lista circlar simples 6sem
restri#es "e tamanho7 'e tambm se encontra no "is'ete6Go"eloH.pas7.
PROPRIEDADES
A proprie"a"e "e ma lista circlar simples a seginte+
6"escritor.!im7S.scessor < "escritor.in9cio,
Z) as proprie"a"es "e ma lista circlar "plamente enca"ea"a s$o as seginte+
6"escritor.!im7S.scessor < "escritor.in9cio,
6"escritor.in9cio7S.pre"ecessor < "escritor.in9cio,
2Q
-
7/21/2019 Listas Lineares2
30/34
PROGRAM modelo_lista_circular_simples;
TYPEpont= ^no; no= RECORD
{Definio do tipo de dado do n. Exempo! nome
!R#$G%&'(;) proximo!pont; E$D;TYPE tipo_descritor= RECORD nos! #$TEGER; inicio* fim!pont; E$D;+AR descritor! tipo_descritor;
PROCED,RE inicializa; -EG#$
descritor.nos!='; descritor.inicio!=$#; descritor.fim!=$#; E$D;
PROCED,RE insere_direita; +ARp!pont; -EG#$ $E/0p1; {Rotina pa2a ent2ada de dado3* exempo READ$0p^.nome1;) p^.proximo!=$#;
#4 descritor.nos=' T5E$ descritor.inicio!=p E"E 0descritor.fim1^.proximo!=p; descritor.fim!=p;
p^.proximo!=descritor.inicio; #$C0descritor.nos1; E$D;
PROCED,RE insere_esquerda; +ARp!pont;
-EG#$ $E/0p1; {Rotina pa2a ent2ada de dado3* exempo READ$0p^.nome1;) p^.proximo!=descritor.inicio; descritor.inicio!=p; #4 descritor.nos=' T5E$ descritor.fim!=p; 0descritor.fim1^.proximo!=p; #$C0descritor.nos1;
H0
-
7/21/2019 Listas Lineares2
31/34
E$D;
PROCED,RE insere_posicao0n! #$TEGER1; +ARp*q!pont; -EG#$
$E/0p1; #4 00n671 OR 0n8descritor.nos9711 T5E$ {Rotina de e22o) #4 n=7 T5E$ -EG#$ insere_esquerda;
E:#T; E$D; #4 n=descritor.nos97 T5E$ -EG#$
insere_direita; E:#T; E$D; {Rotina pa2a ent2ada de dado3* exempo READ$0p^.nome1;)
q^.proximo!=descritor.inicio; 4OR n!=nDO/$TO & DO q!=q.proximo; p^.proximo!=q.proximo; q.proximo!=p; E$D;
PROCED,RE remove_direita; +ARp*q!pont; i! #$TEGER; -EG#$
CA"E descritor.nosO4
' ! {Rotina de e22o); 7 ! -EG#$ p!=descritor.inicio; inicializa; D#"PO"E0p1; E:#T; E$D; E$D; p^.proximo!=descritor.inicio; 4OR i!=7 TO descritor.nos7 DOp!=p^.proximo; q!=p^.proximo;
p^.proximo!=descritor.inicio; descritor.fim!=p; D#"PO"E0q1; DEC0descritor.nos1; E$D;
PROCED,RE remove_esquerda; +ARp!pont;
H1
-
7/21/2019 Listas Lineares2
32/34
-EG#$ CA"E descritor.nosO4 ' ! {Rotina de e22o); 7 ! -EG#$ p!=descritor.inicio;
inicializa; D#"PO"E0p1; E:#T; E$D; E$D; p!=descritor.inicio; descritor.inicio!=p^.proximo; 0descritor.fim1^.proximo!=descritor.inicio;
p^.proximo!=$#; D#"PO"E0p1; DEC0descritor.nos1; E$D;
PROCED,RE remove_posicao0n! #$TEGER1; +ARp*q!pont; i! #$TEGER; -EG#$ #4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o); #4 n=7 T5E$ -EG#$ remove_esquerda; E:#T; E$D; #4 n=descritor.nosT5E$ -EG#$ remove_direita; E:#T; E$D; p^.proximo!=descritor.inicio; 4OR i!=7 TO n7 DOp!=p^.proximo; q!=p^.proximo; p^.proximo!=$#; D#"PO"E0q1; DEC0descritor.nos1; E$D;
PROCED,RE consulta0n! #$TEGER1; +ARp!pont; -EG#$ #4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o); p^.proximo!=descritor.inicio; 4OR n!=nDO/$TO 7 DOp!=p^.proximo; {Rotina pa2a imp2e33o do3 dado3 do n na tea* exempo!
H2
-
7/21/2019 Listas Lineares2
33/34
/R#TE$0p^.nome1;) E$D;
PROCED,RE modifica0n! #$TEGER1; +ARp!pont;
-EG#$#4 00n671 OR 0n8descritor.nos11 T5E$ {Rotina de e22o);
p^.proximo!=descritor.inicio; 4OR n!=nDO/$TO 7 DOp!=p^.proximo; {Rotina de ent2ada do3 dado3 do n na tea* exempo! READ$0p^.nome1;) E$D;
4,$CT#O$procura0p!pont1 ! #$TEGER; +AR q!pont; i! #$TEGER;
-EG#$ #4 de3>2ito2.no3=' T5E$ {Rotina de e22o); q!=descritor.inicio; i!=7; /5#E q68$# DO -EG#$ {Rotina ?e >@e>a a iadade* exempo!
#4p^.nome=q.nomeT5E$ ...) {Ca3o a exp2e33o a>ima fo2 Be2dadei2a* a Ba2iBe i
fo2ne>e em ?e po3io a info2mao foi en>ont2ada e 3ai da 4,$CT#O$ 2eto2nando o Bao2 da Ba2iBe i); q!=q.proximo;
#$C0i1;E$D; {Rotina ?e di ?e no foi en>ont2ada a info2mao); E$D;
HH
-
7/21/2019 Listas Lineares2
34/34
BIBLIOGRAFIA
eloso% Palo, strtras "e "a"os
"itora =amps
\erninghan% Mrian ]., = A lingagem "e progrma#$o pa"$o ABR"itora =amps