SlideShare une entreprise Scribd logo
1  sur  17
Télécharger pour lire hors ligne
Universidade Federal de Ouro Preto


     Instituto de Ciências Exatas e Biológicas


          Departamento de Computação




ALGORITMOS E ESTRUTURAS DE DADOS
          Segundo Trabalho Prático




        Johnnatan Messias Peixoto Afonso


            Professor - David Menotti
          Monitor - Kayran dos Santos




                   Ouro Preto
              6 de outubro de 2009
Sumário
1   Introdução                                                                                                                                      1
    1.1 Considerações iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                                1
    1.2 Especicação do problema . . . . . . . . . . . . . . . . . . . . . . . .                                                                    1

2   Algoritmo e estruturas de dados                                                                                                                 1
    2.1 TAD - TBloco . . . . . . . . .                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 2
        2.1.1 Assinatura das funções                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 2
        2.1.2 Função Vazio . . . . .                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 3
        2.1.3 Função LehVazio . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 3
        2.1.4 Função Insere . . . . .                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 3
        2.1.5 Função Volta . . . . .                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 3
        2.1.6 Função PileOver . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 4
        2.1.7 Função MoveOver . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 4
        2.1.8 Função PileOnto . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 5
        2.1.9 Função MoveOnto . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 5
        2.1.10 Função Imprime . . . .                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 6
        2.1.11 Função Busca . . . . .                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 6
        2.1.12 Função Criar . . . . .                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 7
    2.2 Main . . . . . . . . . . . . . .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 7
        2.2.1 Função STDAFX.H . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 10

3   Análise de complexidade dos algoritmos                                                                                                         10
    3.1   Função   Volta . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
    3.2   Função   PileOver .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
    3.3   Função   MoveOver .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
    3.4   Função   PileOnto .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
    3.5   Função   start . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
    3.6   Função   MoveOnto .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
    3.7   Função   Imprime . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
    3.8   Função   Busca . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
    3.9   Função   Criar . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11

4   Testes                                                                                                                                         12


5   Conclusão                                                                                                                                      14




Lista de Figuras
    1     Argumentos . . . . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
    2     Comando . . . . . . .            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
    3     Arquivo de entrada . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
    4     Execuxão do comando              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   13
    5     Arquivo de saída . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14




                                                               2
Lista de Programas
 1    TVetor . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 2
 2    Assinaturas do TBloco.h       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 2
 3    Vazio . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 3
 4    LehVazio . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 3
 5    Insere . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 3
 6    Volta . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 4
 7    PileOver . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 4
 8    MoveOver . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 4
 9    PileOnto . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 5
 10   Move Onto . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 5
 11   Imprime . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 6
 12   Busca . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 6
 13   Criar . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 7
 14   Main . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 7
 15   Stdafx . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   . 10




                                                    3
1    Introdução
  Este trabalho consiste na implementação do TAD (Tipo Abstrato de Dados)
TBloco para representar as listas encadeadas dos blocos para representarmos o
Mundo dos Blocos com as implementações das funções.

1.1 Considerações iniciais
    • Além das explicações citadas acima das funções, favor considerar também os
      comentários contidos no programa.
    • Ambiente de desenvolvimento do código fonte: Microsoft Visual Studio 2008
      Professional.
    • Linguagem utilizada: Linguagem C.
    • Ambiente de desenvolvimento da documentação: TeXnicCenter 1.0 SRC-Editor
         A
      de LTEX.

1.2 Especicação do problema
    Várias áreas da ciência da computação usam domínios simplicados para abstrair
diversos tipos de problemas. Por exemplo, algumas das primeiras pesquisas de
inteligência articial nas áreas de planejamento e robótica eram feitas utilizando o
mundo dos blocos, no qual um braço robótico realizava tarefas simuladas envolvendo
a manipulação de blocos [2]. Nesse trabalho você vai implementar um mundo de
blocos bem simples [3], que vai funcionar de acordo com certas regras e obedecer
comandos de movimentação de blocos dados pelo usuário, simulando o que seria a
manipulação através um braço robótico. O seu mundo de blocos começa com cada
bloco na sua posição inicial, e depois de uma série de comandos deve terminar em
uma conguração nal.
Os comandos possíveis para a manipulação do mundo de blocos são:
    • move a onto b: Move o bloco a para cima do bloco b retornando eventuais
      blocos que já estiverem sobre a ou b para as suas posições originais.
    • move a over b: Coloca o bloco a no topo do monte onde está o bloco b
      retornando eventuais blocos que já estiverem sobre a às suas posições originais.
    • pile a onto b: Coloca o bloco a juntamente com todos os blocos que estiverem
      sobre ele em cima do bloco b, retornando eventuais blocos que já estiverem
      sobre b as suas posições originais.
    • pile a over b: Coloca o bloco a juntamente com todos os blocos que estiverem
      sobre ele sobre o monte que contem o bloco b.


2    Algoritmo e estruturas de dados
   Foi criado um TAD, Tipo Abstrato de Dados para representar as listas en-
cadeadas, bem como a quantidade de blocos e de listas encadeadas e também um
apontador para os blocos.

                                          1
2.1 TAD - TBloco
            Para representar as listas encadeadas e os blocos foi criado um TAD TBloco.h
     typedef struct                       Bloco                 ∗ Apontador ;                    /   ∗       Apontador                para      a    estrutura          TBloco
                                                ∗/
     typedef struct
            do     tipo       Bloco
                                          Bloco



       int
     {

                 num ;

 5        Apontador               pProx ;               /   ∗       Apontador                   pProx ;               ∗/
     }    TBloco ;        /   ∗       Blocos :                  Célula                ∗/

     typedef struct
     {

10        Apontador               pPrimeiro ;                           /   ∗    Apontador                   para             o    primeiro         da    lista    ∗/
          Apontador               pUltimo ;                     /   ∗       Apontador                para             o       último      da    lista       ∗/
     }    TLista ; /     ∗        Lista         dos                 blocos             ∗/

     typedef struct
15   {

                      ∗vetlista
          int
          TLista                                    ;

                 tamanho ;

     } TVetlista ;                /   ∗   Estrutura                             dos    vetores                   de       listas       encadeadas            ∗/

                                                                                 Programa 1: TVetor


     2.1.1         Assinatura das funções

            Abaixo as assinaturas do TBloco.h.
         void    Vazio ( TLista                         ∗) ;            /   ∗    Assinatura                      da       função       Vazio         para    criar      uma
                                               ∗/
         void                                                                   int
              lista       vazia
                   Criar ( TVetlista                                ∗,
                                                          numero ) ; / ∗ A s s i n a t u r a da f u n ç ã o C r i a r p a r a

                                                       ∗ / // q n t d e l i s t a e n c a d e a d a s
         double
                 criar        lista             encadeada
                   L e h V a z i o ( T L i s t a ∗ ) ; / ∗ A s s i n a t u r a da f u n ç ã o L e h V a z i o p a r a

            v e r i f i c a r s e a l i s t a é ou não v a z i a ∗ /
         void  I n s e r e ( TLista ∗ ,                             int
                                                   ) ; / ∗ A s s i n a t u r a da f u n ç ã o I n s e r e p a r a    inserir
             um b l o c o com um c o n t e ú d o a uma p o s i ç ã o a p o n t a d a ∗ /
 5       void  I m p r i m e ( T L i s t a ∗ ) ; / ∗ A s s i n a t u r a da f u n ç ã o Imprime q u e i m p r i m e

            ATENÇÃO ∗ /
         Apontador Busca ( T V e t l i s t a ∗ ,                 , Apontador ∗ ,       int     ∗ ) ; / ∗ A s s i n a t u r a da        int
                 função           Busca             para                receber             uma          lista                encadeada         e    inserir       na    lista
                                                                                                                                     ∗/
         void                                                                        int        int
              um    bloco             antes             de          uma          determinada                         posição
                 MoveOnto ( T V e t l i s t a                                   ∗,          ,                ) ;      /   ∗       Assinatura         da   função        Move
                       ∗/
         void                                                                         int        int
              Onto
                   PileOver ( TVetlista                                         ∗,          ,                ) ;      /   ∗       Assinatura         da   função        Pile
                       ∗/
         void                                                                         int        int
              Over
                 MoveOver ( T V e t l i s t a                                   ∗,          ,                ) ;      /   ∗       Assinatura         da   função        Move
                       ∗/
         void                                                                         int        int
              Over
10               PileOnto ( TVetlista                                           ∗,          ,                ) ;      /   ∗       Assinatura         da   função        Pile
                       ∗/
         void
              Onto
                 Volta ( TVetlista                                  ∗ , Apontador ) ;                        /   ∗    Assinatura               da    função       que    volta
              os    blocos                de    acordo                      com       as    operações                         de    Pile   ou       Move    ∗/

                                                        Programa 2: Assinaturas do TBloco.h




                                                                                                         2
