1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por FELiYCORA, 5 de Janeiro de 2007. (Respostas: 3; Visualizações: 1084)

  1. FELiYCORA

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

    HecKel The WORM

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

    FELiYCORA 1st Folding then Sex

    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);
      }
    }
     
  4. FELiYCORA

    FELiYCORA 1st Folding then Sex

    ja descobri, faltava-me um if
     

Partilhar esta Página