130 likes | 358 Views
Listas duplamente encadeadas. Prof. Rosana Palazon. Listas simplesmente encadeadas. Caracterizam-se pelo simples encadeamento entre os seus elementos. Não permitem o percurso reverso da lista.
E N D
Listas duplamente encadeadas Prof. Rosana Palazon
Listas simplesmente encadeadas • Caracterizam-se pelo simples encadeamento entre os seus elementos. • Não permitem o percurso reverso da lista. • Devido ao simples encadeamento, não adianta nada conhecermos o ponteiro do elemento a ser retirado, pois, de qualquer modo, teremos que percorrer a lista a procura do seu antecessor.
Listas duplamente encadeadas • Cada elemento da lista tem um ponteiro tanto para o seu próximo como para o seu anterior. • Assim, dado um elemento, podemos encontrar com facilidade os elementos que lhe são adjacentes. • Se tivermos um ponteiro para o ultimo elemento da lista, poderemos facilmente percorrê-la em ordem inversa.
Listas duplamente encadeadas • Consideremos: typedef struct lista2{ int info; struct lista2 *ant; struct lista2 *prox; }Lista2;//definição da lista Lista2 *l;//ponteiro que deve receber o endereço da lista
Listas duplamente encadeadas (criação) • Função de criação: /* retorna uma lista duplavazia */ Lista2 * lista_cria() { return NULL; }
Listas encadeadas (inserção) • Função de inserção: /* insere o novo dado no início da lista e retorna a lista atualizada*/ Lista2* lista_insere( Lista2* l, int dado) { Lista2 *novo= (Lista2*) malloc (sizeof(Lista2)); novo->info=dado; novo->prox=l; novo->ant=NULL; //verifica se a lista não esta vazia if(l!= NULL) l->ant=novo; return novo; }
Listas duplamente encadeadas (exibição) Função de exibição: /* percorre a lista do inicio até o fim mostrando os elementos*/ void lista_exibe(Lista2* l) { Lista2 *aux;/*variável usada para percorrer a lista */ printf("\n\nLista\n\n"); for(aux=l;aux!=NULL;aux=aux->prox) printf("%d\t", aux->info); }
Lista duplamente encadeada (main) • Como seria o trecho do main correspondente à criação e inserção de valores na lista? int main() { Lista2 *l;//declara uma lista não inicializada l=lista_cria();//inicializa a lista l=lista_insere(l,10);//insere o elemento 10 l=lista_insere(l,20);//insere o elemento 20 l=lista_insere(l,30);//insere o elemento 30 lista_exibe(l);//mostra o conteúdo da lista printf("\n\n"); system("pause"); return 0; }
Listas encadeadas (lista vazia) • Função de verificação de lista vazia: /* retorna 1 se vazia ou zero se falso*/ int lista_vazia(Lista2* l) { return(l==NULL); }
Listas encadeadas (busca) • Função de busca de um elemento na lista: /* retorna o elemento ou NULL se não achou*/ Lista2* lista_busca(Lista2* l, int dado) { //variável usada para percorrer a lista Lista2 *a; for(a=l;a!=NULL;a=a->prox) { if(a->info == dado) return a; } return NULL; }
Listas duplamente encadeadas (remoção) • Para a retirada de um elemento da lista usamos a função de busca, e de posse do ponteiro do elemento a ser removido religamos os elos:
Listas encadeadas (remoção) • Função que retira um elemento da lista: /* retorna o elemento ou a lista original*/ Lista2* lista_retira(Lista2* l, int dado) { //procura o elemento na lista usando a função busca Lista2* aux=lista_busca(l, dado); if (aux==NULL) //não achou o elemento return l; //retira o elemento encadeado if(l==aux) {//verifica se é o primeiro da lista l=aux->prox; l->ant=NULL;} else aux->ant->prox=aux->prox; //testa para ver se é o ultimo da lista if (aux->prox!=NULL) aux->prox->ant=aux->ant; free(aux); return l; }
Lista duplamente encadeada Exercício • Criar uma lista duplamente encadeada contendo: nome e telefone • Implementar as seguintes funções em um menu: • Inserir os elementos de forma ordenada (nome), sem repetição • Mostrar o próximo a partir de um elemento (se chegar ao fim da lista, recomece) • Mostrar o anterior a partir de um elemento (se chegar ao inicio da lista, recomece) • Exibir os elementos em ordem crescente ou decrescente • Localizar um telefone a partir de um nome