Listas ligadas/listas encadeadas

Documentos relacionados
Estruturas de dados elementares

Listas Ligadas (Encadeadas) Listas Simplesmente Encadeadas

Tipos abstratos de dados; pilhas e filas

Algoritmos e Estruturas de Dados: Lista Duplamente Encadeada

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

Atividade de laboratório listas encadeadas simples

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

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

Lista Encadeada (Linked List)

Filas de prioridade e heapsort

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

Algoritmos e Estruturas de dados

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

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

Estrutura de Dados I Bacharelado em Sistemas de Informação FACOM UFU Lista de Exercícios

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

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

Listas Lineares. continuando...

1 Exercícios com ponteiros

Aula 17: Ponteiros e Alocação Dinâmica em C

Carlos Eduardo Batista. Centro de Informática - UFPB

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas

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).

INF 1007 Simulado P2 Nome: Instruções

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Estruturas de Dados Aula 11: TAD Pilha

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

Ponteiros e Tabelas. K&R: Capítulo 5

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

Linguagem C: Listas Encadeadas

1. Se v é um vetor, qual a diferença conceitual entre as expressões v[70] e v+70? [2 ponto]

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

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

Alocação Dinâmica de Memória

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

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

1. Listas sequenciais versus listas ligadas. Lista sequencial

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000

BCC202 - Estrutura de Dados I

INF 1620 P3-21/06/08 Questão 1 Nome:

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

Representações de Grafos

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

Pilhas e Filas Encadeadas. Algoritmos e Estruturas de Dados I

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

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

INF 1620 P3-02/07/02 Questão 1 Nome:

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

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

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P4 07/12/2010

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

Linguagem C: Ponteiros - Alocação Dinâmica

Algoritmos e Estruturas de Dados I

Módulo 10 Listas Encadeadas

TAD: Tipo Abstrato de Dados (parte 2)

Algoritmos e Estruturas de Dados

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

TAD: Tipo Abstrato de Dados (parte 2)

Instituto Superior Técnico Introdução aos Algoritmos e Estruturas de Dados

INF 1620 P2-14/10/05 Questão 1 Nome:

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

Transcrição:

1 Listas ligadas/listas encadeadas Leitura recomendada: http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html

2 Processamento elementar de listas Definição mais restritiva (tipo de lista possivelmente mais comum): Definição 1. Uma lista ligada é Λ (ponteiro NULL) ou um ponteiro para uma célula contendo um item e um ponteiro para uma lista ligada. Fim de lista: última célula contém Λ Célula: typedef struct node *link; struct node { Item item; link next; ;

3 Processamento elementar de listas Exemplo: varredura de um vetor v[] for (i = 0; i < N; i++) visit(v[i]); Exemplo: varredura de uma lista t for (s = t; s!= NULL; s = s->next) visit(s->item); Equivalente: for (s = t; s; s = s->next) visit(s->item);

4 Processamento elementar de listas Criação (e impressão) de uma lista ligada de N números aleatórios entre 0 e 999: link t = malloc(sizeof *t), x = t; t->item = rand() % 1000; for (i = 2; i <= N; i++) { x = (x->next = malloc(sizeof *x)); x->item = rand() % 1000; x->next = NULL; <imprima lista t>

5 Processamento elementar de listas Exemplo: inversão de uma lista /* prog3.10.c */ link reverse(link x) { link t, y = x, r = NULL; while (y!= NULL) { t = y->next; y->next = r; r = y; y = t; return r; Exercício 2. Escreva um programa ex como segue: (a) ex recebe como argumento um inteiro N > 0; (b) ex gera uma lista com N inteiros aleatórios; (c) ex imprime esses inteiros varrendo a lista gerada; (d) ex então inverte a lista com uma chamada da função reverse() acima e, finalmente, (e) ex imprime os inteiros novamente, varrendo a lista invertida.

6 O problema de Josephus Veja http://mathworld.wolfram.com/josephusproblem.html

7 O problema de Josephus /* prog3.9.c */ #include <stdio.h> #include <stdlib.h> typedef struct node *link; struct node { int item; link next; ;

8 O problema de Josephus /* prog3.9.c */ [...] int main(int argc, char *argv[]) { int i, N = atoi(argv[1]), M = atoi(argv[2]); link t = malloc(sizeof *t), x = t; t->item = 1; t->next = t; for (i = 2; i <= N; i++) { x = (x->next = malloc(sizeof *x)); x->item = i; x->next = t;

9 O problema de Josephus /* prog3.9.c */ [...] while (x!= x->next) { for (i = 1; i < M; i++) x = x->next; x->next = x->next->next; printf("%d\n", x->item); return 0; O que acontece com as células eliminadas da lista?

10 O problema de Josephus, bis /* prog3.9b.c */ [...] while (x!= x->next) { for (i = 1; i < M; i++) x = x->next; t = x->next; x->next = x->next->next; free(t); printf("%d\n", x->item); return 0;

11 Exercício Exercício 3. Suponha que temos uma lista com elemento inicial apontada por head e fim de lista indicada por NULL. O que está errado com o seguinte código para liberar esta lista? for (p = head; p!= NULL; p = p->next) free(p); Compare: for (p = head; p!= NULL; p = q) { q = p->next; free(p);

12 Ordenação de uma lista: ordenação por inseção /* prog3.11.c */ [...] struct node heada, headb; link t, u, x, a = &heada, b; for (i = 0, t = a; i < N; i++) { t->next = malloc(sizeof *t); t = t->next; t->next = NULL; t->item = rand() % 1000; <imprima lista a->next>

13 Ordenação de uma lista: ordenação por inseção (cont.) b = &headb; b->next = NULL; for (t = a->next; t!= NULL; t = u) { u = t->next; for (x = b; x->next!= NULL; x = x->next) if (x->next->item > t->item) break; t->next = x->next; x->next = t; <imprima lista b->next> [...]

14 Exercício Exercício 4. Reescreva o Programa 3.11 sem as cabeças de lista heada e headb. Observe que o código fica menos elegante!

15 Listas com cabeça/cauda Sem cabeça, sem cauda [ mais comum ] Com cabeça, sem cauda [exemplo da ordenação] Com cabeça e cauda

16 Com cabeça e cauda Inicialização: link head = malloc(sizeof *head); link z = malloc(sizeof *z); head->next = z; z->next = z; Inserção de t após x: t->next = x->next; x->next = t;

17 Com cabeça e cauda Remoção do elemento que segue x: x->next = x->next->next; /* free()? */ Varredura: for (t = head->next; t!= z; t = t->next) Vazio? if (head->next == z)

18 Exercícios Exercício 5. Escreva um código que elimina da lista t as células nas posições pares da lista (2a. célula, 4a. célula, 6a. célula, etc). Você deve chamar free() para liberar a memória correspondente. Faça isso para listas seguindo várias convenções de cabeça e cauda (sem/com cabeça, sem/com cauda).

19 Exercícios Exercício 6. Escreva uma função de protótipo void split(link t, link *even, link *odd); que recebe uma lista t e devolve duas listas (obtidas rearranjando-se as células da lista dada): uma com as células nas posições pares na lista original e uma outra com as células nas posições ímpares na lista original. Faça isso para listas seguindo várias convenções de cabeça e cauda (sem/com cabeça, sem/com cauda).