Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouGiovanna Fernando Alterado mais de 9 anos atrás
1
Estruturas de Dados PROFESSOR DIÓGENES FURLAN
2
Estruturas de Dados (ED) Programas operam sobre dados Dados são relacionados e possuem estrutura Como representar e manipular dados num computador? ◦Devemos escolher a ED depois de analisar as operações que vamos realizar com os nossos dados
3
Exemplo – Cartas de Baralho Para representar um baralho precisamos: ◦Representar as cartas: naipe e valor struct carta { char naipe; char valor; }; ◦Representar o conjunto de cartas: ◦Ordem ◦Repetição Operações de manipulação: ◦Embaralhar as cartas ◦Comprar carta no topo do baralho ◦Colocar uma carta no fundo do baralho ◦Retirar uma carta aleatória do meio do baralho
4
Tipos de ED Linear ◦Listas ◦Filas ◦Pilhas Estrutural ◦Árvores ◦Grafos
5
Listas
6
Definição: ◦Em computação, lista é uma estrutura de dados abstrata que implementa uma coleção ordenada de objetos. ◦Numa lista, objetos podem aparecer repetidamente. ◦Para garantir ordem, precisa-se saber: ◦Quem é o primeiro ◦Quem é o próximo Exemplos: ◦Lista de compras do mercado ◦Lista telefônica ◦Dicionário
7
Listas - Operações Criar uma lista Verificar se uma lista está vazia Recuperar o tamanho da lista Inserir um elemento ◦No inicio ◦No fim ◦No meio Remover um elemento ◦No inicio ◦No fim ◦No meio Destruir uma lista
8
Listas – Implementação Em vetores Com nós encadeados
9
Listas em Vetores Prós: ◦Criar um vetor é muito simples ◦Não é necessário compreender ponteiros ou referencias Contras: ◦Limitações no tamanho da memória ◦Movimentação de memória aumenta custo computacional
10
struct Lista { int elementos[MAXTAM]; int last; };
11
struct Lista { int elementos[MAXTAM]; int last; }; //Detalhe de implementação: last aponta para a próxima posição a ser inserida void create(Lista &L) { L.last = 0; }
12
struct Lista { int elementos[MAXTAM]; int last; }; //Detalhe de implementação: last aponta para a próxima posição a ser inserida void create(Lista &L) { L.last = 0; } bool vazia(Lista &L) { return L.last == 0; }
13
struct Lista { int elementos[MAXTAM]; int last; }; //Detalhe de implementação: last aponta para a próxima posição a ser inserida void create(Lista &L) { L.last = 0; } bool vazia(Lista &L) { return L.last == 0; } int tamanho(Lista &L) { return L.last; }
14
struct Lista { int elementos[MAXTAM]; int last; }; //Detalhe de implementação: last aponta para a próxima posição a ser inserida void create(Lista &L) { L.last = 0; } bool vazia(Lista &L) { return L.last == 0; } int tamanho(Lista &L) { return L.last; } bool cheia(Lista &L) { return L.last >= MAXTAM; }
15
Operações Inserir o 3 (no inicio) Inserir o 20 (no fim) Inserir o 8 (no meio) Remover o 3 (do inicio) Remover o 20 (do fim) Remover o 10 (do meio) 5 10 15 last
16
Inserir o 20 (no fim) O mais simples. void inserir_fim(Lista &L, int elem) { if(not(cheia(L))) { elementos[last] = elem; last++; } else Erro(); } 5 10 15 last
17
Inserir o 20 (no fim) O mais simples. void inserir_fim(Lista &L, int elem) { if(not(cheia(L))) { elementos[last] = elem; last++; } else Erro(); } 5 10 15 20 last
18
Inserir o 20 (no fim) O mais simples. void inserir_fim(Lista &L, int elem) { if(not(cheia(L))) { elementos[last] = elem; last++; } else Erro(); } 5 10 15 20 last
19
Inserir o 3 (no inicio) O mais complexo: void inserir_inicio(Lista &L, int elem) { if(not(cheia(L))) { SobeUm(0, last-1); elementos[0] = elem; last++; } else Erro(); } 5 10 15 20 last
20
Inserir o 3 (no inicio) O mais complexo: void inserir_inicio(Lista &L, int elem) { if(not(cheia(L))) { SobeUm(0, last-1); elementos[0] = elem; last++; } else Erro(); } 5 10 15 20 last
21
Inserir o 3 (no inicio) O mais complexo: void inserir_inicio(Lista &L, int elem) { if(not(cheia(L))) { SobeUm(0, last-1); elementos[0] = elem; last++; } else Erro(); } 3 5 10 15 20 last
22
Inserir o 3 (no inicio) O mais complexo: void inserir_inicio(Lista &L, int elem) { if(not(cheia(L))) { SobeUm(0, last-1); elementos[0] = elem; last++; } else Erro(); } 3 5 10 15 20 last
23
Inserir o 8 (no meio) Inserir_meio(L1, 2, 8); void inserir_meio(Lista &L, int pos, int elem) { if(not(cheia(L))) { SobeUm(pos, last-1); elementos[pos] = elem; last++; } else Erro(); } 3 5 10 15 20 last
24
Inserir o 8 (no meio) Inserir_meio(L1, 2, 8); void inserir_meio(Lista &L, int pos, int elem) { if(not(cheia(L))) { SobeUm(pos, last-1); elementos[pos] = elem; last++; } else Erro(); } 3 5 10 15 20 last
25
Inserir o 8 (no meio) Inserir_meio(L1, 2, 8); void inserir_meio(Lista &L, int pos, int elem) { if(not(cheia(L))) { SobeUm(pos, last-1); elementos[pos] = elem; last++; } else Erro(); } 3 5 8 10 15 20 last
26
Inserir o 8 (no meio) Inserir_meio(L1, 2, 8); void inserir_meio(Lista &L, int pos, int elem) { if(not(cheia(L))) { SobeUm(pos, last-1); elementos[pos] = elem; last++; } else Erro(); } 3 5 8 10 15 20 last
27
Remover do fim X = remover_fim(L1); int remover_fim(Lista &L) { if(not(vazia(L))) { last--; return elementos[last]; } else Erro(); } 3 5 8 10 15 20 last
28
Remover do fim X = remover_fim(L1); int remover_fim(Lista &L) { if(not(vazia(L))) { last--; return elementos[last]; } else Erro(); } 3 5 8 10 15 20 last
29
Remover do fim X = remover_fim(L1); int remover_fim(Lista &L) { if(not(vazia(L))) { last--; return elementos[last]; } else Erro(); } 3 5 8 10 15 last
30
Remover do inicio X = remover_inicio(L1); int remover_inicio(Lista &L) { if(not(vazia(L))) { int x = elementos[0]; DesceUm(0, last-1); last--; return x; } else Erro(); } 3 5 8 10 15 last
31
Remover do inicio X = remover_inicio(L1); int remover_inicio(Lista &L) { if(not(vazia(L))) { int x = elementos[0]; DesceUm(0, last-1); last--; return x; } else Erro(); } 3 5 8 10 15 last
32
Remover do inicio X = remover_inicio(L1); int remover_inicio(Lista &L) { if(not(vazia(L))) { int x = elementos[0]; DesceUm(0, last-1); last--; return x; } else Erro(); } 5 8 10 15 last
33
Remover do inicio X = remover_inicio(L1); int remover_inicio(Lista &L) { if(not(vazia(L))) { int x = elementos[0]; DesceUm(0, last-1); last--; return x; } else Erro(); } 5 8 10 15 last
34
Remover do meio X = remover_meio(L1, 1); int remover_meio(Lista &L, int pos) { if(not(vazia(L))) { int x = elementos[pos]; DesceUm(pos, last-1); last--; return x; } else Erro(); } 5 8 10 15 last
35
Remover do meio X = remover_meio(L1, 1); int remover_meio(Lista &L, int pos) { if(not(vazia(L))) { int x = elementos[pos]; DesceUm(pos, last-1); last--; return x; } else Erro(); } 5 8 10 15 last
36
Remover do meio X = remover_meio(L1, 1); int remover_meio(Lista &L, int pos) { if(not(vazia(L))) { int x = elementos[pos]; DesceUm(pos, last-1); last--; return x; } else Erro(); } 5 10 15 last
37
Remover do meio X = remover_meio(L1, 1); int remover_meio(Lista &L, int pos) { if(not(vazia(L))) { int x = elementos[pos]; DesceUm(pos, last-1); last--; return x; } else Erro(); } 5 10 15 last
38
Listas Encadeadas Prós: ◦Eficientes no custo de memória e processamento ◦Nunca acarreta em movimentar todos os elementos Contras: ◦Envolve conceitos mais avançados de programação ◦Ponteiros
39
struct Node { int elemento; struct Node *prox; }; struct Lista { Node *first; Node *last; };
40
struct Node { int elemento; struct Node *prox; }; struct Lista { Node *first; Node *last; }; void create(Lista &L) { L->first = L->last = NULL; } bool vazia(Lista &L) { return L->first == NULL; }
41
struct Node { int elemento; struct Node *prox; }; struct Lista { Node *first; Node *last; }; int tamanho(Lista &L) { int cont; Node *it; if(vazia(L)) return 0; for(cont=1, it=L->first; it!=L->last; cont++, it=it->prox); return cont; } void create(Lista &L) { L->first = L->last = NULL; } bool vazia(Lista &L) { return L->first == NULL; }
42
Inserir se Vazia (vale para todos) void inserir(Lista &L, int elem) { if(vazia(L)) { Node *node = new Node(); node->elemento = elem; node->prox = NULL; L->first = node; L->last = node; } last 5 first NULL
43
Operações Inserir o 3 (no inicio) Inserir o 20 (no fim) Inserir o 8 (no meio) Remover o 3 (do inicio) Remover o 20 (do fim) Remover o 10 (do meio) last 5 10 15 first NULL
44
Inserir o 20 (no fim) void inserir_fim(Lista &L, int elem) { Node *node = new Node(); node->elemento = elem; node->prox = NULL; last->prox = node; last = node; } last 5 10 15 first NULL20
45
Inserir o 20 (no fim) void inserir_fim(Lista &L, int elem) { Node *node = new Node(); node->elemento = elem; node->prox = NULL; last->prox = node; last = node; } last 5 10 15 first NULL 20
46
Inserir o 20 (no fim) void inserir_fim(Lista &L, int elem) { Node *node = new Node(); node->elemento = elem; node->prox = NULL; last->prox = node; last = node; } last 5 10 15 first NULL 20
47
Inserir o 3 (no inicio) void inserir_inicio(Lista &L, int elem) { Node *node = new Node(); node->elemento = elem; node>prox = first; first = node; } last 5 10 15 first NULL 20 3
48
Inserir o 3 (no inicio) void inserir_inicio(Lista &L, int elem) { Node *node = new Node(); node->elemento = elem; node>prox = first; first = node; } last 5 10 15 first NULL 20 3
49
Inserir o 3 (no inicio) void inserir_inicio(Lista &L, int elem) { Node *node = new Node(); node->elemento = elem; node>prox = first; first = node; } last 3 5 10 first NULL 15 20
50
Inserir o 8 (no meio) void inserir_meio(Lista &L, int pos, int elem) { Node *node = new Node(); node->elemento = elem; ante = L->first; for(int cont=1; cont<pos; cont++) ante = ante->prox; node>prox = ante->prox; ante->prox = node; } 3 5 10 first NULL 15 20 8 last
51
Inserir o 8 (no meio) void inserir_meio(Lista &L, int pos, int elem) { Node *node = new Node(); node->elemento = elem; ante = L->first; for(int cont=1; cont<pos; cont++) ante = ante->prox; node>prox = ante->prox; ante->prox = node; } 3 5 10 first NULL 15 20 8 last ante
52
Inserir o 8 (no meio) void inserir_meio(Lista &L, int pos, int elem) { Node *node = new Node(); node->elemento = elem; ante = L->first; for(int cont=1; cont<pos; cont++) ante = ante->prox; node>prox = ante->prox; ante->prox = node; } 3 5 first 8 ante last NULL 10 15 20
53
Inserir o 8 (no meio) void inserir_meio(Lista &L, int pos, int elem) { Node *node = new Node(); node->elemento = elem; ante = L->first; for(int cont=1; cont<pos; cont++) ante = ante->prox; node>prox = ante->prox; ante->prox = node; } 3 5 first 8 ante last NULL 10 15 20
54
Inserir o 8 (no meio) void inserir_meio(Lista &L, int pos, int elem) { Node *node = new Node(); node->elemento = elem; ante = L->first; for(int cont=1; cont<pos; cont++) ante = ante->prox; node>prox = ante->prox; ante->prox = node; } last 3 5 8 first NULL 10 15 20
55
Remover o 3 (do inicio) int remover_inicio(Lista &L) { Node *node = first; first = first->prox; return node->elem; } last 3 5 8 first NULL 10 15 20 node
56
Remover o 3 (do inicio) int remover_inicio(Lista &L) { Node *node = first; first = first->prox; return node->elem; } last 3 5 8 first NULL 10 15 20 node
57
Remover o 3 (do inicio) int remover_inicio(Lista &L) { Node *node = first; first = first->prox; return node->elem; } last 3 5 8 first NULL 10 15 20 node
58
Remover o 20 (do fim) int remover_fim(Lista &L) { ante = first; for(; ante->prox!=last; ) ante=ante->prox; Node *node = last; last = ante; last->prox = NULL; return node->elem; } last 5 8 first NULL 10 15 20 ante
59
Remover o 20 (do fim) int remover_fim(Lista &L) { ante = first; for(; ante->prox!=last; ) ante=ante->prox; Node *node = last; last = ante; last->prox = NULL; return node->elem; } node 5 8 first NULL 10 15 20 last
60
Remover o 20 (do fim) int remover_fim(Lista &L) { ante = first; for(; ante->prox!=last; ) ante=ante->prox; Node *node = last; last = ante; last->prox = NULL; return node->elem; } 5 8 first NULL 10 15 last 20 node
61
Remover o 10 (do meio) int remover_meio(Lista &L, int pos) { ante = first; for(cont=1; cont<pos; cont++) ante=ante->prox; Node *node = ante->prox; ante->prox = node->prox; return node->elem; } 5 8 first NULL 10 15 last ante
62
Remover o 10 (do meio) int remover_meio(Lista &L, int pos) { ante = first; for(cont=1; cont<pos; cont++) ante=ante->prox; Node *node = ante->prox; ante->prox = node->prox; return node->elem; } 5 8 first NULL 10 15 last ante node
63
Remover o 10 (do meio) int remover_meio(Lista &L, int pos) { ante = first; for(cont=1; cont<pos; cont++) ante=ante->prox; Node *node = ante->prox; ante->prox = node->prox; return node->elem; } 5 8 first NULL 15 last ante 10 node
64
Variantes de Listas Listas FIFO (First In First Out), ou Filas Listas LIFO (Last In First Out), ou Pilhas Listas Duplamente Encadeadas
65
Filas
66
Definição: ◦Tipo de lista onde os elementos entram pelo fim e saem pelo começo (ou entram pelo inicio e saem pelo fim). ◦Os elementos são inseridos por uma extremidade e removidos pela outra. ◦Segue uma ordem de chegada. Usos: ◦No banco ◦Na lotérica ◦No ponto de ônibus ◦Nos órgãos públicos ◦Na entrada do estacionamento ◦... ◦Fila de processos
67
Filas - Operações Criar uma fila Verificar se uma fila está vazia Recuperar o tamanho da fila Inserir um elemento ◦No inicio Remover um elemento ◦No fim Destruir uma fila
68
Testando Inserir o 3 Inserir o 20 Inserir o 8 Remover 5 10 15 fim inicio
69
Testando Inserir o 3 Inserir o 20 Inserir o 8 Remover 5 10 15 3 fim inicio
70
Testando Inserir o 3 Inserir o 20 Inserir o 8 Remover 5 10 15 3 20 fim inicio
71
Testando Inserir o 3 Inserir o 20 Inserir o 8 Remover 5 10 15 3 20 8 fim inicio
72
Testando Inserir o 3 Inserir o 20 Inserir o 8 Remover 10 15 3 20 8 fim inicio 5
73
Testando Inserir o 3 Inserir o 20 Inserir o 8 Remover 15 3 20 8 fim inicio 10
74
Testando Inserir o 3 Inserir o 20 Inserir o 8 Remover 3 20 8 fim inicio 15
75
Pilhas
76
Definição: ◦Tipo de lista onde os elementos entram e saem pelo topo. Usos: ◦Solução de expressões matemáticas ◦Guardar variáveis locais em chamadas recursivas de funções
77
Pilhas - Operações Criar uma pilha Verificar se uma pilha está vazia Recuperar o tamanho da pilha Inserir um elemento ◦No topo Remover um elemento ◦No topo Destruir uma pilha
78
Testando Inserir o 3 Inserir o 20 Inserir o 8 Remover 5 10 15 topo
79
Testando Inserir o 3 (push) Inserir o 20 Inserir o 8 Remover 3 5 10 15 topo
80
Testando Inserir o 3 Inserir o 20 (push) Inserir o 8 Remover 20 3 5 10 15 topo
81
Testando Inserir o 3 Inserir o 20 Inserir o 8 (push) Remover 8 20 3 5 10 15 topo
82
Testando Inserir o 3 Inserir o 20 Inserir o 8 (push) Remover (pop) Remover 20 3 5 10 15 topo 8
83
Testando Inserir o 3 Inserir o 20 Inserir o 8 (push) Remover Remover (pop) Remover 3 5 10 15 topo 20
84
Testando Inserir o 3 Inserir o 20 Inserir o 8 (push) Remover Remover (pop) 5 10 15 topo 3
85
Vamos às Aplicações Práticas
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.