Ir ao conteúdo

C Retirar posição de uma lista encadeada


Ir à solução Resolvido por Ansi C,

Posts recomendados

Postado

Estava fazendo um programa que retira a posição de uma lista. Está dando algum tipo de erro e eu não sei o porquê. Um exemplo que estou testando é retirar a posição 2.

#include <stdio.h>
#include <malloc.h>


    typedef struct node {
        int valor;
        struct node *proximo;
    } no;

    void insere ( no **inicio, int valor ){
    no *aux = NULL;
    if ( *inicio == NULL ){
        *inicio = ( no* ) malloc ( sizeof( no ) );
        aux = *inicio;
    }
    else {
        aux = *inicio;
        while ( aux->proximo != NULL )
                aux = aux ->proximo;
        aux->proximo = ( no* ) malloc( sizeof( no ) );
        aux = aux ->proximo;
    }
    aux-> valor = valor;
    aux-> proximo = NULL;
    }

    void imprime ( no *list ){ //Função para imprimir os elementos da lista
       printf( "Números presentes na lista: ");
        while ( list != NULL ){
            printf ( "%d,  ", list->valor );
            list = list->proximo;
        }
        printf ( ".");
    }


    void remove_elemento(no **list, int posicao){
        no *aux = *list, *aux2 = NULL;
        int i;
        if((*list = NULL) || (posicao < 1))
            return;
        if(posicao == 1){
            aux  =  *list;
            *list = aux->proximo;
            free(aux);
            return;
        }
        for (i = 1; i < posicao-1; i++){
            if(aux->proximo == NULL)
                return;
            aux = aux->proximo;
        }
        aux2 = aux->proximo;
        if(aux2 != NULL){
                aux->proximo = aux2->proximo;
        free (aux2);

        }
        return;
    }

    int main(){
        no *list = NULL;
        insere (&list, 10);
        insere (&list, 26);
        insere (&list, 30);
        insere (&list, 45);

        imprime (list);

        remove_elemento(&list, 2); //remover posição
        printf("\n");

        imprime (list);

        return 0;

}

 

  • Solução
Postado

Seu programa pretende percorra a lista somente se o número de posições é maior que 1. Seja  posicao  igual à terceira da lista e o que pretende excluir, no fim, em  aux.  Com isso também  último valor no contador do loop for (int i) é igual a 3 na constante posicao. Vamos dizer com isso que aux2 é, na verdade, aux - 1 ou é o ponteiro logicamente anterior  ao  aux.

void remove_elemento (no **list, const int posicao){
        if (list == NULL) return;
        no *aux= *list, *aux2 = NULL; int i= 0x0;
  
        if ((aux == NULL) || (posicao < 1)) return; // if((*list = NULL) || (posicao < 1)) return;
        if (posicao == 1) {
            // aux  =  *list;
            *list= aux->proximo;
            free (aux);
            return;
        }
         for (i= 0x1; i < posicao; ++i) { // for (i= 1; i < posicao-1; i++) {
            if (aux == NULL) return; // if(aux->proximo == NULL) return;
           
            aux2= aux, aux= aux->proximo;
        }
        aux2->proximo = aux->proximo;
        // # Lembre-se que aux2 é logicamente anterior ao aux a cada laço for.
        // [!] aux2->proximo foi igual ao  aux  agora é igual ao aux->proximo  ou
        // o que vem depois de aux2 + 2 o mesmo que aux + 1. Resta apenas excluir o aux.
        free (aux);
        return;
    }

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...