A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

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.

Apresentações semelhantes


Apresentação em tema: "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."— Transcrição da apresentação:

1 Listas lineares Denise Guliato Faculdade de Computação – UFU 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 PtLista L1L1 L2L2 L4L4 L3L3 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 L1L1 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: criar lista circular Lista* Cria_lista(void) Lista* Cria_lista(void) { return NULL; }

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

7 Inserção de um novo nodo num dos extremos da lista Ptlista Inserir um nodo em uma lista circular vazia L1L1 Ptlista

8 Inserção de um novo nodo num dos extremos da lista Onde inserir ???? Inserção de um novo nodo no inicio da lista Ptlista L1L1 L2L2 L4L4 L3L3 L1L1 L2L2 L4L4 L3L3

9 Inserção de um novo nodo num dos extremos da lista Onde inserir ???? Inserção de um novo nodo no final da lista Ptlista L1L1 L2L2 L4L4 L3L3 L1L1 L2L2 L4L4 L3L3

10 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; } Algoritmo: Algoritmo: inserir um nodo no final da lista Lista* Insere_elem(Lista* Ptl,int elem)

11 Remoção de um nodo LL encadeada circular PtLista L1L1 L2L2 L4L4 L3L3 L1L1 L2L2 L4L4 Remover Localizar posição do nodo Adequar encadeamentos Liberar nodo 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 NÃO É POSSÍVEL Remover o nodo de uma lista com um único nodo L1L1 Ptlista

14 Remoção de um nodo Remover o primeiro nodo de uma lista qualquer L1L2L2 L4L4 L3 L2L2 L3L3 L4L4 Remover PtLista slide adaptado de Nina Edelwais e Renata Galante Denise Guliato

15 Remoção de um nodo Remover o nodo qualquer de uma lista L1L1 L2L2 L4L4 L3L3 L1L1 L2L2 L4L4 Remover PtLista 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 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 Algoritmo: Algoritmo: Remover um nodo de LL Encadeada Circular dado o elem Lista* Remove_elem(Lista *Ptl, int elem)

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 Consulta nodo da lista LL encadeada circular Iniciar sempre acessando primeiro nodo da lista Seguir acessando de acordo com campos de elo Para quando encontrar novamente o primeiro nodo da lista L1L1 L2L2 L4L4 L3L3 PtLista L5L5 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

20 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; } Algoritmo: Algoritmo: Consulta K-esimo nodo da Lista int Consulta_nodo(Lista *Ptl, int pos, int*elem)

21 Algoritmodestruir lista circular Lista* Libera_lista(Lista *Ptl) Algoritmo : destruir lista circular Lista* 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 Algoritmodestruir lista circular int Tamanho_lista(Lista *Ptl) Algoritmo : destruir lista circular int Tamanho_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 Lista encadeada circular Podemos melhorar o custo computacional da inserção? Como? Fazendo Ptl apontar para o ultimo nodo da lista circular

24 Lista encadeada circular Ptlista aponta para o último nodo da lista: L1L1 L2L2 L4L4 L3L3 Ptlista

25 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; } Algoritmo: Algoritmo: inserir um nodo no final da lista Lista* Insere_elem(Lista* Ptl,int elem)

26 Lista encadeada circular Como ficaria a função de remoção???

27 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; } Algoritmo: Algoritmo: Remover um nodo de LL Encadeada Circular dado o elem int Remove_elem(Lista *Ptl, int elem)

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 programa que, usando a lladaec.h, forme o circulo de pessoas, lembrando que são N pessoas sentadas aleatoriamente. Sorteie, a cada iteração um número, e retire uma pessoa do círculo, conforme as regras do jogo. A cada saída, grave em disco a posição e o numero de quem saiu. No final do jogo, grave o nome e o número da pessoa que sobrou e indique seu premio ou castigo.


Carregar ppt "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."

Apresentações semelhantes


Anúncios Google