Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Documentos relacionados
Estruturas de Dados. Listas Dinâmicas Duplamente Encadeadas & Variantes. Listas Duplamente Encadeadas

SCC 202 Algoritmos e Estruturas de Dados I. Listas Lineares Encadeadas Alocação dinâmica

Estruturas de Dados. Filas em que a prioridade de remoção não é cronológica. Maior prioridade não é do elemento que ingressou primeiro

Filas. Estruturas de Dados. O TAD Fila. Inserções e remoções seguem a política First-in First-out. Operações auxiliares:

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Listas Lineares. continuando...

Lista Encadeada: algoritmos. Algoritmos e Estruturas de Dados I

UNIVERSIDADE DE SÃO PAULO INSTITUTO DE CIÊNCIAS MATEMÁTICAS E DE COMPUTAÇÃO

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Introdução a Programação. Listas Encadeadas

Métodos Computacionais. Listas Encadeadas

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

Universidade Federal do Ma Curso de Ciência da Computação

Estrutura de Dados Listas

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

Listas: a última das 3 estruturas lineares (Pilhas, Filas e Listas)... árvores e grafos são não lineares!

Lista Encadeada (Linked List)

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Aula 10 Alocação Dinâmica de Memória Listas Encadeadas. prof Leticia Winkler

Pesquisa Linear. Adriano J. Holanda 15/3/2016

BCC202 - Estrutura de Dados I

Estrutura de Dados: Lista Linear. Parte I Introdução e Listas Sequenciais Estáticas

Estruturas de Dados. Árvores AVL: Partes I e II. Desempenho de ABBs (Revisão)

UNIVERSIDADE DA BEIRA INTERIOR

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Estrutura de Dados II. Prof. Sérgio Portari

Estrutura de Dados: Lista Linear. Parte I Introdução e Listas Sequenciais Estáticas

Introdução à Ciência da Computação II

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

SCC 202 Algoritmos e Estruturas de Dados I. Pilhas (Stacks) (implementação dinâmica)

INF 1620 P2-01/11/03 Questão 1 Nome:

SCC122 - Estruturas de Dados. Lista Estática Seqüencial

Professora Jeane Melo

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Copiar para o ficheiro ArvoreBinaria.h e adaptar as funções associadas às operações sobre árvores binárias (3.1 a 3.12)

Programação de Computadores II

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

UNIVERSIDADE DA BEIRA INTERIOR

Listas Lineares Ordenadas

Métodos Computacionais. Variações de Listas Encadeadas

UNIVERSIDADE DA BEIRA INTERIOR

UNIVERSIDADE DA BEIRA INTERIOR

Lista: conceito, representação e algoritmos

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0

Pilhas e Filas. Nádia Félix e Hebert Coelho

Algoritmos e Estrutura de Dados. Aula 05 Estrutura de Dados: Listas (Parte II) Prof. Tiago A. E. Ferreira

Algoritmos e Estruturas de dados

Fila e Deque. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Árvores Binárias de Busca (ABB) 18/11

UNIVERSIDADE DA BEIRA INTERIOR

Lista: conceito, representação e algoritmos

LISTAS - ARMAZENAMENTO NÃO SEQUENCIAL COM MEMÓRIA DINÂMICA

Árvores. SCC-202 Algoritmos e Estruturas de Dados I. Lucas Antiqueira

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

BCC202 - Estrutura de Dados I

Algoritmos e Estrutura de Dados II. Árvore AVL. Prof Márcio Bueno. / Material da Prof a Ana Eliza

Listas - Outras. Listas Circulares Nós Cabeça Listas Duplamente Ligadas/Encadeadas Aplicações

Algoritmos e Estrutura de Dados II. Árvore. Prof a Karina Oliveira.

Aplicações de listas e outras estruturas. SCC-502 Algoritmos e Estruturas de Dados I

Árvores Binárias de Busca (ABB) 18/11

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

Algoritmos e Estruturas de Dados I