2.1.2      Função Vazio

        Essa função é chamada pela função Criar, criando uma lista encadeada vazia,
    fazendo uma alocação dinâmica (malloc) onde o último da lista passa a ser o primeiro
    e o primeiro aponta para o próximo bloco da lista recebendo NULL.
    void    Vazio ( TLista         ∗plista )        /   ∗   Essa      função           é    chamada     pela      função       Criar ,
          criando     uma     lista    encadeada              vazia       ∗/

                                                                                       sizeof
    {

        plista −p P r i m e i r o = ( A p o n t a d o r ) m a l l o c             (              ( Bloco ) ) ;

        plista −p U l t i m o = p l i s t a −p P r i m e i r o ;
5       plista −p P r i m e i r o −p P r o x = NULL ;

    }


                                                    Programa 3: Vazio


    2.1.3      Função LehVazio

        Essa função verica se a lista é vazia, caso o primeiro da lista seja igual ao último
    ela retornará 1, caso contrário, 0. Obs.: Essa função não foi usada no programa pois
    é muito caro chamar uma função, não sendo, portanto, viável a sua utilização uma
    vez que pode ser facilmente implementado os comandos contidos nela em outras
    funções.
    double      LehVazio ( TLista        ∗plista )            /   ∗   Essa     função             verifica      se   a   lista
          encadeada       é   vazia    ∗/

        return
    {

                   ( plista   −p P r i m e i r o   ==        plista      −p U l t i m o ) ;
    }


                                               Programa 4: LehVazio


    2.1.4      Função Insere

       Após criar uma lista vazia, usamos essa função para inserir novos elementos
    na lista encadeada, mas deve-se alocar dinamicamente (malloc) a memória para
    armazenar o elemento.
    void    I n s e r e ( TLista    ∗ plista    ,       int   numero )         /   ∗       Essa   função     insere      um     novo
          bloco    em uma      lista     encadeada             ∗/

                                                                                              sizeof
    {

        plista −p U l t i m o −p P r o x = ( A p o n t a d o r ) m a l l o c (                        ( TBloco ) ) ; /   ∗    plista
           −p U l t i m o −p P r o x r e c e b e r e c e b e a q u a n t i d a d e                e   bytes     alocado       ∗/
        plista −p U l t i m o = p l i s t a −  p U l t i m o −p P r o x ;

5       plista −p U l t i m o − num = numero ;
                                

        plista −p U l t i m o −p P r o x = NULL ;

    }


                                                    Programa 5: Insere


    2.1.5      Função Volta

        Essa função é responsável por voltar os blocos à suas posições originais após as
    operações as operações de pilo e onto na execução do programa. Caso o apontador
    seja NULL ele retorna, caso contrário, o primeiro da lista aponta para o próximo

                                                                      3
que recebe p, em seguida o último da lista também recebe p. Fará isso até que p
     seja NULL, em seguida executará a próxima instrução que seria: p-pProx=NULL.
     void         Volta ( TVetlista          ∗ pbloco        ,    Apontador               p)    /   ∗       Função          para     voltar           os
             blocos       depois       das    operações               de M V
                                                                          O E e               PILE          ∗/

         if
     {



              return
              ( p= NULL)
                  =

                          ;

 5       pbloco      − v e t l i s t a [ p−num ] . p P r i m e i r o −p P r o x=p ;
         p b l o c o − v e t l i s t a [ p− num ] . p U l t i m o=p ;
                                           

         V o l t a ( p b l o c o , p− p P r o x ) ; / ∗ R e c u r s i v i d a d e : E n q u a n t o                       −
                                                                                                                          p p P r o x      for       igual
                  a NULL a       função       será       chamada ,              caso      contrário ,                     executa       a   instrução
                   abaixo :       −
                                 p p P r o x=NULL ;             ∗/
          −
         p p P r o x=NULL ;

     }


                                                            Programa 6: Volta


     2.1.6         Função PileOver

        Coloca um bloco a juntamente com todos os blocos que estiverem sobre ele sobre
     o monte que contem um bloco b.
     void         PileOver ( TVetlista              ∗ pbloco          ,    int      A,    int       B)          /   ∗   Coloca     um    bloco         a
             juntamente          com    todos       os      blocos          que         estiverem                   sobre      ele   sobre        o
     monte         que   contem       um     bloco      b.       ∗/
     {



         int
         Apontador            pantA , pantB , pA , pB ;

 5
         if
                   listaA , listaB ;



            return
              (A =
                = B)

                          ;

         pA=B u s c a ( p b l o c o , A, pantA , l i s t a A ) ;



         if
         pB=B u s c a ( p b l o c o , B, pantB , l i s t a B ) ;

10
            return
              ( ( pA =
                    = NULL) | | ( pB =
                                    = NULL) | | ( l i s t a A==l i s t a B ) )



         while −
                          ;

                    ( pB p P r o x !=NULL)

         {

                      −
              pB=pB p P r o x ;

15       }

              −
         pB p P r o x=pA ;

         pantA     −p P r o x=NULL ;
         pbloco     − v e t l i s t a [ l i s t a B   ] . p U l t i m o=pA ;

     }


                                                        Programa 7: PileOver


     2.1.7         Função MoveOver

        Coloca um bloco a no topo do monte onde está um bloco b retornando eventuais
     blocos que já estiverem sobre a às suas posições originais.
     void      MoveOver ( T V e t l i s t a         ∗ pbloco          ,   int    A,     int    B)       /   ∗       Coloca     um    bloco        a    no
             topo    do       monte    onde    está         um    bloco             b   retornando                      eventuais       blocos
     que      já    estiverem         sobre     a      às    suas          posições            originais                  ∗/
     {



         int
         Apontador            pantA , pantB , pA , pB ;

 5                 listaA , listaB ;




                                                                                4
if
              return
              (A =
                = B)

                            ;

         pA=B u s c a ( p b l o c o , A, pantA , l i s t a A ) ;



         if
         pB=B u s c a ( p b l o c o , B, pantB , l i s t a B ) ;

10
            return
              ( ( pA =
                    = NULL) | | ( pB =
                                    = NULL) | | ( l i s t a A==l i s t a B ) )



         if −
                            ;

              ( pA p P r o x !=NULL)

         {

                                                 −
              V o l t a ( p b l o c o , pA p P r o x ) ;

15                −
              pA p P r o x=NULL ;

              pbloco     − v e t l i s t a          [ l i s t a A ] . p U l t i m o=pA ;

         }

              −
         pB p P r o x=pA ;

         pantA     −p P r o x=NULL ;
20       pbloco     − v e t l i s t a [ l i s t a B          ] . pUltimo      −p P r o x=pA ;
     }


                                                              Programa 8: MoveOver


     2.1.8         Função PileOnto

        Coloca um bloco a juntamente com todos os blocos que estiverem sobre ele sobre
     o monte que contem um bloco b.
     void         PileOnto ( TVetlista                      ∗ pbloco      ,   int   A,    int        B)       /   ∗   Coloca   um   bloco      a
             juntamente                com       todos      os    blocos        que      estiverem                sobre     ele   sobre    o
     monte         que      contem          um       bloco     b.    ∗/
     {



         int
         Apontador                  pantA , pantB , pA , pB ;

 5
         if
                   listaA , listaB ;



            return
              (A =
                = B)

                            ;

         pA=B u s c a ( p b l o c o , A, pantA , l i s t a A ) ;



         if
         pB=B u s c a ( p b l o c o , B, pantB , l i s t a B ) ;

10
            return
              ( ( pA =
                    = NULL) | | ( pB =
                                    = NULL) | | ( l i s t a A==l i s t a B ) )



         if −
                            ;

              ( pB p P r o x !=NULL)

         {

                                                 −
              V o l t a ( p b l o c o , pB p P r o x ) ;

15                −
              pB p P r o x=NULL ;

              pbloco     − v e t l i s t a          [ l i s t a B ] . p U l t i m o=pB ;

         }

              −
         pB p P r o x=pA ;

         pantA     −p P r o x=NULL ;
20       pbloco     − v e t l i s t a [ l i s t a B          ] . p U l t i m o=pA ;

     }


                                                               Programa 9: PileOnto


     2.1.9         Função MoveOnto

         Move um bloco a para cima do bloco b retornando eventuais blocos que já es-
     tiverem sobre a ou b para as suas posições originais.
     void      MoveOnto ( T V e t l i s t a                 ∗ pbloco      ,   int   A,   int    B)    /   ∗       Move um      bloco   a   para
             cima      do       bloco        b    retornando            eventuais           blocos            que      já   estiverem
     sobre         a   ou       b    para    as       suas       posições           originais .           ∗/


                                                                                    5
{



         int
         Apontador            pantA , pantB , pA , pB ;

 5
         if
                  listaA , listaB ;



            return
              (A =
                = B)

                          ;

         pA=B u s c a ( p b l o c o , A, pantA , l i s t a A ) ;



         if
         pB=B u s c a ( p b l o c o , B, pantB , l i s t a B ) ;

10
            return
              ( ( pA =
                    = NULL) | | ( pB =
                                    = NULL) | | ( l i s t a A==l i s t a B ) )



         if −
                          ;

              ( pA p P r o x !=NULL)

         {

                                         −
              V o l t a ( p b l o c o , pA p P r o x ) ;

15                −
              pA p P r o x=NULL ;

              pbloco     − v e t l i s t a   [ l i s t a A ] . p U l t i m o=pA ;



         if
         }

                   −
              ( pB p P r o x !=NULL)

         {

20                                       −
              V o l t a ( p b l o c o , pB p P r o x ) ;

                  −
              pB p P r o x=NULL ;

              pbloco     − v e t l i s t a   [ l i s t a B ] . p U l t i m o=pB ;

         }

              −
         pB p P r o x=pA ;

25       pantA     −p P r o x=NULL ;
         pbloco     − v e t l i s t a [ l i s t a B   ] . p U l t i m o=pA ;

     }


                                                      Programa 10: Move Onto


     2.1.10             Função Imprime

        Função que percorre a lista até que o próximo elemento aponte para NULL,
     imprimindo os valores.
     void      Imprime ( T L i s t a          ∗plista )       /   ∗   Função      que         percorre   a   lista   até    que    o
             próximo          elemento        aponte       para       NULL,       imprimindo        os   valores     ∗/
     {

         Apontador            paux ;

                               −p P r i m e i r o −p P r o x ;
         while
         paux= p l i s t a

 5                    ( paux !=NULL)

         {

              p r i n t f ( %d    , paux− num ) ;
                                             

              paux      = paux    −p P r o x ;
         }

10   }


                                                        Programa 11: Imprime


     2.1.11             Função Busca

       Essa função verica se o elemento está na lista, caso esteja, teremos como retorno
     um ponteiro que no caso representa o elemento, caso contrário, retornará NULL.
     Apontador           Busca ( T V e t l i s t a      ∗ pblocos       ,   int   numero , A p o n t a d o r   ∗ pant ,    int    ∗ pla
              /   ∗ Ponteiro       de    inteiro         pra      lista         dele   ∗/ )

         int
     {

                  i ;

         Apontador            paux ;




                                                                            6
5        for      ( i = 0 ; i p b l o c o s      −tamanho ;             i ++)    /   ∗   Laço    de       repetição            até   que   o     i   seja
                     menor          que       o    o       número    de     listas           encadeadas            ∗/
          {

               paux=p b l o c o s − v e t l i s t a [
                                                                    i ] . pPrimeiro          −p P r o x ;
               ∗ p a n t=p b l o c o s − v e t l i s t a
               while
                                                                     [ i ] . pPrimeiro ;

                             ( paux !=NULL)

10
                 if
               {

                           ( paux   −num==numero )
                    {

                           ∗ p l a= i
                           return
                                         ;

                                             paux ;

15                  }

                    ∗ p a n t=paux ;
                    paux=paux−    p P r o x ;

               }

          }

20        ∗ p l a =−1; / ∗                                                                                   ∗/
          return
                                    Lista           q      contem      num    q     não      existe
                            NULL ;

     }


                                                                     Programa 12: Busca


     2.1.12                Função Criar

        Essa a função responsável por criar a lista encadeada, ela chama a função Vazio
     para criar uma lista vazia e depois chama a função Insere para inserir os elementos
     nos blocos.
     void          Criar ( TVetlista                       ∗ blocos    ,    int     numero )        /   ∗    Essa       a    função     responsável
              por       criar        a       lista          encadeada ,        ela          chama    a      função          Vazio   para      criar
              uma       lista        vazia             e    depois     chama        a       função       Insere         para      inserir      os
              elementos              nos          blocos        ∗/

          int
     {



                                                                                             sizeof
                     i ;

          blocos           − v e t l i s t a = ( T L i s t a ∗ ) m a l l o c (                             ( TLista )       ∗ numero ) ;
 5                         −tamanho = numero ;
          for
          blocos

                   ( i = 0 ; i numero ; i ++)

          {

               V a z i o (( b l o c o s          − v e t l i s t a   [ i ]) ) ;

               I n s e r e ( b l o c o s         − v e t l i s t a   [ i ] , i ) ;

10        }

     }


                                                                     Programa 13: Criar


     2.2 Main
              Programa Main abaixo:
     //                         −
              TP2AEDSI JOHN . c p p                        :   Defines       the        entry      point          for       the   console
              application .


     #include                 s t d a f x . h


 5   int      int
               main (               argc ,          char ∗       argv [ ] )

     {




                                                                                        7
system (  c o l o r                        1b ) ;        /   ∗       Função               responsável                         por       deixar          a    tela      azul          :   −)
                 ∗/

     int
     char
                  k,          i =0 ,         j =0 ,        tam ,        qnt ,        a ,         b;

