Questão 3(c) da Prova 1

Questão 3(c) da Prova 1

por José Coelho de Pina -
Número de respostas: 0

ITEM 3(c)

Escreva uma função de nome buscaRemove que recebe um inteiro x e apontador ini para uma lista encadeada com cabeça e remove da lista todas as células que contêm x.

As soluções utilizam a abreviatura

   struct celula {
     int conteudo;
     struct celula *prox;
   }
   typedef struct celula Celula;
ALGUMAS SOLUÇÕES ITERATIVAS

void
buscaRemove(int x, Celula *ini) 
{
  Celula *p; /* ponteiro para a celula anterior a que 
              * esta sendo examinada */
  Celula *q; /* ponteiro para a celula sendo examinada */

  p = ini; 
  q = p->prox;
  while (q != NULL) 
    {
      if (q->conteudo == x)  
        { 
          p->prox = q->prox;
          free(q);
        }
      else 
        p = q; 

      q = p->prox;
    }
}


/*
 * Hmmm. 
 * Nao gosto da versao abaixo...
 * Acho a versao anterior mais clara.
 */

void
buscaRemove(int x, Celula *ini) 
{
  while (ini->prox != NULL) 
    {
      if (ini->prox->conteudo == x)  
        { 
          Celula *p; /* ponteiro para a celula que sera removida */
          p = ini->prox; 
          ini->prox = ini->prox->prox;
          free(p);
        }
      else
        ini = ini->prox;
    }
}


ALGUMAS SOLUÇÕES RECURSIVAS

void
buscaRemove(int x, Celula *ini)
{ 
  Celula *p; /* ponteiro para a celula sendo examinada */

  if (ini->prox != NULL) /* lista nao esta vazia ? */
    {
      p = ini->prox;
      if (p->conteudo == x)
        { 
          ini->prox = p->prox;
          free(p);
          buscaRemove(x,ini);
        }
      else
        buscaRemove(x,ini->prox);
    }
}


void
buscaRemove(int x, Celula *ini)
{ 
  Celula *p; /* ponteiro para a celula sendo examinada */


  if (ini->prox == NULL) return; /* lista esta vazia ? */
  p = ini->prox;
  if (p->conteudo == x)
    { 
       ini->prox = p->prox;
       free(p);
       buscaRemove(x,ini);
    }
  else
    buscaRemove(x,ini->prox);
}


void
buscaRemove(int x, Celula *ini)
{ 
  if (ini->prox != NULL)
    {
      if (ini->prox->conteudo == x)
        { 
          struct celula *p = ini->prox; /* guarda end. da celula que 
                                           sera removida */
          ini->prox = ini->prox->prox;
          free(p);
          buscaRemove(x,ini);
         }
      else
        buscaRemove(x, ini->prox);
    }
}


void
buscaRemove(int x, Celula *ini)
{ 
  if (ini->prox == NULL) return;
  if (ini->prox->conteudo == x)
    { 
      struct celula *p = ini->prox; /* guarda end. da celula que 
                                           sera removida */
      ini->prox = ini->prox->prox;
      free(p);
      buscaRemove(x,ini);
    }
  else
    buscaRemove(x, ini->prox);
}