Escolar Documentos
Profissional Documentos
Cultura Documentos
possvel percorrer os elementos " direita" e tambm " esquerda" de um n. Permite um acesso mais rpido aos ns, mas precisa de maior quantidade de memria. Utilizao de um ponteiro extra em cada n, que indica o ponteiro anterior ao n. no h restries para inserir ou retirar elementos da lista.
Os ns (itens) da lista so registros com dois ponteiros, para guardar o endereo do seu sucessor e antecessor:
05/07/2011
Declara-se, atravs do comando struct, as variveis que comporo as cluas da lista. Em seguida, para facilitar, utilizamos o comando typedef para tratar o nosso struct celcomo um novo tipo de dados no programa.
struct cel { struct cel *ant; int conteudo; struct cel *prox; }; typedef struct cel celula; // Trata "struct cel" como um novo tipo de dados.
Inicialmente, declara-se o ponteiro para o incio da lista. Como a lista est vazia o ponteiro deve conter o endereo NULL.
ini = (celula*) malloc(sizeof(celula)); ini->ant = NULL; // Cria a lista com as extrmidades ini->prox = NULL; // apontadas para NULL.
(inicio).
05/07/2011
outros ns.
(fim).
celula* insere(int x, celula *ini) { celula *nova; // Cria a nova clula no incio nova = (celula*) malloc(sizeof(celula)); // da lista, preenche "conteudo" // com o novo elemento e sempre nova->conteudo = x; // aponta "nova->ant" para NULL. nova->ant = NULL; if (ini->prox == NULL) nova->prox = NULL; else { nova->prox = ini->prox; ini->prox->ant = nova; } ini->prox = nova; } return nova; // Se for a primeira clula, // "nova->prox" tambm aponta // para NULL.
05/07/2011
O nmero de comparaes que uma funo de pesquisa faz em uma lista dupla :
No melhor caso: UMA - o n procurado o
primeiro n
ns (n intermedirio).
05/07/2011
Cdigo
de pesquisa:
celula* busca(int x, celula *ini) { celula *aux; int i=0; system("cls"); aux = ini; while (aux->prox != NULL && aux->conteudo != x) aux = aux->prox; return aux; } // Retorna o elemento procurado ou o ltimo da lista.
int buscaeremove(int x, celula *ini) { celula *aux; // Busca o elemento atravs da rotina // "busca". Se achou o elemento, // re-direciona os ponteiros de ant e // prox e, em seguida libera o espao de if (aux->conteudo == x) { // memria da clula apagada. if (aux->ant == NULL && aux->prox == NULL) ini->prox = NULL; aux = busca(x, ini); if (aux->ant == NULL && aux->prox != NULL) { aux->prox->ant = NULL; ini->prox = aux->prox; } if (aux->ant != NULL && aux->prox == NULL) aux->ant->prox = NULL; if (aux->ant != NULL && aux->prox != NULL) { aux->ant->prox = aux->prox; aux->prox->ant = aux->ant; } free(aux); return x;
05/07/2011
int imprime(celula *ini) { celula *aux; int i = 0; system("cls"); printf("ELEMENTOS QUE ESTAO NA LISTA DUPLAMENTE ENCADEADA E SEUS ENDERECOS\n\n"); for (aux = ini->prox; aux!= NULL; aux = aux->prox) { i = i + 1; printf("Elemento[%d] end. %d conteudo = %d, anterior %d proximo %d\n",i,&aux>conteudo,aux->conteudo,aux->ant,aux->prox); } if (i==0) printf("A lista esta vazia!\n\n"); }