Listas lineares Denise Guliato Faculdade de Computao UFU

  • Slides: 17
Download presentation
Listas lineares Denise Guliato Faculdade de Computação – UFU www. facom. ufu. br/~guliato Vários

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 duplamente encadeadas Crédito do slide para Nina Edelwais e Renata Galante Guliato

Listas lineares duplamente encadeadas Crédito do slide para Nina Edelwais e Renata Galante Guliato Denise

LL duplamente encadeadas • Cada nodo tem 2 campos de elo • A lista

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 Pt. Lista L 1 L 2 Crédito do slide para Nina Edelwais e Renata Galante L 3 Guliato L 4 Denise

LL duplamente encadeadas Operações • Criar e inicializar uma lista • Inserir novo nodo

LL duplamente encadeadas Operações • Criar e inicializar uma lista • Inserir novo nodo • Remover um nodo Algoritmos • Consultar um nodo • Destruir lista 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;

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

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

LL duplamente encadeadas Inserção de um novo nodo no meio da lista Novo nodo

LL duplamente encadeadas Inserção de um novo nodo no meio da lista Novo nodo Pt. Lista L 5 L 1 L 2 Pt. Lista L 4 L 3 L 5 L 1 L 2 Crédito do slide para Nina Edelwais e Renata Galante L 3 Guliato L 4 Denise

Inserção de um novo nodo no inicio da lista Pt. Lista L 5 L

Inserção de um novo nodo no inicio da lista Pt. Lista L 5 L 1 L 2 L 4 L 3 Pt. Lista L 5 L 1 Adaptado de Nina Edelwais e Renata Galante L 2 L 3 L 4 Denise Guliato

Algoritmo: inserir um nodo no inicio da lista Lista* Insere_elem(Lista* Ptl, int elem) Lista*

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; return Ptl; }

Remoção de novo nodo Pt. Lista LL duplamente encadeadas Remover A B C D

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

Algoritmo: Remover um nodo de LL Duplamente Encadeada Lista* Remove_elem(Lista *Ptl, int elem) {

Algoritmo: Remover um nodo de LL Duplamente Encadeada 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 return Ptl; 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); return Ptl;

Consulta à lista LL duplamente encadeadas • Acesso sempre pelo primeiro nodo da lista

Consulta à lista LL duplamente encadeadas • 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

Algoritmo: Consulta K-esimo nodo da Lista LL encadeada circular int Consulta_nodo(Lista Ptl, int pos,

Algoritmo: Consulta K-esimo nodo da Lista LL encadeada circular 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) return 0; else { *elem=pt->info; return 1; } }

Algoritmo: destruir lista circular Lista* Libera_lista(Lista *Ptl) { Lista *aux; while (Ptl!= NULL) {

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

lladae 2 d. h typedef struct no Lista; Lista* Cria_lista(void); Lista* Libera_lista(Lista* Ptl); int

lladae 2 d. 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);

#include <stdio. h> #include <stdlib. h> #include "lladae 2 d. h“ struct no {

#include <stdio. h> #include <stdlib. h> #include "lladae 2 d. 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) {……} lladae 2 d. c

LL duplamente encadeada circular Considere uma Lista duplamente encadeada circular Pt. Lista L 1

LL duplamente encadeada circular Considere uma Lista duplamente encadeada circular Pt. Lista L 1 L 2 L 3 L 4

Exercício Implemente o TAD Lista para a lista circular duplamente encadeada. Teste no programa

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