REVISÃO DE PILHAS E FILAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Tipos Abstratos de Dados. Estrutura de Dados

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas. SCC-502 Algoritmos e Estruturas de Dados I

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Árvores Binárias. 16/11 Representação e Implementação: Encadeada Dinâmica O TAD

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Lista Ordenada. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Módulo 10 Listas Encadeadas

Arvores binárias. Fonte: PF 14 pf/algoritmos/aulas/bint.html

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Estruturas de Dados I

não descobertos descobertos explorados descoberta cruzamento

Programação de Computadores II. Cap. 17 Busca

BCC202 - Estrutura de Dados I

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Estruturas de Dados. Módulo 12 - Filas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

SCC Algoritmos e Estruturas de Dados I

PLANO DE UNIDADE DIDÁTICA- PUD

Algoritmos e Estruturas de Dados II

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Árvores & Árvores Binárias

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Listas: a última das 3 estruturas lineares (Pilhas, Filas e Listas)

L I C R P * * V O * * A * A F * * * * *

SCC Algoritmos e Estruturas de Dados I

Transcrição:

Estruturas de Dados Listas Dinâmicas Simplesmente Encadeadas Prof. Ricardo J. G. B. Campello Créditos Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais: disponíveis em http://ww3.datastructures.net/ cedidos pela Profa. Maria Cristina F. de Oliveira 2 1

Listas Dinâmicas Utiliza alocação dinâmica de memória ao invés de arranjos (vetores) pré-alocados. Lista dispõe de toda memória disponível para o programa durante a execução (heap) Alocação/liberação desses endereços é gerenciada pelo S.O., por meio de comandos da linguagem de programação Linguagem C: malloc e free 3 Listas Simplesmente Encadeadas Uma lista encadeada é uma estrutura de dados linear que consiste de uma seqüência interligada de nós (ou nodos) dinamicamente alocados. No caso de encadeamento simples, cada nodo armazena: elemento (registro, objeto,...) ponteiro para o próximo nodo. elemento próximo nodo A B C D 4 2

Listas Simplesmente Encadeadas nodo Nodo: elem lig struct list_node { tipo_elem elem; struct list_node *lig; }; typedef struct list_node nodo; 5 Listas Simplesmente Encadeadas nulo (NULL) Lista: typedef struct { int nelem; nodo *head, *tail; } Lista; Lista L; /* Exemplo de Declaração */ 6 3

Listas Simplesmente Encadeadas Inicialização: Lista *Definir(void){ Lista *L; L = malloc(sizeof(lista)); L->nelem = 0; L->head = NULL; L->tail = NULL; return L; } nulo (NULL) 7 Inserindo no Início 1. Aloque o novo nodo. 2. Insira o novo elemento. 3. Aponte o novo nodo para head. 4. Aponte head para o novo nodo. PS. símbolo representa NULL. 8 4

Inserindo no Início nodo *Inserir_frente(tipo_elem x, Lista *L){ nodo *Pa; Pa = malloc(sizeof(nodo)); Pa->elem = x; Pa->lig = L->head; L->head = Pa; if (L->tail == NULL) /* L antes vazia */ L->tail = L->head; L->nelem++; return Pa; } /* O(1) */ 9 Removendo do Início 1. Aponte um ponteiro auxiliar Pa para head 2. Aponte head para o próximo nodo. 3. Desaloque o primeiro nodo usando Pa 10 5

Removendo do Início tipo_elem Remover_frente(Lista *L){ tipo_elem x; nodo *Pa; Pa = L->head; L->head = Pa->lig; if (L->head == NULL) /* L antes com elemento único */ L->tail = NULL; x = Pa->elem; free(pa); L->nelem--; return x; } /* O(1) */ 11 Inserindo no Final 1. Aloque o novo nodo. 2. Insira o novo elemento. 3. Faça o novo nodo apontar para NULL. 4. Faça o antigo último nodo apontar para o novo. 5. Atualize tail para o novo nodo. Podemos inverter a ordem dos passos 4 e 5? 12 6

