Lista encadeada simples

38.661 visualizações

Publicada em

Publicada em: Tecnologia
5 comentários
11 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
38.661
No SlideShare
0
A partir de incorporações
0
Número de incorporações
12
Ações
Compartilhamentos
0
Downloads
671
Comentários
5
Gostaram
11
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Lista encadeada simples

  1. 1.   Lista Encadeada Simples Métodos Computacionais 2011.2                                   Victor Casé
  2. 2.                            O que é ? <ul><ul><li>É um Tipo Abstrato de Dados </li></ul></ul><ul><ul><li>Organizar os dados de forma   Linear e Dinâmico </li></ul></ul><ul><ul><li>Você pode pensar visualmente assim :   </li></ul></ul>
  3. 3.                           Linear ? <ul><li>Existem estruturas de dados em que os elementos estão em níveis diferentes.  </li></ul><ul><li>Por exemplo, ao lado vemos uma estrutura chamada Árvore </li></ul><ul><li>         Elementos com Alturas Diferentes </li></ul>
  4. 4.                             Dinâmico ? <ul><li>Vetores são estruturas que precisam ter seu tamanho bem definidos! </li></ul><ul><li>Listas podem crescer até a memória estourar!! </li></ul><ul><li>  </li></ul>
  5. 5.                          Motivação I <ul><li>  Tirar aquele 10 na Prova!! </li></ul>
  6. 6.                          Motivação II <ul><li>e não menos importante! </li></ul><ul><ul><li>Listas crescem e decrescem a medida em que o programa precisa! </li></ul></ul><ul><ul><li>Com isso ganhamos mais espaço na memória! </li></ul></ul><ul><ul><li>Fácil de Implementar em relação a outras TAD's </li></ul></ul><ul><li>  </li></ul>
  7. 7. Beleza champs! Mostra no código... <ul><li>struct aluno { </li></ul><ul><li>        char nome[50]; </li></ul><ul><li>        int cpf; </li></ul><ul><li>        int blocado; </li></ul><ul><li>        struct aluno* proximo; </li></ul><ul><li>    } </li></ul><ul><li>Dessa forma, criamos uma estrutura que contém um ponteiro para outra estrutura do mesmo tipo. </li></ul>         Dados
  8. 8.                  Considerações... <ul><ul><li>Vamos usar o 'typedef' para ajudar a escrever código </li></ul></ul><ul><ul><li>Nada mais faz do que renomear... </li></ul></ul><ul><ul><li>Então pela lógica Newtoniana </li></ul></ul><ul><li>    typedef struct aluno Aluno </li></ul><ul><li>    Tudo que era struct aluno pode ser chamado  Aluno     </li></ul><ul><li>     :D </li></ul>
  9. 9.      Como Criar uma Lista Encadeada? <ul><li>typedef struct lista { </li></ul><ul><li>    int valor </li></ul><ul><li>    struct lista* prox; </li></ul><ul><li>} Lista; </li></ul><ul><li>Lista* lista_cria( ) { </li></ul><ul><li>   return NULL; </li></ul><ul><li>} </li></ul><ul><li>int main () { </li></ul><ul><li>    Lista* minhaPrimeiraLista = lista_cria(); </li></ul><ul><li>} </li></ul>Afinal.. toda lista começa vazia. Em termos mais bonitos: Afinal.. toda lista começa NULL
  10. 10. Como Inserir um novo elemento? <ul><ul><li>Inserir no começo ? </li></ul></ul><ul><ul><li>Inserir no final ? </li></ul></ul><ul><ul><li>Inserir ordenadamente? </li></ul></ul><ul><li>    ....... </li></ul><ul><ul><li>  Vamos pensar em como inserir no final! </li></ul></ul><ul><ul><li>  O resto é com vocês xD </li></ul></ul>
  11. 11.   Inserir no final da Lista <ul><li>Lista* insereNovo ( Lista* minhaLista , int valor ) { </li></ul><ul><li>    // Primeira parte do código : Teste se a lista é vazia </li></ul><ul><li>    if ( minhaLista == NULL ) { </li></ul><ul><li>        Lista* novoElemento = (Lista*)malloc(sizeof(Lista)); </li></ul><ul><li>        novoElemento ->valor = valor; </li></ul><ul><li>        novoElemento ->prox = NULL; </li></ul><ul><li>        minhaLista = novoElemento ; </li></ul><ul><li>        return minhaLista; </li></ul><ul><li>     } </li></ul><ul><li>         </li></ul>
  12. 12. Pausa para Considerações... <ul><li>Você tem que SEMPRE manter o endereço INICIAL da lista! </li></ul><ul><li>Caso precise, não esqueça de ATUALIZAR o endereço inicial </li></ul><ul><li>A função de INSERIR sempre vai RETORNAR um endereço! </li></ul><ul><li>Não esqueça de ALOCAR o novo elemento! </li></ul>
  13. 13.                           Voltando... <ul><li>// Segunda parte do Codigo : Se a lista não for vazia! </li></ul><ul><li>// Precisamos encontrar o final da lista </li></ul><ul><li>// Lembre-se minhaLista = endereço inicial </li></ul><ul><li>else { </li></ul><ul><li>    Lista* novoElemento = (Lista*)malloc(sizeof(Lista)); </li></ul><ul><li>    novoElemento ->valor=valor; </li></ul><ul><li>    novoElemento ->prox=NULL; </li></ul><ul><li>     </li></ul><ul><li>     Lista* p ; </li></ul><ul><li>    for ( p = minhaLista ; p ->prox != NULL ; p = p ->prox ); </li></ul><ul><li>    p ->prox=novoElemento; </li></ul><ul><li>     </li></ul><ul><li>     return minhaLista ; </li></ul><ul><li>}  </li></ul><ul><li>     </li></ul><ul><li>     </li></ul>
  14. 14. Cuidado! no FOR <ul><li>Note que fizemos P->PROX != NULL </li></ul><ul><li>                  e  </li></ul><ul><li>  </li></ul><ul><li>                      Não P != NULL  como condição de PARADA </li></ul><ul><li>         </li></ul><ul><li>     Quem responder ganha  </li></ul><ul><li>                 um chocolate! </li></ul>
  15. 15.     Já era seu programa.. mAUahAHHA <ul><li>NULL -> prox  </li></ul><ul><li>         Resultado : </li></ul>
  16. 16. Voltando as Funções : Busca Elemento <ul><li>// Sempre lembre de Testar se lista está VAZIA! </li></ul><ul><li>Lista* buscaElemento( Lista* minhaLista , int procurado) { </li></ul><ul><li>    if ( minhaLista == NULL ) { </li></ul><ul><li>        printf(&quot;Falou brodager essa lista está vazia!&quot;); </li></ul><ul><li>        return NULL; </li></ul><ul><li>    } </li></ul><ul><li>       else { </li></ul><ul><li>   Lista* p; </li></ul><ul><li>   for ( p = minhaLista ; p!=NULL && p->valor!=procurado;p=p->prox); </li></ul><ul><li>  if(p==NULL) // Elemento não existe na lista </li></ul><ul><li>      return NULL; </li></ul><ul><li>  else </li></ul><ul><li>       return p; </li></ul><ul><li>     } </li></ul><ul><li>} </li></ul>
  17. 17. Entendendo o algoritmo de busca! <ul><li>for ( p = minhaLista ; p!=NULL && p->valor!=procurado;p=p->prox); </li></ul><ul><li>1 ) Pega o endereço inicial </li></ul><ul><li>2 ) Não é o final da lista e não tem o valor procurado? </li></ul><ul><ul><li>Verdade . Então pega o próximo e repete. </li></ul></ul><ul><ul><li>Falso ! </li></ul></ul><ul><li>        Oxen.. Parou porque?         É o final da Lista?  retorne NULL         Então...É o elemento procurado? retorne o elemento </li></ul>
  18. 18. Função de Remoção!!  <ul><li>To querendo remover um elemento da lista! </li></ul><ul><li>O que eu faço?  </li></ul><ul><li>Calma.. vamos as Hipóteses </li></ul><ul><li>1)A lista está vazia? </li></ul><ul><li>2)O elemento é o primeiro? </li></ul><ul><li>3)O elemento está no meio? </li></ul><ul><li>4)O elemento é o ultimo? </li></ul>
  19. 19. A sacada é não perder o Encademaneto <ul><li>Vamos percorrer a lista usando DUAS  variáveis auxiliares! </li></ul><ul><li>Uma para o nó anterior e outra para o nó atual . </li></ul><ul><li>Lista* lista_remove(Lista* minhaLista, int remover) { </li></ul><ul><li>        Lista* anterior = NULL; </li></ul><ul><li>        Lista* p = minhaLista; </li></ul><ul><li>         </li></ul><ul><li>        while(p!=NULL && p->valor!=remover){ </li></ul><ul><li>            anterior = p; </li></ul><ul><li>            p = p->prox; </li></ul><ul><li>          } </li></ul><ul><li>                                                     .... TO BE CONTINUE     </li></ul><ul><li>                                                                                             </li></ul><ul><li>         </li></ul><ul><li>     </li></ul>
  20. 20. Continuando.. <ul><li>if ( p == NULL ) // Quer dizer que não encontrou o elemento </li></ul><ul><li>    return NULL; </li></ul><ul><li>if ( ant == NULL ) // Nem entrou no laço.. é logo o primeiro! </li></ul><ul><li>        Lista* guardaP = p; </li></ul><ul><li>         p = p->prox; </li></ul><ul><li>        free(guardaP); </li></ul><ul><li>        return p; </li></ul><ul><li>else // Tá la no meio ou no fim.. </li></ul><ul><li>        ant->prox=p->prox; </li></ul><ul><li>        free(p); </li></ul><ul><li>       return minhaLista; </li></ul><ul><li>    </li></ul>
  21. 21.                       Dúvidas ? <ul><li>Alguém quer fazer uma função que imprime uma lista? </li></ul><ul><li>                  É muito simples e ainda ganha chocolate xD </li></ul><ul><li>------------------------------------------------------------------------------- </li></ul><ul><li>Beleza galera.. qualquer dúvida por favor, contacte os monitores ou o professor.  </li></ul><ul><li>Email: victor.case@hotmail.com | vcc3@cin.ufpe.br </li></ul><ul><li>Abr! </li></ul>

×