10                    word [ 2 1 ] [ 5 ] , c a r a c ;

     TVetlista                       pbloco ;

     Apontador                       paux ;

     FILE             ∗ arqE ; /∗                 Arquivo               de       entrada                  ∗/
     FILE             ∗ a r q S ; /∗              Arquivo               de       saída            ∗/
15
     a r q E=f o p e n ( a r g v [ 1 ] ,  r  ) ;                               // a r q E           é       para             leitura          do       arquivo         (r  −r e a d e )
     a r q S=f o p e n ( a r g v [ 2 ] , w ) ; // a r q S                                       é       para             escrever             no       arquiv         (w  −w r i t e )
     /   ∗       Obs . :           argc           é   um        inteiro               que         indica                   a    quantidade                de       a r g u m e n t o s ∗/
     /   ∗       argv          é    um           ponteiro               do       tipo            char             onde :         argv [ 0 ]          é    o    nome      do       arquivo
                 executável ,
20   arqv [ 1 ]                é     o       primeiro               argumento ,                       que             no       caso       é    entrada . t x t           e    o    arqgv
                 [2]          é     o    segundo                argumento ,                      que          no          caso       é    saida . t x t            ∗/

                               −−−−−−−−                                                                       −−−−−−−−|n  n  ) ;
     if
     p r i n t f ( |                                       Mundo            Dos         Blocos
             ( ( ! arqE ) | | ( ! a r q S ) )                       /   ∗    Caso            não          seja             encontrado                os       arquivos ,           será
                 impresso                    uma       mensagem                  de          erro         ∗/
             p r i n t f (  Erro                     ao    encontrar                    os       arquivos :                    %s        e %s  n  , a r g v [ 1 ] , a r g v [ 2 ] ) ;
25
     else             /   ∗    Caso              contrário ,                 o       programa                     fará          as    outras             instruções               ∗/
     {

             c a r a c=g e t c ( a r q E ) ; /                  ∗       carac            recebe                   os       caracteres                contidos            no       arquivo ,
                                                           ∗/
             while
                          um        por          vez
                              ( c a r a c !=EOF) /              ∗       Enquando                  não             chegar             no       final       do       arquivo :           End          Of
                          File           as          instruções                  contidas                     no          while          serão       executadas               ∗/
30           {



                  while
                  j =0;

                                   ( ( c a r a c ! = 3 2 ) ( c a r a c !=EOF) ( c a r a c ! = 1 0 ) )                                                 ∗
                                                                                                                                                         / Em ASCII               32    é       o
                              space              e    10    é    o      0       que          indica                  o    final          da     string            ∗/
                  {

                          word [ i ] [ j ]= c a r a c ;

35                        j ++;

                          c a r a c=g e t c ( a r q E ) ;                    /   ∗    carac               recebe                os       caracteres                contidos            no
                                    arquivo ,               um       por         vez          ∗/
                  }

                  word [ i ] [ j ]= ' 0 ' ;



                  if
                  i ++;

40                        ( ( c a r a c ==10) | | ( c a r a c= EOF) )
                                                              =                                               /   ∗    Caso          carac       seja          igual         ao    fim          da
                              string ,                que       no      caso             é   o     final                  da    linha          ou    chegue             no   final          do
                              arquivo                 qnt       recebe               a       conversão                     de    string             para       inteiro ,
                              convertendo                   −a       em      numeral                  ∗/

                          if
                  {

                                  ( ( word [ 0 ] [ 0 ]  4 8 ) (word [ 0 ] [ 0 ]  5 8 ) )

                          {

                               q n t= a t o i ( word [ 0 ] ) ;

45                             C r i a r ( p b l o c o , q n t ) ;                      /   ∗    qnt             é    a       quantidade                de    blocos         a    serem
                                         criados                lidos            do          arquivo                  de       entrada          ∗/

                          else
                          }

                                         /   ∗   Com        isso            será         pulada                   a    linha          ∗/

                            if
                          {

                                     ( ( word [ 1 ] [ 0 ]  4 8 ) (word [ 1 ] [ 0 ]  5 8 ) )

50
                            if
                                     a= a t o i ( word [ 1 ] ) ;

                                     ( ( word [ 3 ] [ 0 ]  4 8 ) (word [ 3 ] [ 0 ]  5 8 ) )

                                     b= a t o i ( word [ 3 ] ) ;




                                                                                                          8
if   ( word [ 0 ] [ 0 ] = = 'm ' )



                               if
                          {

55                                  ( ( word [ 2 ] [ 0 ] = = ' o ' ) (word [ 2 ] [ 1 ] = = ' v ' ) )                                     /   ∗   Será       lido       cada
                                        caracter                  até        montar          uma          string ,           nesse          caso ,       se    for       'm'=
                                        move           e        o v= o v e r ,         será         executada               a       função           MoveOver          ∗/

                               else
                                    MoveOver( p b l o c o ,                         a ,     b) ;

                                           /   ∗   Do           contrário ,                MoveOnto              ∗/
                                    MoveOnto( p b l o c o ,                         a ,     b) ;



                          else if
                          }

60                                         ( word [ 0 ] [ 0 ] = = ' p ' )



                            if
                          {

                                    ( ( word [ 2 ] [ 0 ] = = ' o ' ) (word [ 2 ] [ 1 ] = = ' v ' ) )                                     /   ∗   Será       lido       cada
                                        caracter                  até        montar          uma          string ,           nesse          caso ,       se    for       ' p '=
                                        pilee              e     o v= o v e r ,            será         executada               a       função        PileOver          ∗/

                               else
                                    P i l e O v e r ( p b l o c o ,                 a ,     b) ;

                                           /   ∗   Do           contrário ,                PileOnto              ∗/
65                                  P i l e O n t o ( p b l o c o ,                 a ,     b) ;



                          else if
                          }

                                           ( word [ 0 ] [ 0 ] = = ' q ' )                    /   ∗   Quando           or      lido ,           por     final ,       o
                                   caracter                    'q ' ,    implicará                   no    final            das       intruções           contidas
                                   no     arquivo ,                  então ,         a       partir           de    agora             o    programa           fará       as
                                   operações ,                    gerando            um       arquivo              de       saída         com      a    solução          do
                                   problema                    proposto ,            ou       seja ,          com       o    resultado                 esperado          ∗/

                               for
                          {

                                        ( j = 0 ; j q n t ; j ++)               /   ∗     Agora          a     lista         será         percorrida            até       que
                                          o    próximo                  elemento              aponte            para        NULL,           gravando           no
                                        arquivo                 de      saída        o       resultado              esperado                ∗/
70                             {

                                    paux=p b l o c o . v e t l i s t a [ j ] . p P r i m e i r o                            −p P r o x ;

                                    while
                                    f p r i n t f ( arqS ,                   %d :        , j ) ;
                                                   ( paux !=NULL)

                                    {

75                                       f p r i n t f ( arqS ,                 %d         , paux      −
                                                                                                     num ) ;

                                         paux          = paux           −p P r o x ;
                                    }

                                    f p r i n t f ( arqS ,                    n ) ;
                               }

80                             f c l o s e ( arqE ) ;                /   ∗    Por        final ,          arqE        e     arqS          são      fechados          ∗/
                               f c l o s e ( arqS ) ;



                          else
                          }



                          {

85                             p r i n t f ( Não                 foi        localizado               o       [ q u i t ]  n ) ;
                          }

                 }

                 i =0;

             }

90           c a r a c=g e t c ( a r q E ) ;

         }



         p r i n t f (  nArquivo                         de      saida ,           %s ,        gerado          com        s u c e s s o ! ! !  n , a r g v [ 2 ] ) ;
                 /   ∗    Por       final ,                caso         tudo      ocorra              bem ,        será       impresso                 essa    msg
                 informando                    ao          usuário             que       o    arquivo              de       saida          foi     gerado       com
                 sucesso                com        o       resultado              esperado                 por      ele       ∗/
     }

95


     return
     s y s t e m ( PAUSE ) ;

                         0;




                                                                                             9
}


                                                    Programa 14: Main


     2.2.1       Função STDAFX.H

         No stdafx.h foi incluido todos os arquivos .h que serão usados pelo programa, os
     .h estão listados no programa abaixo:
     #pragma         once



     #include
     #include
                      t a r g e t v e r . h


     #include
                      s t d i o . h

 5
     #include
                      t c h a r . h



     #include
                      s t d l i b . h

                      TBloco . h 




