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

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

Módulo 10 Listas Encadeadas

Métodos Computacionais. Listas Encadeadas

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

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

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

INF 1007 Programação II

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

Tipos Abstratos de Dados (TAD)

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

Estruturas de Dados Filas

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

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

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

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Lista Encadeada (Linked List)

Linguagem C: Listas Encadeadas

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

Linguagem C: Ordenação

Estruturas de Dados Aula 14: Recursão 19/05/2011

Módulo 14 - Estruturas genéricas

Linguagem C: Árvores Binarias

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

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

Professora Jeane Melo

Programação de Computadores II. Cap. 5 Vetores

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

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

Métodos Computacionais. Fila

Listas Lineares Ordenadas

Linguagem C: Árvores AVL

INF 1007 Programação II

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

1. Listas sequenciais versus listas ligadas. Lista sequencial

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

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

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

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

struct Nodo { int struct Nodo typedef struct Nodo *PNodo; PNodo ConstruirPilha () { int PNodo Criar printf scanf while Push printf scanf return

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

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

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

Linguagem C: Elementos fundamentais

DAINF - Departamento de Informática

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

INF1007: Programação 2 10 Árvores Binárias. (c) Dept. Informática - PUC-Rio 1

Programação de Computadores II. Cap. 9 Tipos Abstratos de Dados (TAD)

Árvore Binária Exemplo de Implementação

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

Árvores & Árvores Binárias

Aula 11 Pilha Dinâmica. prof Leticia Winkler

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

10. Listas Encadeadas

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

Módulo 4. Listas Encadeadas. Algoritmos e Estruturas de Dados II C++ (Rone Ilídio)

ÁRVORES E ÁRVORE BINÁRIA DE BUSCA

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

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

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

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

Estrutura de Dados Listas

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

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

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

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

Arvores, Percursos não recursivos, Arvores heterogêneas. Aula 19

Árvores Binárias de Busca

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

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

ÁRVORE BINÁRIA DE BUSCA

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

Árvores. Sérgio Carlos Portari Júnior

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

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

Árvores Binárias de Busca

J. L. Rangel 1. provar que uma árvore binária de altura h tem, no mínimo, h+1 nós, e, no máximo, 2 h+1 1.

Estrutura de Dados II. Prof. Sérgio Portari

SUMÁRIO. Fundamentos Árvores Binárias Árvores Binárias de Busca

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

INF 1620 P3-25/11/05 Questão 1 Nome:

Estruturas de Dados I

AVALIAÇÃO DE CONHECIMENTO ESPECÍFICO

INF1007: Programação Funções Recursivas. 12/03/2014 (c) Dept. Informática - PUC-Rio 1

INF 1620 P4-06/12/02 Questão 1 Nome:

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

Estruturas de Dados I

EAD Árvore árvore binária

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS TURMA 2008/1 2 PERÍODO MÓDULO 3 AVALIAÇÃO MP2 DATA 2/10/2008 ESTRUTURAS DE DADOS 2008/2

Filas. Nesta aula veremos o ADT fila Em um computador existem muitas filas esperando pela impressora, acesso ao disco ou, num sistema timesharing,

Módulo 18 - Tabelas de Dispersão

BCC202 - Estrutura de Dados I

Transcrição:

Instituto de C Linguagem C: Listas Luis Martí Instituto de Computação Universidade Federal Fluminense lmarti@ic.uff.br - http://lmarti.com

Listas Encadeadas Definição Funções básicas Tópicos Principais Listas Ordenadas Implementações recursivas 26/02/14 Estrutura de Dados I 2

Listas Encadeadas Estruturas de dados dinâmicas: crescem (ou decrescem) à medida que elementos são inseridos (ou removidos) Exemplo: listas encadeadas: amplamente usadas para implementar outras estruturas de dados 26/02/14 Estrutura de Dados I 3

Listas Encadeadas lst Info1 Info2 Info3... NULL InfoN Lista encadeada: seqüência encadeada de elementos, chamados de nós da lista nó da lista é representado por dois campos: a informação armazenada e o ponteiro para o próximo elemento da lista a lista é representada por um ponteiro para o primeiro nó o ponteiro do último elemento é NULL 26/02/14 Estrutura de Dados I 4

Listas Encadeadas struct elemento { int info;... void* struct prox; elemento* prox; ; typedef struct elemento Elemento; info info 26/02/14 Estrutura de Dados I 5

Exemplo: Lista de inteiros struct elemento { int info;... void* struct prox; elemento* prox; ; typedef struct elemento Elemento; Lista é uma estrutura auto-referenciada, pois o campo prox é um ponteiro para uma próxima estrutura do mesmo tipo. uma lista encadeada é representada pelo ponteiro para seu primeiro elemento, do tipo Elemento* 26/02/14 Estrutura de Dados I 6

Listas Encadeadas de inteiros: Criação /* função de criação: retorna uma lista vazia */ Elemento* lst_cria (void) { return NULL; NULL Cria uma lista vazia, representada pelo ponteiro NULL 26/02/14 Estrutura de Dados I 7

Listas encadeadas de inteiros: Inserção aloca memória para armazenar o elemento encadeia o elemento na lista existente L Novo Info1 Info2 Info3 /* inserção no início: retorna a lista atualizada */ Elemento* lst_insere (Elemento* lst, int val) { Elemento* novo = (Elemento*) malloc(sizeof(elemento)); novo->info = val; novo->prox = lst; return novo; 26/02/14 Estrutura de Dados I 8

Listas Encadeadas: exemplo cria uma lista inicialmente vazia e insere novos elementos int main (void) { Elemento* lst; /* declara uma lista não inicializada */ lst = lst_cria(); /* 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 */... return 0; deve-se atualizar a variável que representa a lista a cada inserção de um novo elemento. lst 45 23 26/02/14 Estrutura de Dados I 9

Listas Encadeadas: impressão Imprime os valores dos elementos armazenados /* função imprime: imprime valores dos elementos */ void lst_imprime (Elemento* lst) { Elemento* p; for (p = lst; p!= NULL; p = p->prox) printf( info = %d\n, p->info); lst p p p p p Info1 Info2 Info3... InfoN 26/02/14 Estrutura de Dados I 10

Listas Encadeadas: Teste de vazia Retorna 1 se a lista estiver vazia ou 0 se não estiver vazia /* função vazia: retorna 1 se vazia ou 0 se não vazia */ int lst_vazia (Elemento* lst) { return (lst == NULL); 26/02/14 Estrutura de Dados I 11

Listas Encadeadas: busca recebe a informação referente ao elemento a pesquisar retorna o ponteiro do nó da lista que representa o elemento, ou NULL, caso o elemento não seja encontrado na lista /* função busca: busca um elemento na lista */ 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 */ 26/02/14 Estrutura de Dados I 12

Listas Encadeadas: remover um elemento recebe como entrada a lista e o valor do elemento a retirar atualiza o valor da lista, se o elemento removido for o primeiro lst Info1 Info2 Info3 caso contrário, apenas remove o elemento da lista lst Info1 Info2 Info3 26/02/14 Estrutura de Dados I 13

/* função retira: retira elemento da lista */ Elemento* lst_retira (Elemento* lst, int val) { 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!= val) { ant = p; p = p->prox; /* verifica se achou elemento */ 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; 26/02/14 Estrutura de Dados I 14

Listas Encadeadas: Libera a lista 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 */ 26/02/14 Estrutura de Dados I 15

Listas Encadeadas Ordenadas Manutenção da lista ordenada função de inserção percorre os elementos da lista até encontrar a posição correta para a inserção do novo lst Info1 Info2 Info3 Info4 Novo Novo 26/02/14 Estrutura de Dados I 16

/* função insere_ordenado: insere elemento em ordem */ Elemento* lst_insere_ordenado (Elemento* lst, int val) { 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 < val) { ant = p; p = p->prox; /* cria novo elemento */ novo = (Elemento*) malloc(sizeof(elemento)); novo->info = val; /* 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; 26/02/14 Estrutura de Dados I 17

Definição recursiva de lista uma lista é uma lista vazia; ou um elemento seguido de uma (sub-)lista lst Info1 Sub-lista 26/02/14 Estrutura de Dados I 18

Exemplo - Função recursiva para imprimir uma lista se a lista for vazia, não imprima nada caso contrário, imprima a informação associada ao primeiro nó, dada por lst->info imprima a sub-lista, dada por lst->prox, chamando recursivamente a função 26/02/14 Estrutura de Dados I 19

Função imprime recursiva /* Função imprime recursiva */ void lst_imprime_rec (Elemento* lst) { if (! lst_vazia(lst)) { /* imprime primeiro elemento */ printf( info: %d\n,lst->info); /* imprime sub-lista */ lst_imprime_rec(lst->prox); 26/02/14 Estrutura de Dados I 20

Função imprime recursiva invertida /* Função imprime recursiva invertida */ void lst_imprime_rec (Elemento* lst) { if (!lst_vazia(lst) ) { /* imprime sub-lista */ lst_imprime_rec(lst->prox); /* imprime ultimo elemento */ printf( info: %d\n,lst->info); 26/02/14 Estrutura de Dados I 21

Exemplo - função para retirar um elemento da lista retire o elemento, se ele for o primeiro da lista (ou da sub-lista) caso contrário, chame a função recursivamente para retirar o elemento da sub-lista 26/02/14 Estrutura de Dados I 22

Lista: Retira recursiva /* Função retira recursiva */ Elemento* lst_retira_rec (Elemento* lst, int val) { Elemento* t; if (!lst_vazia(lst)) { /* verifica se elemento a ser retirado é o primeiro */ if (lst->info == val) { t = lst; /* temporário para poder liberar */ lst = lst->prox; free(t); else { /* retira de sub-lista */ lst->prox = lst_retira_rec(lst->prox,val); return lst; é necessário reatribuir o valor de l->prox na chamada recursiva, já que a função pode alterar a sub-lista 26/02/14 Estrutura de Dados I 23

Igualdade de listas int lst_igual (Elemento* lst1, Elemento* lst2); implementação não recursiva percorre as duas listas, usando dois ponteiros auxiliares: se duas informações forem diferentes, as listas são diferentes ao terminar uma das listas (ou as duas): se os dois ponteiros auxiliares são NULL, as duas listas têm o mesmo número de elementos e são iguais 26/02/14 Estrutura de Dados I 24

Listas iguais: não recursiva 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; 26/02/14 Estrutura de Dados I 25

Igualdade de listas (recursiva) int lst_igual (Elemento* lst1, Elemento* lst2); implementação recursiva se as duas listas dadas são vazias, são iguais se não forem ambas vazias, mas uma delas é vazia, são diferentes se ambas não forem vazias, teste se informações associadas aos primeiros nós são iguais e se as sub-listas são iguais 26/02/14 Estrutura de Dados I 26

Listas iguais: recursiva 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); 26/02/14 Estrutura de Dados I 27

Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004) Capítulo 10 Listas Encadeadas 26/02/14 Estrutura de Dados I 28

Material adaptado por Luis Martí a partir dos slides de José Viterbo Filho que forem elaborados por Marco Antonio Casanova e Marcelo Gattas para o curso de Estrutura de Dados para Engenharia da PUC-Rio, com base no livro Introdução a Estrutura de Dados, de Waldemar Celes, Renato Cerqueira e José Lucas Rangel, Editora Campus (2004).