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

Documentos relacionados
Lista Encadeada: algoritmos. 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!

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

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

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

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

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

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

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

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Lista Encadeada (Linked List)

Métodos Computacionais. Listas Encadeadas

Listas Lineares. continuando...

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

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

Árvores & Árvores Binárias

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

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

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

LISTAS LINEARES. Estrutura de Dados

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

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

Listas Estáticas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Listas Lineares Ordenadas

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

Professora Jeane Melo

Estruturas de Dados Aula 11: TAD Pilha

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

Algoritmos e Estruturas de dados

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

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

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

Estrutura de Dados Listas

AULA 6. Conceitos. Melhores momentos. Conceitos. Conceitos. Conceitos. Conceitos

Listas ligadas/listas encadeadas

Lista: conceito, representação e algoritmos

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

Questão 1: O histograma deve ser: [0, 1, 4, 2, 0, 3, 0,, 0, 2] Exemplo: Para a matriz

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

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

Tipos e Estruturas de Dados Profa. Graça Nunes Lista de Exercícios (Listas Encadeadas, Duplamente Encadeadas e Circulares)

Linguagem C: Listas Encadeadas

1. Listas sequenciais versus listas ligadas. Lista sequencial

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

BCC202 - Estrutura de Dados I

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

BCC202 - Estrutura de Dados I

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

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

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

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

Árvores de Pesquisa (Parte I)

Matrizes Esparsas. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

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

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

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

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

Lista: conceito, representação e algoritmos

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

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

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

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

BCC202 - Estrutura de Dados I

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

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

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

Alocação Dinâmica. Túlio Toffolo BCC202 Aula 02 Algoritmos e Estruturas de Dados I

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

Módulo 10 Listas Encadeadas

Fila. Algoritmos e Estruturas de Dados I

Revisão: Tipo Abstrato de Dados Recursividade

Reinaldo Gomes Alocação Dinâmica

INF 1010 Estruturas de Dados Avançadas. Árvores binárias

UNIVERSIDADE DA BEIRA INTERIOR

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

Árvores & Árvores Binárias

SCC Algoritmos e Estruturas de Dados I

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

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Tipos Abstratos de Dados. Estrutura de Dados

DAINF - Departamento de Informática

SCC Algoritmos e Estruturas de Dados I

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

Algoritmos e Estruturas de Dados I

Listas generalizadas. SCC-202 Algoritmos e Estruturas de Dados I

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

Ponteiros. Prof. Fernando V. Paulovich *Baseado no material do Prof. Gustavo Batista

Carlos Eduardo Batista. Centro de Informática - UFPB

Árvores Binárias de Busca

Aula 14 Listas Duplamente Encadeadas. prof Leticia Winkler

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

Filas Implementação Sequencial

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

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

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

Transcrição:

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

Lista Encadeada Dinâmica Utiliza alocação dinâmica de memória ao invés de arranjos (vetores) pré-alocados. Inserção de elementos na lista: toda memória disponível para o programa durante a execução (heap) Espalhados, cada elemento deve conter o endereço do seu sucessor na lista: campo de ligação contém endereços reais da memória principal Alocação/liberação desses endereços gerenciada pelo S.Op., por meio de comandos da linguagem de programação Linguagem C: malloc e free 2/44

Variável Dinâmica Uma variável criada (e destruída) explicitamente durante a execução do programa Objetivo: Otimizar o uso da Memória Principal Variáveis dinâmicas não são declaradas, pois inexistem antes da execução do programa Ela é referenciada por uma variável ponteiro, que contém o endereço da variável dinâmica A variável ponteiro deve ser declarada Ao declarar uma variável ponteiro, deve-se declarar o tipo de valor que ela referencia 3/44

Lista Dinâmica Endereço nulo (terra): null L: ponteiro para o primeiro elemento (ou null) 4/44

