Listas duplamente encadeadas Cada elemento da lista referencia o anterior e também próximo. Permite o deslocamento em ambos os sentidos. Útil para representar conjunto de objetos que devem ser percorridos nos dois sentidos. Exemplos de uso: representação de intinerários de meios de transporte, realização de busca aproximada.
Exemplo 3 melão maçã uva doce azeda irkh caro cara barata lista qtde dados 3 ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh caro cara barata
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 elemento anterior. Um ponteiro para o próximo elemento. Um ponteiro para o tipo tipo da informação a ser armazenada. Código: struct Elemento { struct Elemento *ant; struct Elemento *prox; tipo_desejado info; };
Algoritmo: adicionaInicio lista qtde dados 2 ant info prox ant info prox maçã uva azeda irkh cara barata
Algoritmo: adicionaInicio lista qtde dados 2 ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) {
Algoritmo: adicionaInicio lista qtde dados 2 novo ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo;
Algoritmo: adicionaInicio lista qtde dados 2 novo ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento));
Algoritmo: adicionaInicio lista qtde dados 2 novo ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->info = fruta;
Algoritmo: adicionaInicio lista qtde dados 2 novo ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->info = fruta; novo->prox = lista->dados;
Algoritmo: adicionaInicio lista qtde dados 2 novo ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->info = fruta; novo->prox = lista->dados; lista->dados->ant = novo;
Algoritmo: adicionaInicio lista qtde dados 2 novo ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->info = fruta; novo->prox = lista->dados; lista->dados->ant = novo; novo->ant = NULL;
Algoritmo: adicionaInicio lista qtde dados 2 novo ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->info = fruta; novo->prox = lista->dados; lista->dados->ant = novo; novo->ant = NULL; lista->dados = novo;
Algoritmo: adicionaInicio lista qtde dados 3 novo ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->info = fruta; novo->prox = lista->dados; lista->dados->ant = novo; novo->ant = NULL; lista->dados = novo; lista->qtde++;
Algoritmo: adicionaInicio lista qtde dados 3 ant info prox ant info prox ant info prox melão maçã uva doce azeda irkh fruta caro cara barata int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*)malloc(sizeof(struct Elemento)); novo->info = fruta; novo->prox = lista->dados; lista->dados->ant = novo; novo->ant = NULL; lista->dados = novo; lista->qtde++; return 0;
Algoritmo: adicionaInicio (considerando a possibilidade de lista vazia) qtde dados
Algoritmo: adicionaInicio (considerando a possibilidade de lista vazia) qtde dados novo ant info prox melão doce fruta caro
Algoritmo: adicionaInicio (considerando a possibilidade de lista vazia) qtde dados int adicionaInicio(struct ListaD *lista, struct Fruta *fruta) { struct Elemento *novo; novo = (struct Elemento*) malloc(sizeof(struct Elemento)); novo->info = fruta; novo->prox = lista->dados; if(lista->qtde > 0) lista->dados->ant = novo; novo->ant = NULL; lista->dados = novo; lista->qtde++; return 0; } novo ant info prox melão doce fruta caro
Exemplos e exercícios no documento cooperativo disponível no site