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

Apresentações semelhantes


Apresentação em tema: "Listas lineares Denise Guliato Faculdade de Computação – UFU"— 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 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
Listas lineares Listas lineares duplamente encadeadas Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

3 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
LL duplamente encadeadas LL duplamente encadeadas Cada nodo tem 2 campos de elo A lista pode ser percorrida nas duas direções Anterior Info Próximo Nodo genérico PtLista L1 L2 L3 L4 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

4 Operações Algoritmos Criar e inicializar uma lista Inserir novo nodo
LL duplamente encadeadas Operações Criar e inicializar uma lista Inserir novo nodo Remover um nodo Consultar um nodo Destruir lista Algoritmos Semelhantes a LL encadeada simples Tipo de nodo utilizado nos algoritmos: struct no { struct no* ant; int info; struct no* prox; } typedef struct no Lista;

5 Algoritmo: criar lista circular Lista* Cria_lista(void)
{ return NULL; }

6 Inserção de um novo nodo no meio da lista
LL duplamente encadeadas Inserção de um novo nodo no meio da lista Novo nodo PtLista L1 L2 L3 L4 L5 PtLista L5 L1 L2 L3 L4 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

7 Inserção de um novo nodo no inicio da lista
PtLista L1 L2 L3 L4 PtLista L1 L2 L3 L4 L5 Adaptado de Nina Edelwais e Renata Galante Denise Guliato

8 Algoritmo: inserir um nodo no inicio da lista
Lista* Insere_elem(Lista* Ptl,int elem) Lista* Insere_elem(Lista *Ptl, int elem) { Lista *Ptnodo; Ptnodo = (Lista*)malloc(sizeof(Lista)); if (Ptnodo == NULL) return Ptl; Ptnodo->info = elem; Ptnodo->prox = Ptl; Ptnodo->ant = NULL; if(Ptl != NULL) Ptl->ant = Ptnodo; Ptl = Ptnodo; }

9 Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato
LL duplamente encadeadas Remoção de novo nodo PtLista Remover A B C D PtLista A B C D Crédito do slide para Nina Edelwais e Renata Galante Denise Guliato

10 Algoritmo:Remover um nodo de LL Duplamente Encadeada
Lista* Remove_elem(Lista *Ptl, int elem) Lista* Remove_elem(Lista *Ptl, int elem) { Lista *atual; if (Ptl == NULL) return Ptl; atual = Ptl; while (atual != NULL && elem != atual->info) atual = atual->prox; } if (atual == NULL)// não achou if (atual == Ptl)// primeiro nodo a ser removido Ptl = atual->prox; else // nodo removido do meio ou do final da lista atual->ant->prox = atual->prox; if (atual->prox != NULL) atual->prox->ant = atual->ant; free(atual);

11 Adaptado de Nina Edelwais e Renata Galante Denise Guliato
LL duplamente encadeadas Consulta à lista Acesso sempre pelo primeiro nodo da lista A lista pode ser percorrida nas duas direções Adaptado de Nina Edelwais e Renata Galante Denise Guliato

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

13 Algoritmo: destruir lista circular Lista* Libera_lista(Lista *Ptl)
{ Lista *aux; while (Ptl!= NULL) aux = Ptl; Ptl = Ptl->prox; free(aux); } return NULL;

14 lladae2d.h typedef struct no Lista; Lista* Cria_lista(void);
Lista* Libera_lista(Lista* Ptl); int E_vazia(Lista* Ptl); int E_cheia(Lista* Ptl); Lista* Insere_elem(Lista* Ptl, int elem); Lista* Remove_elem(Lista* Ptl, int elem); int Tamanho_lista(Lista* Ptl); int Consulta_nodo(Lista* Ptl, int pos, int *elem);

15 lladae2d.c #include <stdio.h> #include <stdlib.h>
#include "lladae2d.h“ struct no { struct no* ant; int info; struct no* prox; }; Lista* Cria_lista(void) {……..} Lista* Libera_lista(Lista *Ptl) {…….} int E_vazia(Lista *Ptl) int E_cheia(Lista *Ptl) Lista* Insere_elem(Lista *Ptl, int elem) { } Lista* Remove_elem(Lista *Ptl, int elem) int Tamanho_lista(Lista Ptl) int Consulta_nodo(Lista *Ptl, int pos,int *elem) {……} lladae2d.c

16 Considere uma Lista duplamente encadeada circular
LL duplamente encadeada circular Considere uma Lista duplamente encadeada circular PtLista L1 L2 L3 L4

17 Exercício Implemente o TAD Lista para a lista circular duplamente encadeada. Teste no programa do jogo baseado no problema de Josephus


Carregar ppt "Listas lineares Denise Guliato Faculdade de Computação – UFU"

Apresentações semelhantes


Anúncios Google