10   /   ∗   Todas    as    eferências          adicionais   dos   programas   foram   colocadas   no
             stdafx .h      ∗/

                                                   Programa 15: Stdafx


     3        Análise de complexidade dos algoritmos
             Considerando todas por comparação e no pior caso:

     3.1 Função Volta

                                                 T (n) = 1 + T (n)T (0) = 0                             (1)

     O(n)

     3.2 Função PileOver

                                                         f (n) = 5                                      (2)

     O(5)

     3.3 Função MoveOver

                                                         f (n) = 5                                      (3)

     O(5)




                                                             10
3.4 Função PileOnto

                              f (n) = 5                  (4)

O(5)

3.5 Função start
                                       n−1
                      f (n) = 1 +            1=n         (5)
                                       i=0

O(n)

3.6 Função MoveOnto

                              f (n) = 6                  (6)

O(6)

3.7 Função Imprime
                                  n−1
                       f (n) =          1=n              (7)
                                  i=0

O(n)

3.8 Função Busca
                             n−1 n−1 n
                   f (n) =                   1 = n3 /2   (8)
                             i=0 i=0 i=0

O(n3 )

3.9 Função Criar
                                  n−1
                       f (n) =          1=n              (9)
                                  i=0

O(n)




                                  11
4    Testes
    Alguns testes com o programa:
    Argumentos: entrada.txt saida.txt




                             Figura 1: Argumentos

    Comando: TP2AEDSI-JOHN.exe entrada.txt johnnatan.txt




                               Figura 2: Comando

                                        12
Arquivo de entrada: entrada.txt




                      Figura 3: Arquivo de entrada

Execução do comando




                     Figura 4: Execuxão do comando

Arquivo de saída: johnnatan.txt




                                  13
Figura 5: Arquivo de saída

5    Conclusão
    Neste trabalho foram revistos conceitos sobre alocação dinâmica, TAD(Tipos
Abstratos de Dados), listas encadeadas, argumentos argv, argc, pratica de edição
              A
de textos em LTEX, bem como o melhor entendimento sobre ordem de complexidade
e maturidade na linguagem C. A maior diculdade foi a abstração para a resolução
do problema proposto, mas, uma vez que entendido o que se pede, tornou-se simples
a implementação. Muito dos algoritmos são extraídos de [?].


Referências
[1] David Menotti     Algoritmos e Estruturas de Dados I: Listas En-
    cadeadas.    http://www.decom.ufop.br/prof/menotti/aedI092/slides/
    aula09-10-ListaEnc.ppt, visitado em 03/10/2009.
[2] Márcio Santi Wikipédia, 2009       http://pt.wikipedia.org/wiki/Lista_
    ligada/, visitado em 01/10/2009.
[3] Aldrovando Luís Azeredo Araújo Os Argumentos argc e argv, 1999. http://www.
    mtm.ufsc.br/~azeredo/cursoC/aulas/c790.html, visitado em 30/08/2009.
[4] Paulo Feolof Projeto de Algoritmos: Listas Encadeadas, 2009 http://www.
    ime.usp.br/~pf/algoritmos/aulas/lista.html, visitado em 28/09/2009.




                                       14

Contenu connexe

Tendances (12)

Guide por
Guide porGuide por
Guide por
 
Precalculo pt
Precalculo ptPrecalculo pt
Precalculo pt
 
Tutorial de Uppaal
Tutorial de UppaalTutorial de Uppaal
Tutorial de Uppaal
 
Instalei o Ubuntu e agora? (18.04)
Instalei o Ubuntu e agora? (18.04)Instalei o Ubuntu e agora? (18.04)
Instalei o Ubuntu e agora? (18.04)
 
Focalinux iniciante
Focalinux inicianteFocalinux iniciante
Focalinux iniciante
 
Apostila juliano eme905
Apostila juliano eme905Apostila juliano eme905
Apostila juliano eme905
 
O fantc3a1stico-mundo-da-linguagem-c
O fantc3a1stico-mundo-da-linguagem-cO fantc3a1stico-mundo-da-linguagem-c
O fantc3a1stico-mundo-da-linguagem-c
 
Ubuntu guia_do_iniciante
Ubuntu guia_do_inicianteUbuntu guia_do_iniciante
Ubuntu guia_do_iniciante
 
Foca linux 1
Foca linux 1Foca linux 1
Foca linux 1
 
Abc do linux
Abc do linuxAbc do linux
Abc do linux
 
Handbook de ti para concursos – o guia definitivo
Handbook de ti para concursos – o guia definitivoHandbook de ti para concursos – o guia definitivo
Handbook de ti para concursos – o guia definitivo
 
Apostila de computação gráfica (2006)
Apostila de computação gráfica (2006)Apostila de computação gráfica (2006)
Apostila de computação gráfica (2006)
 

En vedette (6)

Fec
FecFec
Fec
 
If672cc mp1 sol
If672cc mp1 solIf672cc mp1 sol
If672cc mp1 sol
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem C
 
POO - 18 - Sobrecarga e Sobreposição de Métodos
POO - 18 - Sobrecarga e Sobreposição de MétodosPOO - 18 - Sobrecarga e Sobreposição de Métodos
POO - 18 - Sobrecarga e Sobreposição de Métodos
 
Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06Estrutura de Dados - Aula 06
Estrutura de Dados - Aula 06
 
Linked list
Linked listLinked list
Linked list
 

Similaire à Lista Encadeada - TP2_AEDSI

Apostila de Robotica
Apostila de RoboticaApostila de Robotica
Apostila de Robotica
Isvaldo Souza
 
