Carregar apresentação
A apresentação está carregando. Por favor, espere
1
TADS – Tipos Abstratos de Dados
Listas Encadeadas: Listas simplesmente encadeadas: cada nó aponta apenas para o próximo. Listas duplamente encadeadas: cada nó aponta para o próximo e também para o anterior.
2
Motivação para uso da lista encadeada: desvantagens do uso de vetor
Tamanho máximo fixo Mesmo vazias ocupam espaço grande de memória Um vetor de ponteiros ameniza o desperdício de memória, mas, desperdiça a memória dos ponteiros não usados. Operações podem envolver muitos deslocamentos de dados: Inclusão em uma posição ou no início Exclusão em uma posição ou no início
3
Listas simplemente encadeadas
São listas onde cada elemento está armazenado em um TAD chamado elemento de lista. Cada elemento da lista referencia o próximo que só é alocado quando necessário de forma dinamica Para referenciar o primeiro elemento utiliza-se um TAD cabeça de lista.
4
Listas simplemente encadeadas
São listas onde cada elemento está armazenado em um TAD chamado elemento de lista. Cada elemento da lista referencia o próximo que só é alocado quando necessário de forma dinamica Para referenciar o primeiro elemento utiliza-se um TAD cabeça de lista.
5
Exemplo: Cabeça de lista 5 Elemento de Lista melão maçã uva qtde dados
info próximo info próximo info próximo melão maçã uva Elemento de Lista
6
Modelagem da Cabeça da Lista
Necessidade: Um inteiro para indicar a qtde de elementos da lista. Um ponteiro para o primeiro elemento da lista. Código: struct Lista { int qtde; struct Elemento *dados; };
7
Modelagem do Elemento da Lista
Necessidade: Um ponteiro para o próximo elemento da lista. Um campo do tipo da informação que vamos armazenar. Código: struct Elemento { struct Elemento *prox; tipo_desejado info; };
8
Modelagem do Elemento da Lista (versão 2)
struct Elemento { Elemento *proximo; TipoInfo *info; }; struct TipoInfo { tipo-do-campo1 campo1; tipo-do-campo2 campo2; … tipo-do-campoN campoN; } info como ponteiro torna os algoritmos mais genéricos. Com o uso do typedef generaliza-se ainda mais.
9
Elemento de Informação (TipoInfo)
Para tornar todos os algoritmos da lista mais genéricos, usa-se o campo info como um ponteiro para um elemento de informação. qtde dados 3 info próximo info próximo info próximo melão maçã uva doce azeda irkh caro cara barata Elemento de Informação (TipoInfo)
10
Algumas funcionalidades básicas:
Criar lista. Colocar e retirar dados da lista. Realizar testes sobre a lista: se vazia, se contém elemento etc. Destruir uma lista. 3 melão doce caro maçã azeda cara uva irkh barata
11
Algoritmo: adicionaInicio
qtde dados 2 info prox info prox maçã uva azeda irkh cara barata
12
Algoritmo: adicionaInicio
lista qtde dados 2 info prox info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta)
13
Algoritmo: adicionaInicio
lista qtde dados 2 novo info prox info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo;
14
Algoritmo: adicionaInicio
lista qtde dados 2 novo info prox info prox info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento));
15
Algoritmo: adicionaInicio
lista qtde dados 2 novo info prox info prox info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados;
16
Algoritmo: adicionaInicio
lista qtde dados 2 novo info prox info prox info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados; novo->info = fruta;
17
Algoritmo: adicionaInicio
lista qtde dados 2 novo info prox info prox info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados; novo->info = fruta; lista->dados = novo;
18
Algoritmo: adicionaInicio
lista qtde dados 3 novo info prox info prox info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados; novo->info = fruta; lista->dados = novo; lista->qtde++;
19
Algoritmo: adicionaInicio
lista qtde dados 3 info prox info prox info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->prox = lista->dados; novo->info = fruta; lista->dados = novo; lista->qtde++; return 0; }
20
Modelagem do Tipo Info Para inserção em ordem e para localizar um determinado elemento são necessárias funções para comparar as informações associadas aos elementos Estas operações de comparação fazem parte do TAD TipoInfo e não da Lista. Sugestões: igual(dado1,dado2): 0 se igual, 1 se diferente maior(dado1,dado2): 0 se maior, 1 se menor ou igual maior(dado1,dado2): 0 se menor, 1 se maior ou igual compara(dado1,dado2): 0 se igual, >0 se maior, <0 se menor
21
Exemplos e exercícios no documento cooperativo
disponível no site
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.