Inserindo no Final nodo *Inserir_final(tipo_elem x, Lista *L){ nodo *Pa; Pa = malloc(sizeof(nodo)); Pa->elem = x; Pa->lig = NULL; if (L->head == NULL) L->head = Pa; /* L antes vazia */ else (L->tail)->lig = Pa; L->tail = Pa; L->nelem++; return Pa; } /* O(1) */ 13 Removendo do Final Remover no final de uma lista simplesmente encadeada não é eficiente. Não existe algoritmo de complexidade (tempo) constante para acessar o nodo anterior a tail. A obtenção a partir de head é O(n), onde n é o número de elementos na lista (nelem na nossa implementação). 14 7

Removendo do Final tipo_elem Remover_final(Lista *L){ tipo_elem x; nodo *Pa; Pa = L->head; if ((L->head)->lig == NULL) { /* L com 1 elemento */ L->tail = NULL; L->head = NULL; } else { while (Pa->lig!= L->tail) Pa = Pa->lig; L->tail = Pa; Pa = Pa->lig; (L->tail)->lig = NULL; } x = Pa->elem; free(pa); L->nelem--; return x; } /* O(L.nelem) */ Exercícios 1. Implemente uma função Lista_vazia(Lista *L) que retorna True ou False se a lista está vazia ou não, respectivamente 2. Seja o tipo dos elementos da lista, tipo_elem, definido como um registro (struct) com dois campos: chave e info 1.a. Implemente a seguinte função: retorno Localizar(tipo_elem x, Lista *L); que retorna um registro do tipo retorno, também com dois campos: Campo 1 (int): Rank do elemento com chave x.chave na lista L Campo 2 (nodo*): Ponteiro para o nodo de x em L 1.b. Qual o tempo de execução assintótico (BIG-O) de pior caso? 3. Faz sentido aqui Localizar via Busca Binária? Justifique 8

Exercícios 4. Implemente funções para remover elementos quaisquer da lista: tipo_elem Remover_elem(tipo_elem x, Lista *L); tipo_elem Remover_rank(int p, Lista *L); A 1a deve remover da lista o nodo que armazena o elemento com chave x.chave (retornando ao sistema a respectiva memória) e retornar esse elemento A 2a deve fazer o mesmo, mas para o p-ésimo elemento da lista 5. Repita o exercício anterior para as funções Buscar_elem e Buscar_rank, que apenas retornam o elemento, sem remover o respectivo nodo da lista 6. Implemente uma função Modificar que substitua o elemento em uma dada colocação (rank) da lista por outro, retornando-o 17 Exercícios 7. Implemente uma função Modify que substitua um dado elemento x com chave x.chave por outro y também dado. Use Localizar do exercício 1 e Modificar do exercício 5 8. Suponha que se disponha de um ponteiro para um dado nodo da lista (por exemplo obtido via Localizar do exercício 1): Explique porque, mesmo com esse ponteiro em mãos, não é possível remover o respectivo nodo em tempo constante O(1) (sem ter que percorrer a lista a partir de head) É possível modificar a ED dos nodos para tornar isso possível? Justifique 9. Faça um procedimento Esvaziar(Lista *L) que devolva a memória de todos os nodos de uma lista L ao sistema e reinicialize a lista 18 9

Bibliografia A. M. Tenembaum et al., Data Structures Using C, Prentice-Hall, 1990 M. T. Goodrich & R. Tamassia, Data Structures and Algorithms in C++/Java, John Wiley & Sons, 2002/2005 N. Ziviani, Projeto de Algoritmos, Thomson, 2a. Edição, 2004 J. L. Szwarcfiter & L. Markenzon, Estruturas de Dados e seus Algoritmos, LTC, 1994 Schildt, H. "C Completo e Total", 3a. Edição, Pearson, 1997 19 10