Curso de robotica movel
Curso de robotica movelCurso de robotica movel
Curso de robotica movel
Ribeiro Baieta
 
Aula 3 com propostas
Aula 3 com propostasAula 3 com propostas
Aula 3 com propostas
nehos
 
Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)
Robson Silva Espig
 
Apostila c# iniciantes
Apostila c# iniciantesApostila c# iniciantes
Apostila c# iniciantes
Caique Moretto
 
Livro Foca linux
Livro Foca linuxLivro Foca linux
Livro Foca linux
SoftD Abreu
 

Similaire à Lista Encadeada - TP2_AEDSI (20)

Manual de portugol
Manual de portugolManual de portugol
Manual de portugol
 
Fortran_95_curso_basico_Editora_XXX.pdf
Fortran_95_curso_basico_Editora_XXX.pdfFortran_95_curso_basico_Editora_XXX.pdf
Fortran_95_curso_basico_Editora_XXX.pdf
 
Apostila de Robotica
Apostila de RoboticaApostila de Robotica
Apostila de Robotica
 
Curso de robotica movel
Curso de robotica movelCurso de robotica movel
Curso de robotica movel
 
Poojava
PoojavaPoojava
Poojava
 
Poojava
PoojavaPoojava
Poojava
 
Apostila de Java: Orientação a Objetos
Apostila de Java: Orientação a ObjetosApostila de Java: Orientação a Objetos
Apostila de Java: Orientação a Objetos
 
Scilab programacao
Scilab programacaoScilab programacao
Scilab programacao
 
Aula 3 com propostas
Aula 3 com propostasAula 3 com propostas
Aula 3 com propostas
 
Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)
 
Apostila c# iniciantes
Apostila c# iniciantesApostila c# iniciantes
Apostila c# iniciantes
 
Manual do Kile
Manual do KileManual do Kile
Manual do Kile
 
Apostila JSF 2.0 - K19
Apostila JSF 2.0 - K19Apostila JSF 2.0 - K19
Apostila JSF 2.0 - K19
 
1
11
1
 
Livro Foca linux
Livro Foca linuxLivro Foca linux
Livro Foca linux
 
Foca iniciante
Foca inicianteFoca iniciante
Foca iniciante
 
Apostila geo gebra
Apostila geo gebraApostila geo gebra
Apostila geo gebra
 
Curso C
Curso CCurso C
Curso C
 
Mnl gp015
Mnl gp015Mnl gp015
Mnl gp015
 
Manual gps tracker 7, multilaser gp015
Manual gps tracker 7, multilaser  gp015Manual gps tracker 7, multilaser  gp015
Manual gps tracker 7, multilaser gp015
 

Plus de Johnnatan Messias

Monografia: Framework Para Sistemas de Navegação de Veículos Aéreos Não Tripu...
Monografia: Framework Para Sistemas de Navegação de Veículos Aéreos Não Tripu...Monografia: Framework Para Sistemas de Navegação de Veículos Aéreos Não Tripu...
Monografia: Framework Para Sistemas de Navegação de Veículos Aéreos Não Tripu...
Johnnatan Messias
 
Twitter and Youtube Collector
Twitter and Youtube CollectorTwitter and Youtube Collector
Twitter and Youtube Collector
Johnnatan Messias
 
Análise de Disco, I/O e Processamento
Análise de Disco, I/O e ProcessamentoAnálise de Disco, I/O e Processamento
Análise de Disco, I/O e Processamento
Johnnatan Messias
 
Avaliação de Usabilidade, Comunicabilidade e Acessibilidade - Quadro de Avisos
Avaliação de Usabilidade, Comunicabilidade e Acessibilidade - Quadro de AvisosAvaliação de Usabilidade, Comunicabilidade e Acessibilidade - Quadro de Avisos
Avaliação de Usabilidade, Comunicabilidade e Acessibilidade - Quadro de Avisos
Johnnatan Messias
 

Plus de Johnnatan Messias (10)

AI - Backtracking vs Depth-First Search (DFS)
AI - Backtracking vs Depth-First Search (DFS)AI - Backtracking vs Depth-First Search (DFS)
AI - Backtracking vs Depth-First Search (DFS)
 
MyShell - English
MyShell - EnglishMyShell - English
MyShell - English
 
Monografia: Framework Para Sistemas de Navegação de Veículos Aéreos Não Tripu...
Monografia: Framework Para Sistemas de Navegação de Veículos Aéreos Não Tripu...Monografia: Framework Para Sistemas de Navegação de Veículos Aéreos Não Tripu...
Monografia: Framework Para Sistemas de Navegação de Veículos Aéreos Não Tripu...
 
Twitter and Youtube Collector
Twitter and Youtube CollectorTwitter and Youtube Collector
Twitter and Youtube Collector
 
Análise de Disco, I/O e Processamento
Análise de Disco, I/O e ProcessamentoAnálise de Disco, I/O e Processamento
Análise de Disco, I/O e Processamento
 
Quadro de Avisos - IHC
Quadro de Avisos - IHCQuadro de Avisos - IHC
Quadro de Avisos - IHC
 
Avaliação de Usabilidade, Comunicabilidade e Acessibilidade - Quadro de Avisos
Avaliação de Usabilidade, Comunicabilidade e Acessibilidade - Quadro de AvisosAvaliação de Usabilidade, Comunicabilidade e Acessibilidade - Quadro de Avisos
Avaliação de Usabilidade, Comunicabilidade e Acessibilidade - Quadro de Avisos
 
Simulador Funcional
Simulador FuncionalSimulador Funcional
Simulador Funcional
 
Cálculo Numérico: Integração Numérica com Bubble Sort
Cálculo Numérico: Integração Numérica com Bubble SortCálculo Numérico: Integração Numérica com Bubble Sort
Cálculo Numérico: Integração Numérica com Bubble Sort
 
Cálculo Numérico: Interpolação Polinomial com Bubble Sort
Cálculo Numérico: Interpolação Polinomial com Bubble SortCálculo Numérico: Interpolação Polinomial com Bubble Sort
Cálculo Numérico: Interpolação Polinomial com Bubble Sort
 

Dernier

Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
TailsonSantos1
 
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
LeloIurk1
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
FabianeMartins35
 
matematica aula didatica prática e tecni
matematica aula didatica prática e tecnimatematica aula didatica prática e tecni
matematica aula didatica prática e tecni
CleidianeCarvalhoPer
 
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffffSSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
NarlaAquino
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
rosenilrucks
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
RavenaSales1
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
WagnerCamposCEA
 
Slide - EBD ADEB 2024 Licao 02 2Trim.pptx
Slide - EBD ADEB 2024 Licao 02 2Trim.pptxSlide - EBD ADEB 2024 Licao 02 2Trim.pptx
Slide - EBD ADEB 2024 Licao 02 2Trim.pptx
edelon1
 

Dernier (20)

Modelo de Plano Plano semanal Educação Infantil 5 anossemanal Educação Infant...
Modelo de Plano Plano semanal Educação Infantil 5 anossemanal Educação Infant...Modelo de Plano Plano semanal Educação Infantil 5 anossemanal Educação Infant...
Modelo de Plano Plano semanal Educação Infantil 5 anossemanal Educação Infant...
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
 
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfPROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
 
Aula sobre o Imperialismo Europeu no século XIX
Aula sobre o Imperialismo Europeu no século XIXAula sobre o Imperialismo Europeu no século XIX
Aula sobre o Imperialismo Europeu no século XIX
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
 
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia TecnologiaPROJETO DE EXTENSÃO I - Radiologia Tecnologia
PROJETO DE EXTENSÃO I - Radiologia Tecnologia
 
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
2° ANO - ENSINO FUNDAMENTAL ENSINO RELIGIOSO
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
 
matematica aula didatica prática e tecni
matematica aula didatica prática e tecnimatematica aula didatica prática e tecni
matematica aula didatica prática e tecni
 
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffffSSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
SSE_BQ_Matematica_4A_SR.pdfffffffffffffffffffffffffffffffffff
 
apostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médioapostila projeto de vida 2 ano ensino médio
apostila projeto de vida 2 ano ensino médio
 
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptxSlides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
 
Seminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptxSeminário Biologia e desenvolvimento da matrinxa.pptx
Seminário Biologia e desenvolvimento da matrinxa.pptx
 
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdfGEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
GEOGRAFIA - COMÉRCIO INTERNACIONAL E BLOCOS ECONÔMICOS - PROF. LUCAS QUEIROZ.pdf
 
P P P 2024 - *CIEJA Santana / Tucuruvi*
P P P 2024  - *CIEJA Santana / Tucuruvi*P P P 2024  - *CIEJA Santana / Tucuruvi*
P P P 2024 - *CIEJA Santana / Tucuruvi*
 
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdfPROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
 
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
 
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdfReta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
Reta Final - CNU - Gestão Governamental - Prof. Stefan Fantini.pdf
 
Antero de Quental, sua vida e sua escrita
Antero de Quental, sua vida e sua escritaAntero de Quental, sua vida e sua escrita
Antero de Quental, sua vida e sua escrita
 
