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

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

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

Módulo 10 Listas Encadeadas

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

Métodos Computacionais. Listas Encadeadas

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

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

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

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

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

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

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

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

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

Lista Encadeada (Linked List)

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

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

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

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

INF 1007 Programação II

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

Listas Lineares. continuando...

Professora Jeane Melo

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

Lista Encadeada Simples. Métodos Computacionais Victor Casé

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

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

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

1. Listas sequenciais versus listas ligadas. Lista sequencial

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Estruturas de Dados Filas

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

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

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

Atividade de laboratório listas encadeadas simples

12. Filas Interface do tipo fila

Filas. Prof. Túlio Toffolo BCC202 Aula 12 Algoritmos e Estruturas de Dados I

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

Estruturas de Dados Aula 11: TAD Pilha

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

Linguagem C: Listas Encadeadas

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

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

BCC202 - Estrutura de Dados I

DAINF - Departamento de Informática

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

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

Estrutura de Dados Listas

INF 1620 P2-23/10/04 Questão 1 Nome:

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

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

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

Algoritmos e Estruturas de dados

Estrutura de Dados II. Prof. Sérgio Portari

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

Lista: conceito, representação e algoritmos

BCC202 - Estrutura de Dados I

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

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

INF1007: Programação 2. 4 Tipos Estruturados. 10/23/09 (c) Dept. Informática - PUC-Rio 1

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

Lista: conceito, representação e algoritmos

Programação II. Filas (Queues) Bruno Feijó Dept. de Informática, PUC-Rio

Carlos Eduardo Batista. Centro de Informática - UFPB

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

Lista de Exercícios sobre Listas Implementadas por Encadeamento

LISTAS LINEARES. Estrutura de Dados

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

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

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

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 de Exercícios 04

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

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

2. Considerando as seguintes declarações de uma lista encadeada

Listas ligadas/listas encadeadas

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

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

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

Métodos Computacionais. Fila

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

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

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

Listas Lineares Ordenadas

UNIVERSIDADE DA BEIRA INTERIOR

Aula 7 Encadeamento de Memória

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

Aula 11 Pilha Dinâmica. prof Leticia Winkler

Estruturas de Dados Aula 17: Estruturas Genéricas 15/06/2011

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

Algoritmos e Estruturas de Dados Prof. Osório PIP/CA - Aula 05 Pag.: 1

Programação II. Busca em Vetor (search) Bruno Feijó Dept. de Informática, PUC-Rio

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

Módulo 8 Tipos Estruturados

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

Transcrição:

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

Vetores vs Estruturas Dinâmicas Vetores (arrays): Ocupa um espaço contíguo de memória Permite acesso randômico Requer pré-dimensionamento de espaço de memória Estruturas Dinâmicas Crescem (ou decrescem) à medida que elementos são inseridos (ou removidos) Exemplo: Listas Encadeadas Outras estruturas: Pilhas Filas

Listas Encadeadas Lista Encadeada é uma sequência de elementos, onde cada elemento tem uma informação armazenada (info) e um ponteiro para o próximo elemento da sequência lst info 1 info 2... info N NULL A maneira mais simples de representar uma lista é pelo ponteiro para o primeiro elemento da sequência Usualmente chamado de head, cabeça, ou simplesmente lst O ponteiro do último elemento é NULL Ela é uma estrutura recursiva (c/ponteiro para a própria estrutura): struct elemento ou "node" int info; ou "* next" struct elemento * prox; ; typedef struct elemento Elemento; struct elemento float info; struct elemento * prox; ; typedef struct elemento Elemento;

Agora, não vá de imediato para o próximo slide! Tente (sem olhar o slide) escrever as seguintes funções: lst_insere, que insere um novo elemento de lista no início da lista lst e retorna uma nova lista (i.e. uma nova cabeça); lst_imprime, que imprime todos os elementos de uma lista lst; main, que monta a seguinte lista: lst 45 23 NULL

