Error removing element from a chained list in c

Asked

Viewed 62 times

2

The function retiraLifo is not working and there is some syntax error, but I did not find it. This function is to remove element from the list. A insereLifo is working.

The following error occurs:

C: Users [Warning] Passing argument 2 of 'retiraLifo' makes Pointer from integer without a cast

The code:

//insere inicio retira fim
#include <stdio.h>
#include <stdlib.h>
#define SUCESSO 1
#define FALHA  -1

 typedef struct ElementoLifo   ElementoLifo;
struct ElementoLifo {
   int            dado;       // dado deste elemento
   ElementoLifo *proximo;    // elemento seguinte a este
   ElementoLifo *anterior;
};
typedef struct Lifo   Lifo;
struct Lifo {
   int          nelemen;     // nro elementos desta fila
   ElementoLifo * inicio;      // primeiro elemento desta fila
   ElementoLifo * fim;         // ultimo elemento desta fila
};

int  destroiLifo (Lifo *fila);
 int insereLifo (Lifo *fila, int dado);
 int retiraLifo (Lifo *fila, int *dado);
 Lifo *criafila();    // cria uma nova fila
int nelementos    (Lifo *fila);  // retorna nro elementos

Lifo  *criafila() {    // cria uma nova fila
   Lifo *nova = malloc( sizeof(Lifo) );
   nova->nelemen = 0;
   nova->inicio  = NULL;
   nova->fim     = NULL;
   return nova;   // retorne a nova fila criada
}
 int nelementos    (Lifo *fila) {  // retorna nro elementos
    return fila->nelemen;
}
int insereLifo (Lifo *fila,int dado ) {

    ElementoLifo *novo = malloc( sizeof(ElementoLifo));
    novo->dado = dado;
    novo->proximo = fila->inicio;

    if(fila->nelemen==0)      // 1a insercao (fila vazia) ?
        fila->fim = novo;     // se fila vazia, então novo elemento é também o fila->fim

    fila->inicio = novo;      // inserção no inicio: novo elemento é o fila->inicio

    fila->nelemen++;
    return SUCESSO;
}
int retiraLifo (Lifo *fila, int *dado) {

ElementoLifo *fim = fila->fim;
   if(fim!=NULL)  // // existe o ultimo elemento (fila não-vazia)?
   {
     *dado = fim->dado;
      fila->nelemen--;

      if((fila->nelemen)==0) { // a fila esvaziou?
            fila->inicio=NULL;
            fila->fim=NULL;
      }
      else
      if((fila->nelemen)==1) { // fila ficou com apenas 1 elemento?
            fila->fim = fila->inicio;
            fila->fim->proximo = NULL;
      }
      else  // fila ficou com mais que 1 elemento
      {
           ElementoLifo *ultimo = fila->inicio;  // procure qual será agora o ultimo elemento da fila
            while(ultimo->proximo != fim) ultimo = ultimo->proximo;
            fila->fim = ultimo;          // encontrou - ajuste os ponteiros de ligação
            fila->fim->proximo = NULL;
      }

      free(fim);   // devolva a memoria ao SO
      return SUCESSO;
   }
   else
      return FALHA;

}


int main(int argc, char const *argv[])
{ 

    Lifo *fila1 = criafila();
    printf("fila criada, nro elem=%d \n", nelementos(fila1));
    insereLifo (fila1,1 );
    printf("INSERCAO NO INICIO, nro elem=%d \n", nelementos(fila1));
    insereLifo (fila1,2 );
    printf("INSERCAO NO INICIO, nro elem=%d \n", nelementos(fila1));
    insereLifo (fila1,3 );
    printf("INSERCAO NO INICIO, nro elem=%d \n", nelementos(fila1));

    retiraLifo (fila1,3);
    printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));
    retiraLifo (fila1,2);
    printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));
    retiraLifo (fila1,1);
    printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));




  return 0;
}
  • Ola Vilmar, update your question with the error Voce is receiving.

  • Instead of putting "[SOLVED]" in the title of the question, make the answer accepted by clicking on who is next to her. This serves not only to mark your question but also to mark which answer solved it.

1 answer

2


Your mistake is quite clear, you are passing an integer where a pointer is expected.

This is the excerpt from your main that presents this problem. Note that the second parameter of retiraLifo is a whole:

retiraLifo (fila1,3);
printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));
retiraLifo (fila1,2);
printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));
retiraLifo (fila1,1);
printf("RETIRADA NO FIM, nro elem=%d \n", nelementos(fila1));

Maybe what you wanted was this:

int retirado;
retiraLifo (fila1, &retirado);
printf("RETIRADA NO FIM %d, nro elem=%d \n", retirado, nelementos(fila1));
retiraLifo (fila1, &retirado);
printf("RETIRADA NO FIM %d, nro elem=%d \n", retirado, nelementos(fila1));
retiraLifo (fila1, &retirado);
printf("RETIRADA NO FIM %d, nro elem=%d \n", retirado, nelementos(fila1));

In this case here, the second parameter is the memory location where the value obtained from the queue will be stored. Therefore, it makes no sense to pass 1, 2 or 3 in this parameter, as you are(va) doing.

  • 1

    really Victor, thank you very much .

Browser other questions tagged

You are not signed in. Login or sign up in order to post.