Slide - EBD ADEB 2024 Licao 02 2Trim.pptx
Slide - EBD ADEB 2024 Licao 02 2Trim.pptxSlide - EBD ADEB 2024 Licao 02 2Trim.pptx
Slide - EBD ADEB 2024 Licao 02 2Trim.pptx
 

Lista Encadeada - TP2_AEDSI

  • 1. Universidade Federal de Ouro Preto Instituto de Ciências Exatas e Biológicas Departamento de Computação ALGORITMOS E ESTRUTURAS DE DADOS Segundo Trabalho Prático Johnnatan Messias Peixoto Afonso Professor - David Menotti Monitor - Kayran dos Santos Ouro Preto 6 de outubro de 2009
  • 2. Sumário 1 Introdução 1 1.1 Considerações iniciais . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Especicação do problema . . . . . . . . . . . . . . . . . . . . . . . . 1 2 Algoritmo e estruturas de dados 1 2.1 TAD - TBloco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2.1.1 Assinatura das funções . . . . . . . . . . . . . . . . . . . . . . 2 2.1.2 Função Vazio . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.3 Função LehVazio . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.4 Função Insere . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.5 Função Volta . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.6 Função PileOver . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.7 Função MoveOver . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1.8 Função PileOnto . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1.9 Função MoveOnto . . . . . . . . . . . . . . . . . . . . . . . . 5 2.1.10 Função Imprime . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1.11 Função Busca . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.1.12 Função Criar . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2.1 Função STDAFX.H . . . . . . . . . . . . . . . . . . . . . . . . 10 3 Análise de complexidade dos algoritmos 10 3.1 Função Volta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2 Função PileOver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.3 Função MoveOver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.4 Função PileOnto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.5 Função start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.6 Função MoveOnto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.7 Função Imprime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.8 Função Busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.9 Função Criar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 4 Testes 12 5 Conclusão 14 Lista de Figuras 1 Argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2 Comando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3 Arquivo de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4 Execuxão do comando . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5 Arquivo de saída . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2
  • 3. Lista de Programas 1 TVetor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 Assinaturas do TBloco.h . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 Vazio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 LehVazio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 Insere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 6 Volta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 7 PileOver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 8 MoveOver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 9 PileOnto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 10 Move Onto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 11 Imprime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 12 Busca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 13 Criar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 14 Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 15 Stdafx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3
  • 4. 1 Introdução Este trabalho consiste na implementação do TAD (Tipo Abstrato de Dados) TBloco para representar as listas encadeadas dos blocos para representarmos o Mundo dos Blocos com as implementações das funções. 1.1 Considerações iniciais • Além das explicações citadas acima das funções, favor considerar também os comentários contidos no programa. • Ambiente de desenvolvimento do código fonte: Microsoft Visual Studio 2008 Professional. • Linguagem utilizada: Linguagem C. • Ambiente de desenvolvimento da documentação: TeXnicCenter 1.0 SRC-Editor A de LTEX. 1.2 Especicação do problema Várias áreas da ciência da computação usam domínios simplicados para abstrair diversos tipos de problemas. Por exemplo, algumas das primeiras pesquisas de inteligência articial nas áreas de planejamento e robótica eram feitas utilizando o mundo dos blocos, no qual um braço robótico realizava tarefas simuladas envolvendo a manipulação de blocos [2]. Nesse trabalho você vai implementar um mundo de blocos bem simples [3], que vai funcionar de acordo com certas regras e obedecer comandos de movimentação de blocos dados pelo usuário, simulando o que seria a manipulação através um braço robótico. O seu mundo de blocos começa com cada bloco na sua posição inicial, e depois de uma série de comandos deve terminar em uma conguração nal. Os comandos possíveis para a manipulação do mundo de blocos são: • move a onto b: Move o bloco a para cima do bloco b retornando eventuais blocos que já estiverem sobre a ou b para as suas posições originais. • move a over b: Coloca o bloco a no topo do monte onde está o bloco b retornando eventuais blocos que já estiverem sobre a às suas posições originais. • pile a onto b: Coloca o bloco a juntamente com todos os blocos que estiverem sobre ele em cima do bloco b, retornando eventuais blocos que já estiverem sobre b as suas posições originais. • pile a over b: Coloca o bloco a juntamente com todos os blocos que estiverem sobre ele sobre o monte que contem o bloco b. 2 Algoritmo e estruturas de dados Foi criado um TAD, Tipo Abstrato de Dados para representar as listas en- cadeadas, bem como a quantidade de blocos e de listas encadeadas e também um apontador para os blocos. 1
  • 5. 2.1 TAD - TBloco Para representar as listas encadeadas e os blocos foi criado um TAD TBloco.h typedef struct Bloco ∗ Apontador ; / ∗ Apontador para a estrutura TBloco ∗/ typedef struct do tipo Bloco Bloco int { num ; 5 Apontador pProx ; / ∗ Apontador pProx ; ∗/ } TBloco ; / ∗ Blocos : Célula ∗/ typedef struct { 10 Apontador pPrimeiro ; / ∗ Apontador para o primeiro da lista ∗/ Apontador pUltimo ; / ∗ Apontador para o último da lista ∗/ } TLista ; / ∗ Lista dos blocos ∗/ typedef struct 15 { ∗vetlista int TLista ; tamanho ; } TVetlista ; / ∗ Estrutura dos vetores de listas encadeadas ∗/ Programa 1: TVetor 2.1.1 Assinatura das funções Abaixo as assinaturas do TBloco.h. void Vazio ( TLista ∗) ; / ∗ Assinatura da função Vazio para criar uma ∗/ void int lista vazia Criar ( TVetlista ∗, numero ) ; / ∗ A s s i n a t u r a da f u n ç ã o C r i a r p a r a ∗ / // q n t d e l i s t a e n c a d e a d a s double criar lista encadeada L e h V a z i o ( T L i s t a ∗ ) ; / ∗ A s s i n a t u r a da f u n ç ã o L e h V a z i o p a r a v e r i f i c a r s e a l i s t a é ou não v a z i a ∗ / void I n s e r e ( TLista ∗ , int ) ; / ∗ A s s i n a t u r a da f u n ç ã o I n s e r e p a r a inserir um b l o c o com um c o n t e ú d o a uma p o s i ç ã o a p o n t a d a ∗ / 5 void I m p r i m e ( T L i s t a ∗ ) ; / ∗ A s s i n a t u r a da f u n ç ã o Imprime q u e i m p r i m e ATENÇÃO ∗ / Apontador Busca ( T V e t l i s t a ∗ , , Apontador ∗ , int ∗ ) ; / ∗ A s s i n a t u r a da int função Busca para receber uma lista encadeada e inserir na lista ∗/ void int int um bloco antes de uma determinada posição MoveOnto ( T V e t l i s t a ∗, , ) ; / ∗ Assinatura da função Move ∗/ void int int Onto PileOver ( TVetlista ∗, , ) ; / ∗ Assinatura da função Pile ∗/ void int int Over MoveOver ( T V e t l i s t a ∗, , ) ; / ∗ Assinatura da função Move ∗/ void int int Over 10 PileOnto ( TVetlista ∗, , ) ; / ∗ Assinatura da função Pile ∗/ void Onto Volta ( TVetlista ∗ , Apontador ) ; / ∗ Assinatura da função que volta os blocos de acordo com as operações de Pile ou Move ∗/ Programa 2: Assinaturas do TBloco.h 2
  • 6. 2.1.2 Função Vazio Essa função é chamada pela função Criar, criando uma lista encadeada vazia, fazendo uma alocação dinâmica (malloc) onde o último da lista passa a ser o primeiro e o primeiro aponta para o próximo bloco da lista recebendo NULL. void Vazio ( TLista ∗plista ) / ∗ Essa função é chamada pela função Criar , criando uma lista encadeada vazia ∗/ sizeof { plista −p P r i m e i r o = ( A p o n t a d o r ) m a l l o c ( ( Bloco ) ) ; plista −p U l t i m o = p l i s t a −p P r i m e i r o ; 5 plista −p P r i m e i r o −p P r o x = NULL ; } Programa 3: Vazio 2.1.3 Função LehVazio Essa função verica se a lista é vazia, caso o primeiro da lista seja igual ao último ela retornará 1, caso contrário, 0. Obs.: Essa função não foi usada no programa pois é muito caro chamar uma função, não sendo, portanto, viável a sua utilização uma vez que pode ser facilmente implementado os comandos contidos nela em outras funções. double LehVazio ( TLista ∗plista ) / ∗ Essa função verifica se a lista encadeada é vazia ∗/ return { ( plista −p P r i m e i r o == plista −p U l t i m o ) ; } Programa 4: LehVazio 2.1.4 Função Insere Após criar uma lista vazia, usamos essa função para inserir novos elementos na lista encadeada, mas deve-se alocar dinamicamente (malloc) a memória para armazenar o elemento. void I n s e r e ( TLista ∗ plista , int numero ) / ∗ Essa função insere um novo bloco em uma lista encadeada ∗/ sizeof { plista −p U l t i m o −p P r o x = ( A p o n t a d o r ) m a l l o c ( ( TBloco ) ) ; / ∗ plista −p U l t i m o −p P r o x r e c e b e r e c e b e a q u a n t i d a d e e bytes alocado ∗/ plista −p U l t i m o = p l i s t a − p U l t i m o −p P r o x ; 5 plista −p U l t i m o − num = numero ; plista −p U l t i m o −p P r o x = NULL ; } Programa 5: Insere 2.1.5 Função Volta Essa função é responsável por voltar os blocos à suas posições originais após as operações as operações de pilo e onto na execução do programa. Caso o apontador seja NULL ele retorna, caso contrário, o primeiro da lista aponta para o próximo 3
  • 7. que recebe p, em seguida o último da lista também recebe p. Fará isso até que p seja NULL, em seguida executará a próxima instrução que seria: p-pProx=NULL. void Volta ( TVetlista ∗ pbloco , Apontador p) / ∗ Função para voltar os blocos depois das operações de M V O E e PILE ∗/ if { return ( p= NULL) = ; 5 pbloco − v e t l i s t a [ p−num ] . p P r i m e i r o −p P r o x=p ; p b l o c o − v e t l i s t a [ p− num ] . p U l t i m o=p ; V o l t a ( p b l o c o , p− p P r o x ) ; / ∗ R e c u r s i v i d a d e : E n q u a n t o − p p P r o x for igual a NULL a função será chamada , caso contrário , executa a instrução abaixo : − p p P r o x=NULL ; ∗/ − p p P r o x=NULL ; } Programa 6: Volta 2.1.6 Função PileOver Coloca um bloco a juntamente com todos os blocos que estiverem sobre ele sobre o monte que contem um bloco b. void PileOver ( TVetlista ∗ pbloco , int A, int B) / ∗ Coloca um bloco a juntamente com todos os blocos que estiverem sobre ele sobre o monte que contem um bloco b. ∗/ { int Apontador pantA , pantB , pA , pB ; 5 if listaA , listaB ; return (A = = B) ; pA=B u s c a ( p b l o c o , A, pantA , l i s t a A ) ; if pB=B u s c a ( p b l o c o , B, pantB , l i s t a B ) ; 10 return ( ( pA = = NULL) | | ( pB = = NULL) | | ( l i s t a A==l i s t a B ) ) while − ; ( pB p P r o x !=NULL) { − pB=pB p P r o x ; 15 } − pB p P r o x=pA ; pantA −p P r o x=NULL ; pbloco − v e t l i s t a [ l i s t a B ] . p U l t i m o=pA ; } Programa 7: PileOver 2.1.7 Função MoveOver Coloca um bloco a no topo do monte onde está um bloco b retornando eventuais blocos que já estiverem sobre a às suas posições originais. void MoveOver ( T V e t l i s t a ∗ pbloco , int A, int B) / ∗ Coloca um bloco a no topo do monte onde está um bloco b retornando eventuais blocos que já estiverem sobre a às suas posições originais ∗/ { int Apontador pantA , pantB , pA , pB ; 5 listaA , listaB ; 4
  • 8. if return (A = = B) ; pA=B u s c a ( p b l o c o , A, pantA , l i s t a A ) ; if pB=B u s c a ( p b l o c o , B, pantB , l i s t a B ) ; 10 return ( ( pA = = NULL) | | ( pB = = NULL) | | ( l i s t a A==l i s t a B ) ) if − ; ( pA p P r o x !=NULL) { − V o l t a ( p b l o c o , pA p P r o x ) ; 15 − pA p P r o x=NULL ; pbloco − v e t l i s t a [ l i s t a A ] . p U l t i m o=pA ; } − pB p P r o x=pA ; pantA −p P r o x=NULL ; 20 pbloco − v e t l i s t a [ l i s t a B ] . pUltimo −p P r o x=pA ; } Programa 8: MoveOver 2.1.8 Função PileOnto Coloca um bloco a juntamente com todos os blocos que estiverem sobre ele sobre o monte que contem um bloco b. void PileOnto ( TVetlista ∗ pbloco , int A, int B) / ∗ Coloca um bloco a juntamente com todos os blocos que estiverem sobre ele sobre o monte que contem um bloco b. ∗/ { int Apontador pantA , pantB , pA , pB ; 5 if listaA , listaB ; return (A = = B) ; pA=B u s c a ( p b l o c o , A, pantA , l i s t a A ) ; if pB=B u s c a ( p b l o c o , B, pantB , l i s t a B ) ; 10 return ( ( pA = = NULL) | | ( pB = = NULL) | | ( l i s t a A==l i s t a B ) ) if − ; ( pB p P r o x !=NULL) { − V o l t a ( p b l o c o , pB p P r o x ) ; 15 − pB p P r o x=NULL ; pbloco − v e t l i s t a [ l i s t a B ] . p U l t i m o=pB ; } − pB p P r o x=pA ; pantA −p P r o x=NULL ; 20 pbloco − v e t l i s t a [ l i s t a B ] . p U l t i m o=pA ; } Programa 9: PileOnto 2.1.9 Função MoveOnto Move um bloco a para cima do bloco b retornando eventuais blocos que já es- tiverem sobre a ou b para as suas posições originais. void MoveOnto ( T V e t l i s t a ∗ pbloco , int A, int B) / ∗ Move um bloco a para cima do bloco b retornando eventuais blocos que já estiverem sobre a ou b para as suas posições originais . ∗/ 5
  • 9. { int Apontador pantA , pantB , pA , pB ; 5 if listaA , listaB ; return (A = = B) ; pA=B u s c a ( p b l o c o , A, pantA , l i s t a A ) ; if pB=B u s c a ( p b l o c o , B, pantB , l i s t a B ) ; 10 return ( ( pA = = NULL) | | ( pB = = NULL) | | ( l i s t a A==l i s t a B ) ) if − ; ( pA p P r o x !=NULL) { − V o l t a ( p b l o c o , pA p P r o x ) ; 15 − pA p P r o x=NULL ; pbloco − v e t l i s t a [ l i s t a A ] . p U l t i m o=pA ; if } − ( pB p P r o x !=NULL) { 20 − V o l t a ( p b l o c o , pB p P r o x ) ; − pB p P r o x=NULL ; pbloco − v e t l i s t a [ l i s t a B ] . p U l t i m o=pB ; } − pB p P r o x=pA ; 25 pantA −p P r o x=NULL ; pbloco − v e t l i s t a [ l i s t a B ] . p U l t i m o=pA ; } Programa 10: Move Onto 2.1.10 Função Imprime Função que percorre a lista até que o próximo elemento aponte para NULL, imprimindo os valores. void Imprime ( T L i s t a ∗plista ) / ∗ Função que percorre a lista até que o próximo elemento aponte para NULL, imprimindo os valores ∗/ { Apontador paux ; −p P r i m e i r o −p P r o x ; while paux= p l i s t a 5 ( paux !=NULL) { p r i n t f ( %d , paux− num ) ; paux = paux −p P r o x ; } 10 } Programa 11: Imprime 2.1.11 Função Busca Essa função verica se o elemento está na lista, caso esteja, teremos como retorno um ponteiro que no caso representa o elemento, caso contrário, retornará NULL. Apontador Busca ( T V e t l i s t a ∗ pblocos , int numero , A p o n t a d o r ∗ pant , int ∗ pla / ∗ Ponteiro de inteiro pra lista dele ∗/ ) int { i ; Apontador paux ; 6
  • 10. 5 for ( i = 0 ; i p b l o c o s −tamanho ; i ++) / ∗ Laço de repetição até que o i seja menor que o o número de listas encadeadas ∗/ { paux=p b l o c o s − v e t l i s t a [ i ] . pPrimeiro −p P r o x ; ∗ p a n t=p b l o c o s − v e t l i s t a while [ i ] . pPrimeiro ; ( paux !=NULL) 10 if { ( paux −num==numero ) { ∗ p l a= i return ; paux ; 15 } ∗ p a n t=paux ; paux=paux− p P r o x ; } } 20 ∗ p l a =−1; / ∗ ∗/ return Lista q contem num q não existe NULL ; } Programa 12: Busca 2.1.12 Função Criar Essa a função responsável por criar a lista encadeada, ela chama a função Vazio para criar uma lista vazia e depois chama a função Insere para inserir os elementos nos blocos. void Criar ( TVetlista ∗ blocos , int numero ) / ∗ Essa a função responsável por criar a lista encadeada , ela chama a função Vazio para criar uma lista vazia e depois chama a função Insere para inserir os elementos nos blocos ∗/ int { sizeof i ; blocos − v e t l i s t a = ( T L i s t a ∗ ) m a l l o c ( ( TLista ) ∗ numero ) ; 5 −tamanho = numero ; for blocos ( i = 0 ; i numero ; i ++) { V a z i o (( b l o c o s − v e t l i s t a [ i ]) ) ; I n s e r e ( b l o c o s − v e t l i s t a [ i ] , i ) ; 10 } } Programa 13: Criar 2.2 Main Programa Main abaixo: // − TP2AEDSI JOHN . c p p : Defines the entry point for the console application . #include s t d a f x . h 5 int int main ( argc , char ∗ argv [ ] ) { 7
  • 11. system ( c o l o r 1b ) ; / ∗ Função responsável por deixar a tela azul : −) ∗/ int char k, i =0 , j =0 , tam , qnt , a , b; 10 word [ 2 1 ] [ 5 ] , c a r a c ; TVetlista pbloco ; Apontador paux ; FILE ∗ arqE ; /∗ Arquivo de entrada ∗/ FILE ∗ a r q S ; /∗ Arquivo de saída ∗/ 15 a r q E=f o p e n ( a r g v [ 1 ] , r ) ; // a r q E é para leitura do arquivo (r −r e a d e ) a r q S=f o p e n ( a r g v [ 2 ] , w ) ; // a r q S é para escrever no arquiv (w −w r i t e ) / ∗ Obs . : argc é um inteiro que indica a quantidade de a r g u m e n t o s ∗/ / ∗ argv é um ponteiro do tipo char onde : argv [ 0 ] é o nome do arquivo executável , 20 arqv [ 1 ] é o primeiro argumento , que no caso é entrada . t x t e o arqgv [2] é o segundo argumento , que no caso é saida . t x t ∗/ −−−−−−−− −−−−−−−−|n n ) ; if p r i n t f ( | Mundo Dos Blocos ( ( ! arqE ) | | ( ! a r q S ) ) / ∗ Caso não seja encontrado os arquivos , será impresso uma mensagem de erro ∗/ p r i n t f ( Erro ao encontrar os arquivos : %s e %s n , a r g v [ 1 ] , a r g v [ 2 ] ) ; 25 else / ∗ Caso contrário , o programa fará as outras instruções ∗/ { c a r a c=g e t c ( a r q E ) ; / ∗ carac recebe os caracteres contidos no arquivo , ∗/ while um por vez ( c a r a c !=EOF) / ∗ Enquando não chegar no final do arquivo : End Of File as instruções contidas no while serão executadas ∗/ 30 { while j =0; ( ( c a r a c ! = 3 2 ) ( c a r a c !=EOF) ( c a r a c ! = 1 0 ) ) ∗ / Em ASCII 32 é o space e 10 é o 0 que indica o final da string ∗/ { word [ i ] [ j ]= c a r a c ; 35 j ++; c a r a c=g e t c ( a r q E ) ; / ∗ carac recebe os caracteres contidos no arquivo , um por vez ∗/ } word [ i ] [ j ]= ' 0 ' ; if i ++; 40 ( ( c a r a c ==10) | | ( c a r a c= EOF) ) = / ∗ Caso carac seja igual ao fim da string , que no caso é o final da linha ou chegue no final do arquivo qnt recebe a conversão de string para inteiro , convertendo −a em numeral ∗/ if { ( ( word [ 0 ] [ 0 ] 4 8 ) (word [ 0 ] [ 0 ] 5 8 ) ) { q n t= a t o i ( word [ 0 ] ) ; 45 C r i a r ( p b l o c o , q n t ) ; / ∗ qnt é a quantidade de blocos a serem criados lidos do arquivo de entrada ∗/ else } / ∗ Com isso será pulada a linha ∗/ if { ( ( word [ 1 ] [ 0 ] 4 8 ) (word [ 1 ] [ 0 ] 5 8 ) ) 50 if a= a t o i ( word [ 1 ] ) ; ( ( word [ 3 ] [ 0 ] 4 8 ) (word [ 3 ] [ 0 ] 5 8 ) ) b= a t o i ( word [ 3 ] ) ; 8
  • 12. if ( word [ 0 ] [ 0 ] = = 'm ' ) if { 55 ( ( word [ 2 ] [ 0 ] = = ' o ' ) (word [ 2 ] [ 1 ] = = ' v ' ) ) / ∗ Será lido cada caracter até montar uma string , nesse caso , se for 'm'= move e o v= o v e r , será executada a função MoveOver ∗/ else MoveOver( p b l o c o , a , b) ; / ∗ Do contrário , MoveOnto ∗/ MoveOnto( p b l o c o , a , b) ; else if } 60 ( word [ 0 ] [ 0 ] = = ' p ' ) if { ( ( word [ 2 ] [ 0 ] = = ' o ' ) (word [ 2 ] [ 1 ] = = ' v ' ) ) / ∗ Será lido cada caracter até montar uma string , nesse caso , se for ' p '= pilee e o v= o v e r , será executada a função PileOver ∗/ else P i l e O v e r ( p b l o c o , a , b) ; / ∗ Do contrário , PileOnto ∗/ 65 P i l e O n t o ( p b l o c o , a , b) ; else if } ( word [ 0 ] [ 0 ] = = ' q ' ) / ∗ Quando or lido , por final , o caracter 'q ' , implicará no final das intruções contidas no arquivo , então , a partir de agora o programa fará as operações , gerando um arquivo de saída com a solução do problema proposto , ou seja , com o resultado esperado ∗/ for { ( j = 0 ; j q n t ; j ++) / ∗ Agora a lista será percorrida até que o próximo elemento aponte para NULL, gravando no arquivo de saída o resultado esperado ∗/ 70 { paux=p b l o c o . v e t l i s t a [ j ] . p P r i m e i r o −p P r o x ; while f p r i n t f ( arqS , %d : , j ) ; ( paux !=NULL) { 75 f p r i n t f ( arqS , %d , paux − num ) ; paux = paux −p P r o x ; } f p r i n t f ( arqS , n ) ; } 80 f c l o s e ( arqE ) ; / ∗ Por final , arqE e arqS são fechados ∗/ f c l o s e ( arqS ) ; else } { 85 p r i n t f ( Não foi localizado o [ q u i t ] n ) ; } } i =0; } 90 c a r a c=g e t c ( a r q E ) ; } p r i n t f ( nArquivo de saida , %s , gerado com s u c e s s o ! ! ! n , a r g v [ 2 ] ) ; / ∗ Por final , caso tudo ocorra bem , será impresso essa msg informando ao usuário que o arquivo de saida foi gerado com sucesso com o resultado esperado por ele ∗/ } 95 return s y s t e m ( PAUSE ) ; 0; 9
  • 13. } Programa 14: Main 2.2.1 Função STDAFX.H No stdafx.h foi incluido todos os arquivos .h que serão usados pelo programa, os .h estão listados no programa abaixo: #pragma once #include #include t a r g e t v e r . h #include s t d i o . h 5 #include t c h a r . h #include s t d l i b . h TBloco . h 10 / ∗ Todas as eferências adicionais dos programas foram colocadas no stdafx .h ∗/ Programa 15: Stdafx 3 Análise de complexidade dos algoritmos Considerando todas por comparação e no pior caso: 3.1 Função Volta T (n) = 1 + T (n)T (0) = 0 (1) O(n) 3.2 Função PileOver f (n) = 5 (2) O(5) 3.3 Função MoveOver f (n) = 5 (3) O(5) 10
  • 14. 3.4 Função PileOnto f (n) = 5 (4) O(5) 3.5 Função start n−1 f (n) = 1 + 1=n (5) i=0 O(n) 3.6 Função MoveOnto f (n) = 6 (6) O(6) 3.7 Função Imprime n−1 f (n) = 1=n (7) i=0 O(n) 3.8 Função Busca n−1 n−1 n f (n) = 1 = n3 /2 (8) i=0 i=0 i=0 O(n3 ) 3.9 Função Criar n−1 f (n) = 1=n (9) i=0 O(n) 11
  • 15. 4 Testes Alguns testes com o programa: Argumentos: entrada.txt saida.txt Figura 1: Argumentos Comando: TP2AEDSI-JOHN.exe entrada.txt johnnatan.txt Figura 2: Comando 12
  • 16. Arquivo de entrada: entrada.txt Figura 3: Arquivo de entrada Execução do comando Figura 4: Execuxão do comando Arquivo de saída: johnnatan.txt 13
  • 17. Figura 5: Arquivo de saída 5 Conclusão Neste trabalho foram revistos conceitos sobre alocação dinâmica, TAD(Tipos Abstratos de Dados), listas encadeadas, argumentos argv, argc, pratica de edição A de textos em LTEX, bem como o melhor entendimento sobre ordem de complexidade e maturidade na linguagem C. A maior diculdade foi a abstração para a resolução do problema proposto, mas, uma vez que entendido o que se pede, tornou-se simples a implementação. Muito dos algoritmos são extraídos de [?]. Referências [1] David Menotti Algoritmos e Estruturas de Dados I: Listas En- cadeadas. http://www.decom.ufop.br/prof/menotti/aedI092/slides/ aula09-10-ListaEnc.ppt, visitado em 03/10/2009. [2] Márcio Santi Wikipédia, 2009 http://pt.wikipedia.org/wiki/Lista_ ligada/, visitado em 01/10/2009. [3] Aldrovando Luís Azeredo Araújo Os Argumentos argc e argv, 1999. http://www. mtm.ufsc.br/~azeredo/cursoC/aulas/c790.html, visitado em 30/08/2009. [4] Paulo Feolof Projeto de Algoritmos: Listas Encadeadas, 2009 http://www. ime.usp.br/~pf/algoritmos/aulas/lista.html, visitado em 28/09/2009. 14