Lista de inteiros lst novo insere no início! int main (void) Elemento * lst; Elemento * lst_insere(elemento * lst, int a) Elemento * novo = (Elemento *)malloc(sizeof(elemento)); if (novo!= NULL) novo->info = a; novo->prox = lst; return novo; // declara uma lista não inicializada lst = NULL; // cria e inicializa lista como vazia lst = lst_insere(lst, 23); // insere na lista o elemento 23 lst = lst_insere(lst, 45); // insere na lista o elemento 45 lst_imprime(lst); return 0; lst info 1 info 2 Fazer if (novo == NULL) return NULL também funcionaria. Porém, sempre que possível (e isto não comprometer a legibilidade do código), evitamos múltiplos returns. Um único ponto de saída facilita a análise da função. void lst_imprime(elemento * lst) Elemento * p; for (p = lst; p!= NULL; p = p->prox) printf( info = %d\n, p->info); 45 23 NULL

Agora, sem olhar o próximo slide, tente escrever a função lst_busca que busca o elemento contendo um valor dado e retorna o seu endereço. Esta busca é sequential.

Busca Sequencial Retorna o ponteiro do elemento da lista que contém a informação procurada ou retorna NULL se não a encontrar Elemento * busca (Elemento * lst, int v) Elemento * p; for (p=lst; p!=null; p = p->prox) if (p->info == v) return p; return NULL; /* não achou o elemento */ Aqui fica mais legível e fácil ter múltiplos returns.

Agora, sem olhar o próximo slide, tente escrever a função Elemento * lst_retira(elemento * lst, int a) que retira o primeiro elemento contendo o valor a. Esta é uma função difícil de escrever! Dica: use um ponteiro auxiliar ant, que sempre guarda o endereço do elemento imediatamente anterior ao elemento corrente. E considere que há duas situações distintas (o valor a ser retirado está na cabeça da lista ou o valor está em um elemento interno).

Remover um Elemento Elemento * lst_retira(elemento * lst, int a) Elemento * ant = NULL; /* ponteiro para elemento anterior */ Elemento * p = lst; /* ponteiro para percorrer a lista */ /* procura elemento na lista, guardando anterior */ while (p!= NULL && p->info!= a) ant = p; p = p->prox; if (p == NULL) return lst; /* não achou: retorna lista original */ /* retira elemento */ if (ant == NULL) /* retira elemento do inicio */ lst = p->prox; else /* retira elemento do meio da lista */ ant->prox = p->prox; free(p); return lst; lst lst a

Agora, escreva as seguintes funções: lst_libera, que destrói a lista, liberando todos os elementos alocados; lst_igual, que testa se duas listas são iguais lst_insere_ordenado que, dada uma lista ordenada, insere um novo valor dado no local certo

Libera a Lista e Testa Igualdade Destrói a lista, liberando todos os elementos alocados void lst_libera(elemento * lst) Elemento * p = lst, * t; while (p!= NULL) t = p->prox; /* guarda referência p/ próx. elemento */ free(p); /* libera a memória apontada por p */ p = t; /* faz p apontar para o próximo */ Igualdade requer dois ponteiros int lst_igual(elemento * lst1, Elemento * lst2) Elemento * p1; /* ponteiro para percorrer l1 */ Elemento * p2; /* ponteiro para percorrer l2 */ 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; Esta comparação considera o caso das listas de tamanho diferente. Se os dois chegaram ao NULL (ou já eram ambos NULL) significa que são do mesmo tamanho. Se um é NULL e o outro não, então têm tamanhos diferentes! Poderia também ser: return p1==null && p2==null;

Insere Ordenado Elemento * lst_insere_ordenado(elemento * lst, int a) Elemento * novo; Elemento * ant = NULL; /* ponteiro para elemento anterior */ Elemento * p = lst; /* ponteiro para percorrer a lista */ /* procura posição de inserção */ while (p!= NULL && p->info < a) ant = p; p = p->prox; /* cria novo elemento */ novo = (Elemento *) malloc(sizeof(elemento)); novo->info = a; /* encadeia elemento */ if (ant == NULL) /* insere elemento no início */ novo->prox = lst; lst = novo; else /* insere elemento no meio da lista */ novo->prox = ant->prox; ant->prox = novo; return lst;

