Escolar Documentos
Profissional Documentos
Cultura Documentos
Formas de implementação
Lista Ligada
O(1) - constante
Lista Ligada – Acesso
• Acesso no fim da lista ligada, complexidade linear. Neste caso, a
característica principal é que o apontador estará apontando para o
vazio
1) Alocar nó 4 3
A
2) Atribuir valor 2 1
3) Atualizar a conexão do nó para a lista
4) Atualizar a conexão da lista para o novo nó
Lista Ligada - Inserção
• Inserção de um elemento no meio da lista (complexidade linear O(N)):
→
->
Lista Ligada - Inserção
• Código Completo - Inserção no início
Void inserir_inicio (no **S, char el)
no *tmp = (no *) malloc(sizeof(no));
tmp -> dado = el;
tmp -> prox = *S;
*S -> tmp;
//Complexidade O(1)
Lista Ligada - Inserção
Algoritmo de inserção no fim da lista:
Void inserir_fim (no **S, char el)
if (*S == null) inserir_inicio(S); //para o caso de uma lista vazia, no qual o 1º elemento é o último
else{
no *it = *S; // Criando o iterador, que aponta para o 1º elemento
while (it -> prox != null)
it -> prox;
no *tmp = (no *) malloc(sizeof(no));
tmp -> dado = el;
tmp -> prox = null; // temp -> prox recebe null, pois trata-se de uma inserção no fim
it -> prox = tmp;
} Complexidade: O(N)
Lista Ligada - Inserção
Para o algoritmo de inserção no meio da lista, precisaria de algumas
pequenas alterações. Para inserir numa posição qualquer “pos”, faria
um FOR onde o it teria que parar numa posição “pos – 1”, e a linha “
tmp -> prox = null;” teria que ser alterada para tmp -> prox = it ->
prox;
Complexidade O(N)
Remoção
Remoção de um elemento qualquer:
no *tmp = it -> prox;
it -> prox = it -> prox -> prox;
free(tmp);
Legenda:
• Pilha:
• Fila:
Lista Duplamente Ligada e Lista
Ligada com início e fim
Lista Ligada com início e fim
• Esboço
Lista Ligada com início e fim
• Acesso no início da lista:
//Complexidade O(1)
Lista Ligada com início e fim
• Inserção no fim da lista:
Obs: Para a remoção no fim, não há uma melhor eficiência em relação à lista
ligada, por isso não apresentaremos o algoritmo.
Lista Ligada com início e fim
Resumo da complexidade:
Inicio Fim Aleatório
Inserção Constante Constante Linear
Remoção Constante linear Linear
Acesso Constante Constante Linear
Legenda:
• Pilha:
• Fila:
Lista Duplamente Ligada
Armazena um ponteiro para o próximo elemento e para o anterior.
Obs: Para o caso do acesso, o algoritmo é o mesmo do caso anterior.
Lista Duplamente Ligada
Inserção no início: Se lista estiver vazia:
*I -> ant = (no *) malloc(sizeof(no)); if(!*I);
*I -> ant -> prox = *I; *I = (no *) malloc(sizeof(no));
*I -> ant -> dado =el; *I -> ant = null;
*I -> ant -> ant = null; *I -> prox = null;
*I = *I -> ant; *I -> dado = el;
If(!(I -> prox)) *F = *I; *F = *I;
*I = *I => prox;
free(*I -> ant);
*I -> ant = null;
Complexidade O(1)
Lista Duplamente Ligada
• Remoção no fim:
*F = *F -> ant;
free(*F -> prox);
*F -> prox = null;
Complexidade O(1)
Lista Duplamente Ligada
• Resumo das complexidades:
Inicio Fim Aleatório
Inserção Constante Constante Linear
Remoção Constante Constante Linear
Acesso Constante Constante Linear
Legenda:
• Pilha:
• Fila: