210 likes | 362 Views
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. Motivação para uso da lista encadeada : desvantagens do uso de vetor.
E N D
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.
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
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.
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.
Cabeça de lista Elemento de Lista Exemplo: qtde dados 5 info próximo info próximo info próximo melão maçã uva
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; };
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; };
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.
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
3 melão maçã uva doce azeda irkh caro cara barata 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.
Algoritmo: adicionaInicio qtde dados 2 info prox info prox maçã uva azeda irkh cara barata
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)
Algoritmo: adicionaInicio lista qtde dados 2 info prox info prox novo melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct Lista *lista, struct Fruta *fruta) { struct Elemento *novo;
novo Algoritmo: adicionaInicio lista qtde dados 2 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 Algoritmo: adicionaInicio lista qtde dados 2 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 Algoritmo: adicionaInicio lista qtde dados 2 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;
novo Algoritmo: adicionaInicio lista qtde dados 2 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;
novo 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++;
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; }
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 TADTipoInfo 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
Exemplos e exercícios no • documento cooperativo • disponível no site