1 / 30

Listas lineares

Listas lineares. Denise Guliato Faculdade de Computação – UFU www.facom.ufu.br/~guliato. Vários slides foram adaptados de Nina Edelwais e Renata Galante Estrutura de Dados – Série de Livros Didáticos - Informática - UFRGS. Listas lineares. Lista encadeada circular.

jaeger
Télécharger la présentation

Listas lineares

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Listaslineares Denise Guliato Faculdade de Computação – UFU www.facom.ufu.br/~guliato Vários slides foram adaptados de Nina Edelwais e Renata Galante Estrutura de Dados – Série de Livros Didáticos - Informática - UFRGS

  2. Listas lineares Lista encadeada circular

  3. LL encadeada circular LL encadeada circular PtLista L1 L2 L3 L4 • Elo do último nodo indica endereço do primeiro • Lista pode ser percorrida a partir de qualquer nodo • Lista com 1 só nodo: elo do nodo aponta para ele mesmo PtLista L1 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

  4. LL encadeada circular Operações básicas • Criar uma lista • Inserir novo nodo • Remover um nodo • Consulta um nodo • Destruir lista Algoritmos Semelhantes a LL encadeada simples Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

  5. Algoritmo: criarlista circularLista* Cria_lista(void) Lista* Cria_lista(void) { return NULL; }

  6. LL encadeada circular Inserção de umnovo nodo • Definir a posição de inserção • Alocar o novo nodo • Preencher com valor • Encadear adequadamente Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

  7. Inserção de umnovo nodo num dos extremos da lista Inserir um nodoemumalista circular vazia Ptlista Ptlista L1

  8. Inserção de umnovo nodo num dos extremos da lista Onde inserir ???? L1 L1 L2 L2 L3 L3 L4 L4 Inserção de umnovo nodo no inicio da lista Ptlista Ptlista

  9. Inserção de umnovo nodo num dos extremos da lista Onde inserir ???? L1 L1 L2 L2 L3 L3 L4 L4 Inserção de umnovo nodo no final da lista Ptlista Ptlista

  10. Algoritmo: inserir um nodo no final da lista Lista* Insere_elem(Lista* Ptl,intelem) Lista* Insere_elem(Lista* Ptl, int elem) { Lista *Ptnodo, *aux; Ptnodo = (Lista*)malloc(sizeof(struct no)); if (Ptnodo == NULL) return Ptl; Ptnodo->info = elem; if (Ptl == NULL) // lista vazia { Ptl = Ptnodo; Ptnodo->prox = Ptl; } else //lista nao esta vazia,insere no final { aux = Ptl; while (aux->prox != Ptl) aux = aux->prox; Ptnodo->prox = Ptl; aux->prox = Ptnodo; } return Ptl; }

  11. LL encadeada circular Remoção de um nodo • Localizar posição do nodo • Adequar encadeamentos • Liberar nodo Remover PtLista L1 L2 L3 L4 PtLista L1 L2 L4 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

  12. Remoção de um nodo Remover nodo de uma lista vazia Ptlista NÃO É POSSÍVEL

  13. Remoção de um nodo Remover nodo de uma lista vazia Ptlista Ptlista NÃO É POSSÍVEL Remover o nodo de uma lista com um único nodo Ptlista L1

  14. Remoção de um nodo Remover o primeiro nodo de uma lista qualquer PtLista Remover L1 L2 L3 L4 PtLista L2 L3 L4 slide adaptado de Nina Edelwais e Renata Galante Denise Guliato

  15. Remoção de um nodo Remover o nodo qualquer de uma lista PtLista Remover L1 L2 L3 L4 PtLista L1 L2 L4 Slide adaptado de Nina Edelwais e Renata Galante Denise Guliato

  16. Remoção de um nodo • Caso 1: lista vazia • Caso 2:nodo a ser removido é o primeiro e único da lista • Caso 3:nodo a ser removido é o primeiro mas não é o único • Caso 4:nodo a ser removido é qualquer outro nodo da lista

  17. Algoritmo:Remover um nodo de LL Encadeada Circular dado o elem Lista* Remove_elem(Lista *Ptl, int elem) Lista* Remove_elem(Lista* Ptl, int elem) { Lista *ant,*atual,*aux; if (Ptl == NULL) //lista vazia return Ptl; atual = Ptl; ant = NULL; while (atual->prox != Ptl && atual->info != elem) { ant = atual; atual = atual->prox; } //continua

  18. Algoritmo (cont): Remover nodo de LL Encadeada Circular dado o elem if (atual->info == elem) { if (ant == NULL) //primeiro nodo sera removido { aux=Ptl; while (aux->prox != Ptl) aux = aux->prox; //aux aponta para o ultimo nodo da lista if (aux == Ptl) //eh primeiro e o ultimo Ptl = NULL; else { // eh o primeiro mas nao o ultimo Ptl = atual->prox; aux->prox = Ptl; } } else ant->prox = atual->prox; free(atual); } return Ptl; }

  19. LL encadeada circular LL encadeada circular Consulta nodo da lista • Iniciar sempre acessando primeiro nodo da lista • Seguir acessando de acordo com campos de elo • Para quando encontrar novamente o primeiro nodo da lista PtLista L1 L2 L3 L4 L5 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

  20. Algoritmo: Consulta K-esimo nodo da Listaint Consulta_nodo(Lista *Ptl, int pos, int*elem) int Consulta_nodo(Lista* Ptl, int pos, int *elem) { int cont; Lista *pt; if( Ptl == NULL || pos <= 0) return 0; cont = 1; pt = Ptl; while(pt->prox != Ptl && cont < pos) { pt=pt->prox; cont++; } if (cont == pos) { *elem = pt->info; return 1; } else return 0; }

  21. Algoritmo: destruirlista circularLista* Libera_lista(Lista *Ptl) Lista* Libera_lista(Lista* Ptl) { Lista *pt, *aux; if (Ptl == NULL) return NULL; pt = Ptl; while (pt->prox != Ptl) { aux = pt; pt = pt->prox; free(aux); } free(pt); return NULL; // Ptl = NULL; return Ptl; }

  22. Algoritmo: destruirlista circularintTamanho_lista(Lista *Ptl) int Tamanho_lista(Lista* Ptl) { Lista *pt; int cont; if (Ptl == NULL) return 0; pt = Ptl; cont = 1; while (pt->prox != Ptl) { pt = pt->prox; cont++; } return cont; }

  23. Listaencadeada circular • Podemos melhorar o custo computacional da inserção? • Como? • Fazendo Ptl apontar para o ultimo nodo da lista circular

  24. Listaencadeada circular • Ptlista aponta para o último nodo da lista: L1 L2 L3 L4 Ptlista

  25. Algoritmo: inserir um nodo no final da lista Lista* Insere_elem(Lista* Ptl,intelem) Lista* Insere_elem(Lista* Ptl, int elem) { Lista *Ptnodo; Ptnodo = (Lista*)malloc(sizeof(struct no)); if (Ptnodo == NULL) return Ptl; Ptnodo->info = elem; if (Ptl == NULL) // lista vazia { Ptl = Ptnodo; Ptnodo->prox = Ptl; } else //lista nao esta vazia { Ptnodo->prox = Ptl->prox; Ptl->prox = Ptnodo; Ptl = Ptnodo; } return Ptl; }

  26. Listaencadeada circular • Como ficaria a função de remoção???

  27. Algoritmo:Remover um nodo de LL Encadeada Circular dado o elem int Remove_elem(Lista *Ptl, int elem) Lista* Remove_elem(Lista* Ptl, int elem) { Lista *ant,*atual,*aux; if (Ptl == NULL) //lista vazia return Ptl; atual = Ptl->prox; ant = Ptl; while (atual!= Ptl && atual->info != elem) { ant = atual; atual = atual->prox; } if (atual->info == elem) { if (atual == ant) //único nodo Ptl = NULL; else { ant->prox = atual->prox; if (atual == Ptl) //ultimo nodo a ser removido Ptl = ant; } free(atual); } return Ptl; }

  28. Algoritmo (cont): Remover nodo de LL Encadeada Circular dado o elem

  29. Exercício(baseado no problema de Josephus) Considere o seguinte jogo: N pessoas identificadas por um nome e um número inteiro estão sentadas em círculo, organizadas aleatoriamente. Um número é sorterado no intervalo [1,N]. A pessoa associada a este número sai do círculo. Um novo número é sorteado. Contando da pessoa seguinte àquela que saiu, a enésima pessoa sai do círculo. O sorteio continua até que reste apenas uma pessoa.

  30. Exercício para entregar Faça um programaque, usando a lladaec.h, forme o circulo de pessoas, lembrandoquesão N pessoassentadasaleatoriamente. Sorteie, a cadaiteração um número, e retire umapessoa do círculo, conforme as regras do jogo. A cadasaída, grave em disco a posição e o numero de quemsaiu. No final do jogo, grave o nome e o númerodapessoaquesobrou e indiqueseupremiooucastigo.

More Related