190 likes | 326 Views
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.
E N D
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 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 ant info prox ant info prox novo 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 ant info prox ant info prox ant info prox novo 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 ant info prox ant info prox ant info prox novo 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 ant info prox ant info prox ant info prox novo 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 ant info prox ant info prox ant info prox novo 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 ant info prox ant info prox ant info prox novo 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 ant info prox ant info prox ant info prox novo 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 ant info prox ant info prox ant info prox novo 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) lista qtde dados 0
Algoritmo: adicionaInicio(considerando a possibilidade de lista vazia) lista qtde dados 0 ant info prox novo melão doce fruta caro
Algoritmo: adicionaInicio(considerando a possibilidade de lista vazia) lista 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; } qtde dados 0 ant info prox novo melão doce fruta caro
Exemplos e exercícios no • documento cooperativo • disponível no site