Estrutura de Dados - Aula 06

559 visualizações

Publicada em

Estrutura de Dados - Anhanguera
AULA 06 – LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS

Publicada em: Tecnologia
0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
559
No SlideShare
0
A partir de incorporações
0
Número de incorporações
37
Ações
Compartilhamentos
0
Downloads
43
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Estrutura de Dados - Aula 06

  1. 1. ANHANGUERA – 2015.2 ESTRUTURA DE DADOS AULA 06 – LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Prof. Thomás da Costa thomascosta@aedu.com
  2. 2. ESTRUTURA DE DADOS – Prof. Thomás da Costa PEA – Estrutura de Dados Vamos ver o PEA : Antes de iniciar a aula, vamos mostrar o andamento do PEA. Vou mostrar as aulas lecionadas e vamos ver as próximas lições até o fim do curso. LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Vamos ver o que aprendemos até agora !!!
  3. 3. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Apresentação da disciplina e do Plano de Ensino e Aprendizagem. Agendamento das avaliações. Introdução à Estrutura de Dados. Breve revisão da Linguagem C. Alocação Estática de Memória. Conceito, aplicações, vantagens, exemplos e exercícios. Listas em C: conceito, tipos, aplicações, exemplos e exercícios Introdução à Alocação Dinâmica de Memória: conceito, funções e aplicações. Exemplos. Continuidade a Alocação Dinâmica de Memória. Introdução a Listas Simplesmente Encadeadas. Conceito e tipos. Exemplos. Listas Simplesmente Encadeadas. Introdução a Recursão: conceito, utilização, exemplos. Recursão: exercícios. Atividades de Avaliação.
  4. 4. ESTRUTURA DE DADOS – Prof. Thomás da Costa Vamos ver as próximas aulas até o fim do curso !!! LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS
  5. 5. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Listas circulares e duplamente encadeadas. Exemplos. Listas Duplamente Encadeadas. Exercícios Filas em C: conceito, tipos, aplicações, exemplos e exercícios Pilhas em C: conceito, tipos, aplicações, exemplos e exercícios Desenvolvimento de Filas e Pilhas com alocação dinâmica. Árvores: conceito, elementos, tipos e utilizações. Exemplos e exercícios Grafos: conceito, definição, tipos, aplicações. Exemplos. Grafos: exercícios Prova Escrita Oficial Exercícios de Revisão. Prova Substitutiva
  6. 6. ESTRUTURA DE DADOS – Prof. Thomás da Costa • Período das avaliações B2: 07 até 11 de Dezembro • Data da Avaliação B2: 07 de Dezembro • Obrigatoriamente, avaliação da B2 é PROVA • PROVA SUBSTITUTIVA SUBSTITUI A NOTA DA B2, NÃO SUBSTITUI A MENOR NOTA DAS PROVAS OU A B1 • Matéria da Prova é todo o conteúdo do semestre LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Avaliação – B2
  7. 7. ESTRUTURA DE DADOS – Prof. Thomás da Costa ATPS – B2 • Data de Entrega B2: 07 de Dezembro • Grupo no máximo de 5 pessoas • Efetuar a entrega da ETAPA 3 e ETAPA 4 • Fazer os exercícios em C++. Se for feito em C será considerado ERRADO LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS
  8. 8. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS
  9. 9. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Aviso Todos os códigos fontes dessa aula, estão disponibilizados no Github: https://github.com/thomasdacosta/estrutura- dados.anhanguera-CPP
  10. 10. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Lista Simplesmente Encadeada Lembrando: • Composta por uma estrutura. • A estrutura possui um ponteiro que indica o próximo elemento da lista. • Criamos um exemplo de inserção e visualização de uma lista. • Este conceito é conhecido como lista simplesmente encadeada.
  11. 11. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Lista Simplesmente Encadeada struct alunos { char nome[100]; int idade; alunos *proximo; } *lista_alunos; char nome[100]; int idade; "Aluno 1" 20 alunos *proximo; char nome[100]; int idade; "Aluno 2" 21 alunos *proximo; char nome[100]; int idade; "Aluno 3" 23 alunos *proximo; NULL Estrutura “alunos”. Próximo elemento da lista.
  12. 12. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Lista Simplesmente Encadeada • Em um nó da lista, sabemos somente o próximo elemento. • Não conseguimos identificar o elemento anterior em relação ao nó atual. • Podemos percorrer a lista nos movendo somente para frente. • Diferente de um vetor que podemos percorrer nos dois sentidos. • Vamos resolver esses problemas com a lista duplamente encadeada. Analisando:
  13. 13. ESTRUTURA DE DADOS – Prof. Thomás da Costa Lista Duplamente Encadeada É uma lista na qual o nó é composto por um ponteiro que identifica o próximo elemento da lista e um outro ponteiro que identifica o elemento anterior. O que é: LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS
  14. 14. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Lista Duplamente Encadeada A estrutura de uma lista duplamente encadeada, possui dois ponteiros indicando o nó seguinte e o nó anterior: Estrutura: struct alunos { char nome[100]; int idade; alunos *proximo; alunos *anterior; } *lista_alunos; Ponteiro para o próximo nó. Ponteiro para o nó anterior.
  15. 15. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Lista Duplamente Encadeada char nome[100]; int idade; "Aluno 1" 20 alunos *proximo; char nome[100]; int idade; "Aluno 2" 21 char nome[100]; int idade; "Aluno 3" 23 NULL struct alunos { char nome[100]; int idade; alunos *proximo; alunos *anterior; } *lista_alunos; alunos *anterior; alunos *proximo; alunos *proximo; alunos *anterior; alunos *anterior; NULL Ponteiro para o próximo nó. Ponteiro para o nó anterior.
  16. 16. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Lista Duplamente Encadeada Vamos utilizar o mesmo exemplo desenvolvido em lista simplesmente encadeada, para implementar a dupla ligação dos nós. Analisaremos as novas implementações do método inserir_aluno e do método listar_alunos. Exemplo:
  17. 17. ESTRUTURA DE DADOS – Prof. Thomás da Costa ... void inserir_aluno() { system("cls"); cout << "1 - INSERIR ALUNOS" << endl << endl; limpar_teclado(); alunos *novo_aluno = new alunos; cout << "Digite o nome do aluno:" << endl; gets(novo_aluno->nome); cout << "Digite a idade do aluno:" << endl; cin >> novo_aluno->idade; novo_aluno->proximo = NULL; novo_aluno->anterior = NULL; if (lista_alunos == NULL) lista_alunos = novo_aluno; else { alunos *p; p = lista_alunos; while (p->proximo != NULL) p = p->proximo; p->proximo = novo_aluno; novo_aluno->anterior = p; } cout << endl << "Aluno inserido com sucesso." << endl; cout << "Pressione uma tecla para continuar..." << endl; getch(); } ...
  18. 18. ESTRUTURA DE DADOS – Prof. Thomás da Costa void listar_alunos() { ... alunos *p; p = lista_alunos; if (p->proximo == NULL) { cout << "------------------------------------" << endl; cout << "Nome do Aluno:" << p->nome << endl; cout << "Idade do Aluno:" << p->idade << endl; cout << "------------------------------------" << endl; } else { while (p != NULL) { cout << "------------------------------------" << endl; cout << "Nome do Aluno:" << p->nome << endl; cout << "Idade do Aluno:" << p->idade << endl; if (p->proximo != NULL) cout << "Proximo:" << p->proximo->nome << endl; else cout << "Proximo: NULO" << endl; if (p->anterior != NULL) cout << "Anterior:" << p->anterior->nome << endl; else cout << "Anterior: NULO" << endl; cout << "------------------------------------" << endl; p = p->proximo; } } ... }
  19. 19. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Saída do Console
  20. 20. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Exercícios Modificar o exercício de lista simplesmente encadeada e transforma-lo em lista duplamente encadeada: • Modificar a estrutura alunos para aceitar dois ponteiros. • Modificar o método inserir_aluno. • Modificar o método listar_alunos. • Baixar o exercício de lista simplesmente encadeada do endereço: • https://github.com/thomasdacosta/estrutura-dados.anhanguera- CPP/tree/master/AULA04
  21. 21. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Vetores Em um vetor temos o mesmo funcionamento de uma lista duplamente encadeada. Sabendo a posição de um índice no vetor conseguimos identificar facilmente o item anterior e o posterior. Além disso conseguimos percorrer um vetor em duas direções. Lista Duplamente Encadeada: 0 9 int vetor_numeros[10] = {0,1,2,3,4,5,6,7,8,9}; 5 Índice 0 Índice 5Índice - 1 Índice + 1 4 6 ...... Índice 9 Anterior Próximo
  22. 22. ESTRUTURA DE DADOS – Prof. Thomás da Costa #include <iostream> #include <locale.h> using namespace std; int main() { setlocale(LC_ALL, "Portuguese"); int vetor_numeros[10] = {0,1,2,3,4,5,6,7,8,9}; int posicao = 5; cout << "Atual:" << vetor_numeros[posicao] << endl; cout << "Anterior:" << vetor_numeros[posicao-1] << endl; cout << "Próximo:" << vetor_numeros[posicao+1] << endl; }
  23. 23. ESTRUTURA DE DADOS – Prof. Thomás da Costa Lista Circular É uma lista em que o último nó aponta para o primeiro item da lista. O que é: LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS
  24. 24. ESTRUTURA DE DADOS – Prof. Thomás da Costa LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS Lista Circular Vamos utilizar o mesmo exemplo desenvolvido em lista duplamente encadeada para implementar a lista circular. Analisaremos as novas implementações do método inserir_aluno e do método listar_alunos. Exemplo:
  25. 25. ESTRUTURA DE DADOS – Prof. Thomás da Costa void inserir_aluno() { system("cls"); cout << "1 - INSERIR ALUNOS" << endl << endl; limpar_teclado(); alunos *novo_aluno = new alunos; cout << "Digite o nome do aluno:" << endl; gets(novo_aluno->nome); cout << "Digite a idade do aluno:" << endl; cin >> novo_aluno->idade; novo_aluno->proximo = NULL; novo_aluno->anterior = NULL; if (lista_alunos == NULL) lista_alunos = novo_aluno; else { alunos *p; alunos *primeiro; alunos *ultimo; p = lista_alunos; primeiro = lista_alunos; while (p->proximo != NULL && p->proximo != lista_alunos) { p = p->proximo; } p->proximo = novo_aluno; novo_aluno->anterior = p; novo_aluno->proximo = primeiro; } cout << endl << "Aluno inserido com sucesso." << endl; cout << "Pressione uma tecla para continuar..." << endl; getch(); }
  26. 26. ESTRUTURA DE DADOS – Prof. Thomás da Costa void listar_alunos() { ... alunos *p; p = lista_alunos; if (p->proximo == NULL) { cout << "------------------------------------" << endl; cout << "Nome do Aluno:" << p->nome << endl; cout << "Idade do Aluno:" << p->idade << endl; cout << "------------------------------------" << endl; } else { do { cout << "------------------------------------" << endl; cout << "Nome do Aluno:" << p->nome << endl; cout << "Idade do Aluno:" << p->idade << endl; if (p->proximo != NULL) cout << "Proximo:" << p->proximo->nome << endl; else cout << "Proximo: NULO" << endl; if (p->anterior != NULL) cout << "Anterior:" << p->anterior->nome << endl; else cout << "Anterior: NULO" << endl; cout << "------------------------------------" << endl; p = p->proximo; } while (p->anterior != NULL); } cout << endl << "Pressione uma tecla para continuar..." << endl; getch(); }
  27. 27. ESTRUTURA DE DADOS – Prof. Thomás da Costa • Em uma lista duplamente encadeada temos indicação do elemento anterior e posterior. • Podemos percorrer a lista nos dois sentidos igual a um vetor. • Uma lista circular o último elemento aponta para o primeiro. • Na estrutura existem dois ponteiro indicando o nó anterior e posterior. • Em um vetor para indicar a posição anterior e posterior usamos o valor do índice -1 e índice + 1 respectivamente. Resumo LISTAS CIRCULARES E DUPLAMENTE ENCADEADAS
  28. 28. Obrigado !!! ANHANGUERA – 2015.2

×