Métodos Computacionais. Listas Encadeadas

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

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

Módulo 10 Listas Encadeadas

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

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

Lista Encadeada Simples. Métodos Computacionais Victor Casé

Introdução a Programação. Tipos Abstratos de Dados Implementando Pilha e Fila

Atividade de laboratório listas encadeadas simples

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

Listas Lineares. continuando...

Instituto de C. Filas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

REVISÃO DE C. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Estruturas de Dados Aula 12: Outras Implementações de Listas 18/04/2011

Fontes Bibliográficas. Listas Circulares. Função Imprime

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

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

INF1007 Programação 2 9 Pilhas. (c) Dept. Informática - PUC-Rio 1

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

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

Professora Jeane Melo

INF 1007 Programação II

Árvores. Prof. César Melo DCC/ICE/UFAM

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

BCC202 - Estrutura de Dados I

Carlos Eduardo Batista. Centro de Informática - UFPB

Listas Lineares Ordenadas

Estruturas de Dados Aula 11: TAD Pilha

Lista Encadeada (Linked List)

Árvores. Prof. César Melo DCC/ICE/UFAM

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

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

PRIMEIRA AVALIAÇÃO IDENTIFICAÇÃO. Nome: 22/09/2010

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

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

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

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P3 23/06/2010

1. Listas sequenciais versus listas ligadas. Lista sequencial

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

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

Algoritmos e Estruturas de dados

Lista: conceito, representação e algoritmos

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

SCC 202 Prova 1. 28/9/2010 Resolução e Comentários

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

Estrutura de Dados Listas

Listas Encadeadas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Linguagem C: Listas Encadeadas

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 9

12. Filas Interface do tipo fila

Estruturas de Dados Filas

Lista: conceito, representação e algoritmos

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

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

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

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

ESTRUTURA DE DADOS (TCC )

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

Listas Lineares. Livro Projeto de Algoritmos Nívio Ziviani Capítulo 3 Seção 3.1

Estrutura de Dados II. Prof. Sérgio Portari

Listas (Parte 1) Túlio Toffolo BCC202 Aula 09 Algoritmos e Estruturas de Dados I

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

BCC202 - Estrutura de Dados I

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

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

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas

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

Árvore Binária de Busca. Prof. César Melo

Aula 05: Listas Encadeadas. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

GRAFOS E DIGRAFOS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

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

INF 1007 Programação II

Métodos Computacionais. Fila

Tipos Abstratos de Dados. Estrutura de Dados

Listas Encadeadas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

ESTRUTURA DE DADOS E ALGORITMOS. Árvores Binárias de Busca. Cristina Boeres

Prof. Jesus José de Oliveira Neto

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

Módulo 5 Vetores e Alocação Dinâmica

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

INF P4-12/12/09 Questão 1 Nome:

Árvores Binária de Busca. Prof. César Melo DCC/ICE/UFAM

Lista: conceito, representação e algoritmos

Ponteiros. Baseado nos slides do Prof. Mauro.

10. Listas Encadeadas

DAINF - Departamento de Informática

AVALIAÇÃO DE CONHECIMENTO ESPECÍFICO

INF 1007 Programação II

Estrutura de Dados. Carlos Eduardo Batista. Centro de Informática - UFPB

LISTAS LINEARES. Estrutura de Dados

ponteiros INF Programação I Prof. Roberto Azevedo