Lista Dinâmica Definição da ED struct list_rec { tipo_elem elem; struct list_rec *lig; ; elem Rec lig typedef struct list_rec Rec; 5/44

Listas Simplesmente Encadeadas nulo (NULL) Lista: typedef struct { int nelem; Rec *head; Lista; L Lista *L; /* Exemplo de Declaração */ 6/44

1) Criação da lista vazia void CriarLista(Lista *L){ L = malloc(sizeof(lista)); L->nelem = 0; L->head = NULL; L 0 /* a constante NULL é parte da biblioteca <stdlib.h> */ 7/44

2) Inserção do primeiro elemento void Insere_Prim(Lista *L, Tipo_elem elem){ Rec *p; p = malloc(sizeof(rec)); p->elem = elem; p->lig = NULL; L->head = p; L->nelem++; 8/44

3) Inserção no início de uma lista void Insere_Inicio(Lista *L, Tipo_elem elem){ Rec *p; p = malloc(sizeof(rec)); p->elem = elem; p->lig = L->head; L->head = p; L->nelem++; 9/44

4) Acesso ao primeiro elemento da lista Tipo_elem Primeiro(Lista *L){ return L->head->elem; 10/44

Quantos elementos tem a lista? int Nelem(Lista *L){ return L->nelem; /* se nelem estiver atualizado */ int Nelem(Lista *L){ Rec *p = L->head; int count = 0; while (p!= NULL){ count ++; p = p->lig; return count; 11/44

versão recursiva int Nelem_rec(Rec *p){ if (p == NULL) return 0; else return 1 + Nelem_rec(p->lig); int Nelem_rec_init(Lista *L){ return Nelem_rec(L->head); 12/44

5 (a) Buscar registro de chave x em lista ordenada versão iterativa Boolean Buscar_ord (Lista *L, Tipo_chave x, Rec *p){ /*Busca por x e retorna TRUE e o endereço (p) de x numa Lista Ordenada, se achar; senão,retorna FALSE */ if(l->nelem == 0) /*Lista vazia, retorna NULL*/ else{ /*...*/ return FALSE; p = L->head; 13/44

while (p!= NULL){ /* enquanto não achar o final */ if (p->elem.chave >= x){ if (p->elem.chave == x)/* achou o registro*/ return TRUE; else /* achou um registro com chave maior*/ return FALSE; else{ p = p->lig; /* achou final da lista*/ return FALSE; 14/44

5 (b) Buscar registro de chave x em lista ordenada (Versão Recursiva) Boolean Busca_ord_rec_init(Lista *L, Tipo_chave x,rec *p){ /*Busca por x e retorna TRUE e o endereço (p) de x numa Lista Ordenada, se achar; senão,retorna FALSE */ if(l->nelem == 0) /*Lista vazia, não achou*/ return FALSE; p = L->head; return Busca_ord_rec(p, &x); Passagem por endereço, mas poderia ser por valor (economiza espaço) Exercício: Implementar uma versão para Lista não ordenada! 15/44

Boolean Busca_ord_rec(Rec *q, Tipo_chave *x){ if (q == NULL) /* chegou no final da lista, sem achar*/ return FALSE; else if (q->elem.chave >= *x){ if (q->elem.chave == *x) /* achou o registro*/ return TRUE; else /* achou um registro com chave maior*/ return FALSE; else return Busca_ord_rec(q->lig, x); 16/44

6) Inserção de elemento v como sucessor do elemento no endereço k 17/44

6) Inserção de elemento v como sucessor do elemento no endereço k void Insere_Depois(Lista *L,Tipo_elem v, Rec *k){ /*k não pode ser null*/ Rec *j = malloc(sizeof(rec)); j->elem = v; j->lig = k->lig; k->lig = j; L->nelem++ Obs.: funciona para inserção após último elemento? 18/44

(b) Inserção do elemento v na lista ordenada L boolean Insere(Lista *L, Tipo_elem v){ /*Insere item de forma a manter a lista ordenada. Retorna true se inseriu; false, se não foi possível inserir*/ if (L->nelem == 0){ /*insere como primeiro elemento*/ insere_prim(l, v); return TRUE; Rec *p = L->head; Rec *pa = NULL; /*...*/ 19/44

while (p!= NULL){ if (p->elem.chave >= v.chave){ if (p->elem.chave == v.chave) /* v já existe na lista*/ return FALSE; else{ if (pa == NULL) /*insere no inicio */ Insere_Inicio(L, v); else{ /*insere no meio*/ Insere_Depois(L, v, pa); return TRUE; else{ pa = p; p = p->lig; /*...*/ 20/44

/*insere no final*/ Insere_Depois(L, v, pa); return TRUE; 21/44

(c) Inserção do elemento v na lista ordenada L (Recursivo) boolean Insere_rec_init(Lista *L, Tipo_elem v){ /*Insere item de forma a manter a lista ordenada. Retorna true se inseriu; false, se não foi possível inserir*/ if (L->nelem == 0){ /*insere como primeiro elemento*/ insere_prim(l, v); return TRUE; Rec *p = L->head; Rec *pa = NULL; return Insere_rec(L, p, pa, &v); 22/44

boolean Insere_rec(Lista *L, Rec *p, Rec *pa, Tipo_elem *v){ if (p == NULL) { /*insere no final */ Insere_Depois(L, *v, pa); return TRUE; if (p->elem.chave == v->chave) /* v já existe na lista*/ return FALSE; if (p->elem.chave > v->chave){ if (pa == NULL) /*insere no inicio */ Insere_Inicio(L, *v); else{ /*insere entre pa e p*/ Insere_Depois(L, *v, pa); return TRUE; return Insere_rec(L, p->lig, p, v); 23/44

7) Remoção do primeiro elemento void Remove_Prim(Lista *L){ /* supõe que a Lista não está vazia */ Rec *p = L->head; L->head = p->lig; free(p); L->nelem--; Obs: funciona no caso de remoção em lista com um único elemento? 24/44

8) Remoção do elemento apontado por j, sucessor do elemento no endereço k 25/44

8) Remoção do elemento apontado por j, sucessor do elemento no endereço k void Elimina_Depois(Lista *L, Rec *k){ Rec *j = k->lig; k->lig = j->lig; free(j); L->nelem--; 26/44

9) Eliminar elemento v de uma lista ordenada L 27/44

9) Eliminar elemento v de uma lista ordenada L boolean Remove(Tipo_elem v, Lista*L){ Rec *p = L->head; Rec *pa = NULL; while (p!= NULL){ if (p->elem.chave < v.chave){ pa = p; p = p->lig; else { if (p->elem.chave > v.chave) /* encontrou elemento com chave maior*/ return FALSE; /*...*/ 28/44

else { /*encontrou o elemento*/ if (pa == NULL) /*remove no inicio*/ Remove_Prim(L); else{ /*remove elemento p*/ Elimina_Depois(L,pa); return TRUE; /*não encontrou o elemento na lista*/ return FALSE; Exercício: Fazer a eliminação de v de lista não ordenada 29/44

10) Impressão da lista void imprime(lista *L){ Rec *p; p = L->head; while (p!= NULL){ impr_elem(p->elem); p = p->lig; void impr_elem(tipo_elem t){ printf("chave: %d", t.chave); printf("info: %s", t.info.valor); 30/44

Exercícios Explique o que acontece nas atribuições abaixo (dica: use desenhos) a) p->lig = q; b) p->lig = q->lig; c) p->info = q->info; d) p = q; e) p->lig = nil; f) *p = *q; g) p = p->lig; h) p = (p->lig)->lig; 31/44

Elaborar os seguintes TADs, usando alocação dinâmica. Implementar esse TAD na linguagem C usando estrutura modular. Lista Encadeada Ordenada Lista Encadeada Não-ordenada 32/44

Exercícios Dada uma lista ordenada L1 encadeada alocada dinamicamente (i.e., implementada utilizando pointer), escreva as operações: Verifica se L1 está ordenada ou não (a ordem pode ser crescente ou decrescente) Faça uma cópia da lista L1 em uma outra lista L2 Faça uma cópia da Lista L1 em L2, eliminando elementos repetidos inverta L1 colocando o resultado em L2 inverta L1 colocando o resultado na própria L1 intercale L1 com a lista L2, gerando a lista L3 (L1, L2 e L3 ordenadas) 33/44

Exercícios Escreva um programa que gera uma lista L2, a partir de uma lista L1 dada, em que cada registro de L2 contém dois campos de informação elem contém um elemento de L1, e count contém o número de ocorrências deste elemento em L1 Escreva um programa que elimine de uma lista L dada todas as ocorrências de um determinado elemento (L ordenada) Assumindo que os elementos de uma lista L são inteiros positivos, escreva um programa que informe os elementos que ocorrem mais e menos em L (forneça os elementos e o número de ocorrências correspondente) 34/44