Listas Lineares2

download Listas Lineares2

of 34

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