struct Nodo { int struct Nodo struct Nodo typedef struct Nodo *PNodo; int ConstruirLista (PNodo *H, PNodo *T) { int Criar

Transcrição:

Métodos Computacionais Listas Encadeadas

Vetores Declaração de vetor implica na especificação de seu tamanho Não se pode aumentar ou diminuir tamanho Outra alternativa no uso de vetores é alocar dinamicamente o espaço necessário e guardar endereço inicial do vetor Porém, depois de determinado o tamanho do vetor, não podemos liberar posição de memória arbitrária Não se pode diminuir tamanho do vetor Possível desperdício ou falta de memória! 2

Listas Encadeadas Objetivo Permite o armazenamento de um conjunto de dados, de forma similar a um vetor, porém com maior flexibilidade: Alocação dinâmica de memória (permite o crescimento ou diminuição do conjunto de forma dinâmica, evitando o desperdício ou a falta de memória). 3

Listas Encadeadas Principais Características Para cada novo elemento inserido na lista, alocase um espaço de memória para armazená-lo Junto a cada elemento deve-se armazenar o ponteiro (endereço) para o próximo elemento (elemento + ponteiro = nó da lista) Caso não exista próximo elemento, o ponteiro para o próximo elemento é NULL O acesso aos elementos é sempre seqüencial Não se pode garantir que os elementos ocuparão um espaço de memória contíguo (não se pode localizar elementos com base em um deslocamento constante). 4

Representação de Listas Encadeadas primeiro Informação armazenada no nó da lista Armazena o endereço do próximo nó Armazena endereço nulo info1 info2 info3 fim struct lista { int info ; /* info pode ser de qualquer tipo */ struct lista *prox; /* campo que armazena endereço do próximo elemento */ ; typedef struct lista Lista ; 5

Criando Listas Encadeadas Vazias Pode-se pensar em duas formas de escrever uma função para criar uma lista vazia: Criação de um nó sem nenhuma informação Retornar um endereço nulo Abordagem que será trabalhada Mais simples /* função de criação: retorna uma lista vazia */ Lista* lst_cria(){ return NULL ; 6

Inserção de Elementos em Listas Encadeadas Diferentes formas de inserir um elemento na lista: No começo Mais simples No fim Neste caso deve-se percorrer a lista toda 7

Inserindo Elementos em Listas Encadeadas primeiro info1 Novo info2 info3 info4 /* inserção início da lista: retorna a lista atualizada */ Lista* lst_insere(lista* lis,int i){ Lista* novo = (Lista*) malloc(sizeof(lista)); novo->info = i ; novo->prox = lis ; return novo ; Endereço do começo da lista 8

Usando Funções de Criação e Inserção de Listas Encadeadas int main() { Lista* lis;/* declara uma lista não inicializada */ lis = lst_cria();/*cria e inicializa lista como vazia */ lis = lst_insere(lis,23); /* insere o elemento 23 */ lis = lst_insere(lis,45); /* insere o elemento 45 */... return 0 ; Não esquecer de atualizar a variável que representa a lista a cada inserção! 9

Imprimindo Listas Encadeadas void lst_imprime(lista* lis){ Lista* p; /*variável auxiliar para percorrer a lista */ for(p = lis; p!= NULL; p = p->prox){ printf ( info = %d\n, p->info ) ; Laço para percorrer todos os nós da lista 10

Verificando se a Lista Está Vazia /* função vazia: retorna 1 se vazia ou 0 se não vazia */ int lst_vazia(lista* lis){ if (lis == NULL) return 1; else return 0; /* versão compacta da função lst_vazia */ int lst_vazia ( Lista* lis ){ return(lis == NULL) ; 11

Buscando um Elemento em Listas Encadeadas /* função busca: busca um elemento na lista */ Lista* lst_busca(lista* lis,int v){ Lista *p ; for (p = lis; p!= NULL; p = p->prox) { if (p->info == v) return p ; return NULL; /* não achou o elemento */ Se não achou elemento, retorna o endereço nulo! Retorna o endereço do primeiro nó que contém o elemento buscado 12

primeiro Removendo Elementos de Listas Encadeadas Dois casos devem ser tratados para a remoção de um elemento da lista info1 info2 info3 info4 Remoção do primeiro elemento da lista primeiro info1 info2 info3 info4 Remoção de um elemento no meio da lista 13

Removendo Elementos de Listas Encadeadas Lista* lst_retira(lista* lis,int v){ Lista* ant = NULL; /* guarda elementoanterior */ Lista* p = lis;/* para percorrer a lista */ while(p!= NULL && p->info!= v){ ant = p ; p = p->prox ; /* verifica se achou o elemento */ if (p == NULL) return lis; Procura elemento na lista,guardando anterior Não achou, retorna lista original if (ant == NULL) Retira elemento do início lis = p->prox; else ant->prox = p->prox; Retira elemento do meio free(p) ; return lis ; 14

Liberando Listas Encadeadas void lst_libera(lista* lis){ Lista* p = lis ; while(p!= NULL ) { Lista* t = p->prox; free(p); /* libera a memória apontada por p */ p = t; /* faz p apontar para o próximo */ Guarda o endereço do próximo nó para poder libera-lo na próxima iteração 15

TAD Lista de Inteiros /* interface dada por lista.h */ /* TAD: lista de inteiros */ typedef struct lista Lista ; Lista* lst_cria() ; void lst_libera(lista* lis); Lista* lst_insere(lista* lis,int i) ; Lista* lst_retira(lista* lis,int v) ; int lst_vazia(lista* lis); Lista* lst_busca(lista* lis,int v); void lst_imprime(lista* lis); 16

TAD Lista de Inteiros #include <stdio.h> #include lista.h int main() { Lista* lis ; /* declara uma lista não iniciada */ lis = lst_cria(); /*inicia lista vazia */ lis = lst_insere(lis,23); /* insere 23 */ lis = lst_insere(lis,45); /* insere 45 */ lis = lst_insere(lis,56); /* insere 56 */ lis = lst_insere(lis,78); /* insere 78 */ lst_imprime(lis); /* imprime: 78 56 45 23 */ lis = lst_retira(lis,78); lst_imprime(lis); /* imprime: 56 45 23 */ lis = lst_retira(lis,45); lst_imprime(lis); /* imprime: 56 23 */ lst_libera(lis); return 0 ; 17

Inserindo Elementos de Forma Ordenada em Listas Encadeadas Já sabemos inserir no começo da lista Problema: Como inserir no meio da lista? primeiro info1 info2 info3 info4 Novo 18

Inserindo Elementos de Forma Ordenada em Listas Encadeadas Lista* lst_insere_ordenado(lista* lis,int v ) { Lista* novo ; Lista* ant = NULL; Lista* p = lis ; while(p!= NULL && p->info < v) { ant = p ; p = p->prox; novo = (Lista*)malloc(sizeof(Lista)); novo->info = v ; if (ant == NULL) { novo->prox = lis ; lis = novo ; else { novo->prox = ant->prox ; ant->prox = novo ; return lis ; Procura posição do elemento Criando um novo nó Inserindo no começo Inserindo no meio 19

Comparando Listas Encadeadas int lst_igual(lista* lst1,lista* lst2){ Lista* p1 ; /* ponteiro para percorrer lst1 */ Lista* p2 ; /* ponteiro para percorrer lst2 */ for(p1 = lst1,p2 = lst2; p1!=null && p2!=null; p1=p1->prox,p2=p2->prox){ if(p1->info!= p2->info ) return 0; return(p1 == p2) ; 20

Implementação Recursiva de Listas Uma lista pode ser definida recursivamente como: Lista vazia; ou Elemento seguido de uma (sub)lista. lista φ info1 Sublista 21

Implementação Recursiva de Listas Impressão Recursiva void lst_imprime_recursiva(lista* lis){ if (!lst_vazia(lis)) { /* imprime o primeiro elemento */ printf( info: %d\n, lis->info); /* imprime sub_lista */ lst_imprime_recursiva (lis->prox); 22

Implementação Recursiva de Listas Função de remoção recursiva Lista* lst_retira_recursiva (Lista* lis, int v) { if (!lst_vazia(lis)) { if (lis->info == v) { Lista* t = lis; /* temporário para poder liberar */ lis = lis->prox; free(t); else { Verifica se o elemento a ser retirado é o primeiro return l; lis->prox=lst_retira_recursiva(lis->prox,v); Senão retira da sub-lista 23

Implementação Recursiva de Listas Liberando a lista recursivamente void lst_libera_recursiva (Lista* lis) { if (!lst_vazia(lis)) { lst_libera_recursiva(lis->prox); free(lis); 24

Implementação Recursiva de Listas Comparando listas recursivamente int lst_igual_recursiva (Lista* lis1, Lista* lis2) { if (lis1 == NULL && lis2 == NULL) return 1; else if (lis1 == NULL lis2 == NULL) else return 0; return lis1->info == lis2->info && lst_igual_recursiva(lis1->prox, lis2->prox); 25