LISTAS FUNÇÕES RECURSIVAS

Funções de Lista Recursivas int lst_vazia(elemento * lst) return (lst == NULL); void lst_libera(elemento * lst) if (!lst_vazia(lst)) lst_libera(lst->prox); free(lst); int lst_igual(elemento * lst1, Elemento * lst2) if (lst1 == NULL && lst2 == NULL) return 1; else if (lst1 == NULL lst2 == NULL) return 0; else return (lst1->info == lst2->info) && lst_igual(lst1->prox,lst2->prox); lst_imprime lst_imprimeinvertida lst_libera lst_igual lst_retira void lst_imprime(elemento * lst) if (! lst_vazia(lst)) printf( info: %d\n,lst->info); // 1º. lst_imprime(lst->prox); void lst_imprimeinvertida(elemento * lst) Você pode usar diretamente lst!= NULL no lugar de!lst_vazia(lst) if (!lst_vazia(lst)) lst_imprimeinvertida(lst->prox); printf( info: %d\n,lst->info); Elemento * lst_retira(elemento * lst, int a) Elemento * t; if (!lst_vazia(lst)) if (lst->info == a) t = lst; lst = lst->prox; free(t); else lst->prox= lst_retira(lst->prox,a); return lst;

LISTAS DE TIPOS ESTRUTURADOS

Listas de Tipos Estruturados A informação associada a cada elemento pode ser mais complexa, sem alterar o encadeamento dos elementos As funções apresentadas para listas de inteiros podem ser facilmente adaptadas para tratar listas de outros tipos (as diferenças são pequenas!) O campo de informação pode ser representado por um ponteiro para uma estrutura, ao invés da estrutura em si. Desta maneira, independente da informação armazenada na lista, a estrutura do elemento é sempre composta por um ponteiro para a informação e um ponteiro para o próximo elemento da lista struct elemento Aluno * info; struct elemento * prox; ; Escolha nomes apropriados para as funções de serviço, e.g.: float aluno_obtermedia(elemento * p) e int aluno_obterfaltas(elemento * p) para retornar a média e o número de faltas de uma lista de alunos como um tipo estruturado: struct aluno float media; int faltas; ;

Listas de Tipos Estruturados sem Ponteiros A alternativa que não usa um ponteiro para a informação deve incluir todos os atributos da informação dentro da própria estrutra do elemento de lista: struct elemento float media; int faltas; struct elemento * prox; ; Treine repetindo exercícios usando este tipo de definição de listas!

LISTAS COMO ESTRUTURAS

Lista como Estrutura Uma Lista pode ser uma estrutura contendo um ponteiro para o primeiro elemento e um outro ponteiro para o último elemento. Esta forma é apropriada para Listas Duplamente Encadeadas, para Filas e para um assunto mais avançado chamado de Tipo Abstrato de Dados (TAD). Esta forma também facilita a definição de lista vazia. lst first last info 1 info 2... info N NULL struct lista Elemento * first; Elemento * last; ; typedef struct lista Lista; Reescreva todas as funções já apresentadas (em slides e exercícios) note que uma lista é vazia quando os dois ponteiros são NULL Uma outra variante é incluir o número de elementos: first last n

LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS

Listas Circulares e Duplamente Encadeadas Listas Circulares Listas Duplamente Encadeadas lst lst Info 1 Info 2 Info 3 NULL Info 1 Info 2 Info 3 NULL Elemento2 * lst2_insere(elemento2 * lst, int a) Elemento2 * novo = (Elemento2 *) malloc(sizeof(elemento2)); novo->info = a; novo->prox = lst; novo->ant = NULL; /* verifica se lista não estava vazia */ if (lst!= NULL) lst->ant = novo; return novo; Função busca é idêntica ao caso de lista encadeada simples Implemente com [first,last] e [first,last,n] também. struct elemento2 int info; struct elemento2 * ant; struct elemento2 * prox; ; typedef struct elemento2 Elemento2;