title: How to pass the reference of a node of a sublist through a function in C
body: <p>The C code here below, create a simple list reading from a file that contain some products each one defined by code product, code category, description, number and cost. Nextly, it copy each product in a list of list (or list of category) such that each main node contain the code category and some child nodes that are the products that belong to the category. The problem is in copiaMagazzino() function because I get this warning: "passing argument 1 of 'inserimentoProd' from incompatible pointer type". Is there a way to avoid that without change the structure of the program? </p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;stdlib.h&gt;
  #include &lt;string.h&gt;
  #include &lt;malloc.h&gt;
  
  #define C 8
  #define D 64
  
  typedef struct {
      char codP[C];
      char codC[C];
      char descr[D];
      int num;
      float costo;
  } tipoBaseLista;
  
  typedef struct nodoLista {
      tipoBaseLista info;
      struct nodoLista *next;
  }prodotti;
  
  typedef prodotti *listaP;
  
  typedef struct nodoCat{
      char codC[C];
      struct nodoCat *next;
      struct nodoLista *nodoP;
  }categoria;
  
  typedef categoria *listaC;
  
  int menu(void);
  void init_list(listaP *l);
  int carica_lista(char fName[], listaP *l);
  void inserimentoProd(listaP *l, tipoBaseLista p);
  void visualizzaLista(listaP l);
  void visualizzaMagazzino(listaC l);
  void cancella_elemento(listaP *l, char codice_prodotto[], char codice_categoria[]);
  int copiaMagazzino(listaC *lc, listaP l);
  
  int main() {
      char c;
      char filename[] = "Magazzino.txt";
      listaP listaProd = NULL;
      listaC listaCat = NULL;
      char cP[C], cC[C];
  
      for(;;) {
          //system("clear");
          switch(menu()) {
              case 1:
                  init_list(&amp;listaProd);
                  printf("\nNumero prodotti caricati: %d\n\n", carica_lista(filename, &amp;listaProd));
                  //printf("\n\nPress a key...");
                  //scanf("%c", &amp;c);
              break;
  
              case 2:
                  printf("\nInserisci il codice prodotto da cancellare: ");
                  scanf("%s", cP);
                  printf("\nInserisci il codice categoria: ");
                  scanf("%s", cC);
                  cancella_elemento(&amp;listaProd, cP, cC);
              break;
  
              case 3:
                  printf("\nNumero categorie caricate: %d\n\n", copiaMagazzino(&amp;listaCat, listaProd));
              break;
  
              case 4:
              break;
  
              case 5:
              break;
  
              case 6:
              break;
  
              case 7:
                  visualizzaLista(listaProd);
              break;
  
              case 8:
                  visualizzaMagazzino(listaCat);
              break;
  
              case 9:
                  system("clear");
                  exit(0);
          }
      }
  }
  
  int menu(void) {
      int v;
  
      printf("Premi 1 per caricare i dati da file di testo\n");
      printf("Premi 2 per cancellare un prodotto dalla lista prodotti\n");
      printf("Premi 3 per copiare i dati della lista prodotti nel magazzino\n");
      printf("Premi 4 per cancellare un prodotto dal magazzino\n");
      printf("Premi 5 per stampare i dati del magazzino\n");
      printf("Premi 6 per calcolare il prezzo medio e la quantita' media dei prodotti di una categoria\n");   
      printf("Premi 7 per visualizzare lista prodotti\n");
      printf("Premi 8 per visualizzare lista magazzino\n");
      printf("Premi 9 per uscire\n");
      do {
          printf("Enter Code:");
          scanf("%d", &amp;v);        
      } 
      while(v&lt;0 || v&gt;9);
      return v;
  }
  
  int carica_lista(char fName[], listaP *l) {
      tipoBaseLista prodotto;
      int n = 0;
      char buf[D] = {0};
      char scarto[30];
      FILE *f;
      f = fopen(fName, "r");
      if (f == NULL) {
          printf("Non e' possibile aprire il file\n");
          exit(1);
      }
      while (!feof(f)) {
          fgets(buf, sizeof(buf), f);
          sscanf(buf, "%s%s", prodotto.codP, scarto);
          //strcpy(prodotto.codP, buf);
          fgets(buf, sizeof(buf), f);
          sscanf(buf, "%s%s", prodotto.codC, scarto);
          //strcpy(prodotto.codC, buf);
          fgets(buf, sizeof(buf), f);
          strcpy(prodotto.descr, buf);
          fgets(buf, sizeof(buf), f);
          sscanf(buf, "%d", &amp;prodotto.num);
          fgets(buf, sizeof(buf), f);
          sscanf(buf, "%f", &amp;prodotto.costo);
  
          inserimentoProd(l, prodotto);       
          n++;        
      }
      fclose(f);
      return n;
  }
  
  
  void init_list(listaP *l) {
      listaP aux;
  
      printf("LIBERO LISTA\n");
      while(*l) {
          aux = *l;
          *l = (*l)-&gt;next;
          free(aux);
  
      }
  }
  
  void init_list_magazzino(listaC *l) {
      listaC aux;
  
      printf("LIBERO LISTA\n");
      while(*l) {
          aux = *l;
          *l = (*l)-&gt;next;
          //init_list((*l)-&gt;nodoP);
          free(aux);      
      }
  }
  
  void inserimentoProd(listaP *l, tipoBaseLista p) {
      listaP pCorrente = NULL;    
      listaP pPrec;
      listaP pNodo;
  
      pNodo = malloc(sizeof(prodotti));
      pNodo-&gt;info = p;
      pNodo-&gt;next = NULL;
  
      if (*l == NULL) {
          //printf("INSERIMENTO PRIMO ELEMENTO\n");       
          *l = pNodo;
      }
      else if(strcmp(p.codP, (*l)-&gt;info.codP) &lt; 0) {
          //printf("INSERIMENTON IN TESTA\n");        
          pNodo-&gt;next = *l;
          *l = pNodo;     
      }
      else {
          pPrec = *l;
          pCorrente = (*l)-&gt;next;
          while (pCorrente != NULL &amp;&amp; strcmp(p.codP, pCorrente-&gt;info.codP) &gt; 0) {
              pPrec = pCorrente;
              pCorrente = pCorrente-&gt;next;
          }
          if(pCorrente == NULL) {
              //printf("INSERIMENTON IN CODA\n");
              pPrec-&gt;next = pNodo;
          }       
          else {
              //printf("INSERIMENTON IN MEZZO\n");
              pNodo-&gt;next = pCorrente;
              pPrec-&gt;next = pNodo;
          }
      }
  }
  
  void visualizzaLista(listaP l) {
      if(l == NULL) {
          printf("Lista vuota. Nulla da visualizzare!\n");
      }
      else {
          while(l != NULL) {
              printf("\nCodice prodotto: %s\n", l-&gt;info.codP);
              printf("Codice categoria: %s\n", l-&gt;info.codC);
              printf("Descrizione: %s", l-&gt;info.descr);
              printf("Numero: %d\n", l-&gt;info.num);
              printf("Costo: %.2f\n", l-&gt;info.costo);
              l = l-&gt;next;
          }
      }
      printf("\n");
  }
  
  void visualizzaMagazzino(listaC l) {
      if(l == NULL) {
          printf("Lista vuota. Nulla da visualizzare!\n");
      }
      else {
          while(l != NULL) {
              printf("Codice categoria: %s\n", l-&gt;codC);
              l = l-&gt;next;
          }
      }
      printf("\n");
  }
  
  void cancella_elemento(listaP *l, char codice_prodotto[], char codice_categoria[]) {
      listaP pPrec;
      listaP pCorrente;
      pCorrente = *l;
      if (pCorrente == NULL)
          printf("\nLista vuota, nulla da cancellare\n");
      else {
          if (strcmp(pCorrente-&gt;info.codP, codice_prodotto) == 0 &amp;&amp; strcmp(pCorrente-&gt;info.codC, codice_categoria) == 0) {
              *l = pCorrente-&gt;next;
              free(pCorrente);
              printf("\nNodo cancellato in testa!\n");
          }
          else {
              pPrec = *l;
              pCorrente = (*l)-&gt;next;
  
              while ((pCorrente != NULL) &amp;&amp; ((strcmp(pCorrente-&gt;info.codP, codice_prodotto) != 0) || (strcmp(pCorrente-&gt;info.codC, codice_categoria) != 0))) {
                  pPrec = pCorrente;
                  pCorrente = pCorrente-&gt;next;
              }
              if(pCorrente == NULL) {
                  printf("\nElemento non trovato!\n");
              }
              else {
                  pPrec-&gt;next = pCorrente-&gt;next;
                  free(pCorrente);
                  printf("\nNodo cancellato in mezzo!\n");
              }
  
          }
  
      }
  
  }
  
  listaC trovaCategoria(listaC lc, char categoria[]) {
      listaC pCorrente = lc;
      while(pCorrente != NULL){
          if(strcmp(pCorrente-&gt;codC, categoria) == 0){
              printf("\nCategoria già presente %s\n",categoria);
              return pCorrente;
          }
          pCorrente = pCorrente-&gt;next;
      }
      return(NULL);
  }
  
  void insCat(listaC *lc, char cat[]) {
      listaC nodoC;
      listaC currC;
  
      nodoC = malloc(sizeof(categoria));
      strcpy(nodoC-&gt;codC, cat);
      nodoC-&gt;nodoP= NULL;
      nodoC-&gt;next = NULL;
  
      if(*lc == NULL) {
          *lc = nodoC;
      }
      else{
          currC = *lc;
          while(currC-&gt;next != NULL) {
              currC = currC-&gt;next;
          }
          currC-&gt;next = nodoC;
      }
  }
  
  int copiaMagazzino(listaC *lc, listaP l) {
      listaC trovato;
      int n = 0;
  
      if(l == NULL) {
          printf("\nLa lista dei prodotti è vuota!\n");
      }
      else {
          while(l != NULL) {
              trovato = trovaCategoria(*lc, l-&gt;info.codC);
              if(trovato == NULL) {
                  insCat(lc, l-&gt;info.codC);
                  n++;
                  inserimentoProd((*lc)-&gt;nodoP, l-&gt;info);
              }
              else {
                  inserimentoProd(trovato-&gt;nodoP, l-&gt;info);
              }
              l = l-&gt;next;
          }
      }
      return n;
  }
  </code></pre>