Você está na página 1de 6

05/07/2011

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.

Tem-se trs casos de insero:


O novo n passar a ser o novo primeiro n

(inicio).

05/07/2011

O novo n ocupar uma posio entre dois

outros ns.

O novo n passar a ser o novo ltimo n

(fim).

Cdigo utilizado para inserir um dado:

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

No caso mdio: (n/2) - onde "n" o nmero

total de entradas que voc possui na lista

No pior caso: n - nmero total de entradas

Logo, uma desvantagem desse tipo de listas : o tempo de busca.

Tem-se trs casos de remoo:


O n a ser excludo o primeiro n da lista.

O n a ser excludo est entre dois outros

ns (n intermedirio).

05/07/2011

O n a ser excludo o ultimo n da lista.

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.

Cdigo utilizado para remover uma clula:

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;

} else return -x;

05/07/2011

Cdigo utilizado para imprimir na tela o contedo da lista:

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"); }

lista duplamente encadeada 04072001.pdf

Você também pode gostar