Dando continuidade ao estudo da estrutura lista encadeada, vamos nesta aula aprender como inserir no meio de uma Lista Simplesmente Encadeada.
A ideia básica aqui é inserir um novo elemento depois de um determinado valor, por exemplo, inserir o 100 depois do 320. Perceba que agora temos que trabalhar com dois valores, o novo valor a ser inserido e um valor de referência que chamarei aqui de anterior.
Como já vimos nas etapas anteriores, quando a lista estiver vazia teremos uma inserção no início. Neste caso não importa qual o valor anterior, pois não existem elementos na lista. Assim, o próximo do nosso novo nó será nulo e ele se torna o primeiro nó de nossa lista.
/* é o primeiro? Ou, a lista está vazia? */ if(*lista == NULL){ novo->proximo = NULL; *lista = novo; } else{ // inserção no meio ou no final }
Contudo, na maioria das vezes teremos inserções no meio ou no final da lista. Neste caso precisamos percorrer nossa lista procurando pelo elemento anterior. Se o elemento anterior não for encontrado, então teremos uma inserção no final da lista. Porém, ao encontrar o elemento anterior, encontramos o ponto de inserção do novo nó. O próximo do novo nó irá apontar para o próximo do anterior e este irá apontar para o novo nó.
/* é o primeiro? Ou, a lista está vazia? */ if(*lista == NULL){ novo->proximo = NULL; *lista = novo; } else{ // inserção no meio ou no final aux = *lista; while(aux->valor != ant && aux->proximo) aux = aux->proximo; novo->proximo = aux->proximo; aux->proximo = novo; }
Código completo em C para a inserção no meio da lista
/* procedimento para inserir no meio da lista */ void inserir_no_meio(No **lista, int num, int ant){ No *aux, *novo = malloc(sizeof(No)); if(novo){ novo->valor = num; // é o primeiro? if(*lista == NULL){ novo->proximo = NULL; *lista = novo; } else{ aux = *lista; while(aux->valor != ant && aux->proximo) aux = aux->proximo; novo->proximo = aux->proximo; aux->proximo = novo; } } else printf("Erro ao alocar memoria!\n"); }