Dando continuidade ao nosso Curso de Programação C e ao estudo da estrutura lista simplesmente encadeada, vamos nesta aula aprender como remover um nó da estrutura lista. Nesta segunda versão vamos utilizar a estrutura Lista com o ponteiro início para o primeiro nó.
/*
Estrutura Lista com um ponteiro para o primeiro nó
*/
typedef struct{
No *inicio;
int tam;
}Lista;
Com a estrutura lista não é necessário ponteiro para ponteiro. Podemos passar para cada função e procedimento apenas um ponteiro para a lista. Nossa função de remoção alterada fica assim:
/*
Função para remover um nó da lista
*/
No* remover(Lista *lista, int num){
No *aux, *remover = NULL;
if(lista->inicio){
if(lista->inicio->valor == num){
remover = lista->inicio;
lista->inicio = remover->proximo;
lista->tam--;
}
else{
aux = lista->inicio;
while(aux->proximo && aux->proximo->valor != num)
aux = aux->proximo;
if(aux->proximo){
remover = aux->proximo;
aux->proximo = remover->proximo;
lista->tam--;
}
}
}
return remover;
}
Perceba que a lógica é exatamente igual à lógica apresentada na aula anterior. A única diferença é que não manipulamos mais ponteiro para ponteiro, uma vez que o ponteiro para o primeiro nó se encontra dentro da estrutura lista.
Código completo em C para remover um nó da estrutura Lista Encadeada
/*
Código escrito por Wagner Gaspar
Agosto de 2021
Aula 251: Lista Simplesmente Encadeada
Como remover COM a estrutura lista?
*/
typedef struct no{
int valor;
struct no *proximo;
}No;
typedef struct{
No *inicio;
int tam;
}Lista;
void criar_lista(Lista *lista){
lista->inicio = NULL;
lista->tam = 0;
}
// procedimento para inserir no início
void inserir_no_inicio(Lista *lista, int num){
No *novo = malloc(sizeof(No));
if(novo){
novo->valor = num;
novo->proximo = lista->inicio;
lista->inicio = novo;
lista->tam++;
}
else
printf("Erro ao alocar memoria!\n");
}
// procedimento para inserir no fim
void inserir_no_fim(Lista *lista, int num){
No *aux, *novo = malloc(sizeof(No));
if(novo){
novo->valor = num;
novo->proximo = NULL;
// é o primeiro?
if(lista->inicio == NULL)
lista->inicio = novo;
else{
aux = lista->inicio;
while(aux->proximo)
aux = aux->proximo;
aux->proximo = novo;
}
lista->tam++;
}
else
printf("Erro ao alocar memoria!\n");
}
// procedimento para inserir no meio
void inserir_no_meio(Lista *lista, int num, int ant){
No *aux, *novo = malloc(sizeof(No));
if(novo){
novo->valor = num;
// é o primeiro?
if(lista->inicio == NULL){
novo->proximo = NULL;
lista->inicio = novo;
}
else{
aux = lista->inicio;
while(aux->valor != ant && aux->proximo)
aux = aux->proximo;
novo->proximo = aux->proximo;
aux->proximo = novo;
}
lista->tam++;
}
else
printf("Erro ao alocar memoria!\n");
}
void inserir_ordenado(Lista *lista, int num){
No *aux, *novo = malloc(sizeof(No));
if(novo){
novo->valor = num;
if(lista->inicio == NULL){
novo->proximo = NULL;
lista->inicio = novo;
}
else if(novo->valor < lista->inicio->valor){
novo->proximo = lista->inicio;
lista->inicio = novo;
}
else{
aux = lista->inicio;
while(aux->proximo && novo->valor > aux->proximo->valor)
aux = aux->proximo;
novo->proximo = aux->proximo;
aux->proximo = novo;
}
lista->tam++;
}
else
printf("Erro ao alocar memoria!\n");
}
No* remover(Lista *lista, int num){
No *aux, *remover = NULL;
if(lista->inicio){
if(lista->inicio->valor == num){
remover = lista->inicio;
lista->inicio = remover->proximo;
lista->tam--;
}
else{
aux = lista->inicio;
while(aux->proximo && aux->proximo->valor != num)
aux = aux->proximo;
if(aux->proximo){
remover = aux->proximo;
aux->proximo = remover->proximo;
lista->tam--;
}
}
}
return remover;
}
void imprimir(Lista lista){
No *no = lista.inicio;
printf("\n\tLista tam %d: ", lista.tam);
while(no){
printf("%d ", no->valor);
no = no->proximo;
}
printf("\n\n");
}
int main(){
int opcao, valor, anterior;
//No *lista = NULL;
Lista lista;
No *removido;
criar_lista(&lista);
do{
printf("\n\t0 - Sair\n\t1 - InserirI\n\t2 - inserirF\n\t3 - InserirM\n\t4 - InserirO\n\t5 - Remover\n\t6 - Imprimir\n");
scanf("%d", &opcao);
switch(opcao){
case 1:
printf("Digite um valor: ");
scanf("%d", &valor);
inserir_no_inicio(&lista, valor);
break;
case 2:
printf("Digite um valor: ");
scanf("%d", &valor);
inserir_no_fim(&lista, valor);
break;
case 3:
printf("Digite um valor e o valor de referencia: ");
scanf("%d%d", &valor, &anterior);
inserir_no_meio(&lista, valor, anterior);
break;
case 4:
printf("Digite um valor: ");
scanf("%d", &valor);
inserir_ordenado(&lista, valor);
break;
case 5:
printf("Digite um valor a ser removido: ");
scanf("%d", &valor);
removido = remover(&lista, valor);
if(removido){
printf("Elemento removido: %d\n", removido->valor);
free(removido);
}
else
printf("elemento inexistente!\n");
break;
case 6:
imprimir(lista);
break;
default:
if(opcao != 0)
printf("Opcao invalida!\n");
}
}while(opcao != 0);
return 0;
}
