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.
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
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 Elemento de Informação (TipoInfo)
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
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 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;
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));
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;
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;
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;
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++;
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 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
Exemplos e exercícios no documento cooperativo disponível no site