A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Estruturas de Dados PROFESSOR DIÓGENES FURLAN. Estruturas de Dados (ED) Programas operam sobre dados Dados são relacionados e possuem estrutura Como representar.

Apresentações semelhantes


Apresentação em tema: "Estruturas de Dados PROFESSOR DIÓGENES FURLAN. Estruturas de Dados (ED) Programas operam sobre dados Dados são relacionados e possuem estrutura Como representar."— Transcrição da apresentação:

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


Carregar ppt "Estruturas de Dados PROFESSOR DIÓGENES FURLAN. Estruturas de Dados (ED) Programas operam sobre dados Dados são relacionados e possuem estrutura Como representar."

Apresentações semelhantes


Anúncios Google