Ir ao conteúdo

Posts recomendados

Postado

Estou aprendendo sobre listas encadeadas(Lista lineares) e tive um problema na implementação de uma função que remove da lista um valor.

 

 

Ocorreu erros quando tento remover o primeiro elemento da lista e o ultimo

 

 

Função:

void listRemove(Lista *list, int item){
    Lista *atual, *anterior, *aux;
    atual = list;

    while(atual != NULL){
        if(atual->valor == item){
            if(anterior == NULL){
                /*Removendo o primeiro elemento da lista*/
                list = list->prox;
                aux = atual;
                atual = atual->prox;
                free(aux);
            }
            else{
                if(atual->prox != NULL){
                    anterior->prox = atual->prox;
                    aux = atual;
                    atual = atual->prox;
                    free(aux);
                }
                else
                {
                    /*Atual é o ultimo elemento então apenas remova-o*/
                    aux = atual;
                    free(aux);
                }
            }
        }
        anterior = atual;
        atual = atual->prox;
    }
}

 

Postado

poste o código todo, ou um mínimo compilável que permita reproduzir o problema.

 

1 hora atrás, Inutilzao disse:
void listRemove(Lista *list, int item){
    Lista *atual, *anterior, *aux;
    atual = list;

 

Sobre o que postou...

 

Tem nada menos que 4 ponteiros para lista para uma coisa tão simples quanto remover um item. É muito. É demais.

 

O código sugere que quer remover a primeira ocorrência de um certo valor na lista.

 

Um problema aparente aqui é que, como é comum ver em toda parte, está representando um nó como se fosse uma lista. Não postou sequer a estrutura da lista, mas entenda que listas são containers. Coleções de coisas. Aparentemente no seu caso essas coisas são simples int.

 

É possível escrever assim mas é uma ideia ruim. Um nó não é uma lista, uma lista não é um nó. Um nó não é o dado: o dado está dentro dele. Mais ainda: possivelmente cada nó tem um ponteiro para o dado e não o dado. Porque? Porque assim fica genérico, e a lista pode ser de qualquer coisa. Não precisaria mexer mais nas funções da lista se mudasse o conteúdo, e poderia resolver TODOS os exercícios de lista com as mesmas funções. . . ;) 

 

Sugiro reescrever

 

Ainda sobre isso:

 

1 hora atrás, Inutilzao disse:
    void listRemove(Lista *list, int item);

 

 

Evite retornar void. Em geral é um desperdício. Muitas vezes um erro. Aqui poderia retornar 0 se removeu o item ou 1 se não encontrar, por exemplo.

 

E quais são os parâmetros?

 

Sào list, cujo tipo é Lista*, e item. cujo tipo é int. Coo está aprendendo, evite ao máximo o vício de declarar assim. Está declarando dois nomes e dois tipos. Não misture as coisas. Só dificulta a compreensão.

 

Exemplos:

 

   void listRemove(Lista *list, int item); // [1] original

   void listRemove( Lista*    list, int item); // [2] o real

   void listRemove(    Lista *     list      , int       item); // [3] com mais espacos

 

Para o compilador tanto faz, os espaços são descartados. Mas a realidade é uma só:

 

  • São dois argumentos
  • O primeiro, list é do tipo Lista*
  • O segundo, item, é do tipo int.
  • [2] é a realidade e expressa os dados

É claro que se list é Lista*   *list é Lista. Isso é a definição de C. Mas é consequência da declaração e não a declaração. Declarar como fez é comum, mas apenas dificulta a compreensão das coisas.

 

Se declarar

 

    char** **   vendas = NULL;

 

Está declarando um ponteiro. Um arquivo csv pode ser carregado na memória assim. Não é incomum. É a realidade. Um workbook (planilha) pode ser mais sinistro, com 6 asteriscos e 3 contadores.

 

Isso quer dizer que
 

       *vendas é char***
      **vendas é char**
     ***vendas é char*
    ****vendas é um char

 

É assim em C. E C++. Na declaração o asterisco é uma coisa, na expressão é outra. E ainda indica multiplicação. :) 

 

 

 

Crie uma estrutura para a Lista que contenha os ponteiros para os nos no inicio e no fim e o tamanho.

 

Crie uma estrutura para o nó

 

Crie uma estrutura para o item

 

Reescreva as funções e terá muito menos trabalho e poderá usar o código em outros programas

  • Curtir 1
  • Obrigado 1

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!