Problema com remoção em lista dinamica - C.

FELiYCORA

1st Folding then Sex
Boas
é o seguinte, preciso de retirar elementos de uma lista simplesmente ligada. ando aki as voltas e já tentei de tudo e dá-me sempre ou um segmentation fold ou um fatal error. o mais eskesito é que ja mudei bastante o codigo e acontece sempre o mesmo: apaga da lista todas as entradas necessarias menos a última...

Código:
void executa_remocao (COMP **base)
{
  COMP *comp;
  COMP *aux;
  COMP *anterior;
  comp = *base;
  anterior = *base;
  
  while(comp != NULL)
  {
    aux = NULL;
    if(comp->Inst == -1)
    {
      aux = comp; 
      if(comp == *base)             /* SE O COMPONENTE A REMOVER FOR O PRIMEIRO DA LISTA */
      {
        *base = (*base)->prox;
      }
      else
      {
          while((anterior->prox)->prox != NULL)
          {
            if(anterior->prox == comp)
            {
              anterior->prox = comp->prox;
              break;
            }
            else
            anterior = anterior->prox;
          }
        }
     }
    
    comp = comp->prox;
    if(aux != NULL)
      free(aux);
  }
}

Pf ajudem

obrigado
 
Boas!

Não percebi o que faz o comp, no entanto algo que me fez um pouco de confusão é que se for o primeiro elemento a remover, de facto alteras a base da lista (julgo que seja o primeiro item), mas depois associas o comp ao elemento seguinte e voltas a efectuar uma iteracção na lista..., e mais uma vez (parece-me) que voltas a associar a base ao valor seguinte (ou seja, andaste 2 posições).

Pelo menos parece-me isto..., visão de quem não conhece bem o código e não sabe o que é o comp, se puderes faz uma pequena descrição do que é cada variável, sff.

Já agora, é segmentation fault.

abraços, HecKel
 
modifiquei a funçao depois de ter alterado a estrutura COMP de lista dinamica simples para duplamente ligada.

o codigo ficou assim, mas da-me o mesmo segmentation fault mas desta vez eu sei k falta algo so n sei o quê. o comp neste caso é o mesmo que a base.

k axas:

Código:
void executa_remocao (COMP **base)
{
  COMP *comp_aux;
  COMP *comp;
  comp = *base;
  
  while(comp != NULL)
  {
    if(comp->Inst == -1)
    {
      (comp->ant)->prox = (comp)->prox;
      (comp->prox)->ant = (comp)->ant;
    } 
    comp_aux = comp;
    comp = comp->prox;
    if(comp_aux->Inst == -1)
      free(comp_aux);
  }
}
 
Back
Topo