Ho alcuni problemi con la procedura di cancellazione di un elemento inserito nel file. Qualcuno può aiutarmi?
Non capisco quali errori ci possano essere!!! Grazie a tutti!!!!

codice:
//Procedura per cancellare un abbonamento
void CancellaProdotto()   
{           
  char cFileTemp[]="tempfile.dat"; /*File temporaneo: serve per copiare tutti i 
    dati da mantenere nel file1; verrà poi rinominato con il nome del file1*/
  PointerElem1 pTemp1;  //variabile puntatore per la gestione della lista1
  PointerElem1 pTemp1_2;
  char Codicel[LCODICE];
  PointerElem1 pApp1; // variabile nella quale viene ricopiata la lista1
  bool bCancellato=false;  //variabile che indica se è stato cancellato 
  bool bElem=false;  //se è vera vuol dire che vi era un solo elemento nella lista1
  CaricaFile1();
  system("CLS");
  system("color C");
  pApp1=pLista1;
  cancella(Codicel,LCODICE);
  cout<< "Inserisci codice prodotto: ";
  cin.getline(Codicel,sizeof(Codicel));
  while (pApp1 != NULL)
  {
    if(ControllaListaVuota1(pLista1))
    { 
      system("cls");
      system("color C");
      cout<<"Non sono stati inseriti elementi!!!\n";
      system("pause");
    } 
    else
    { 
      if (iNRecordFile1==1) //se vie è un solo elemento nella lista
      {
        //se è uscito i dati vengono cancellati, altrimenti no
        if (strcmp(pLista1->DatiProdotto.codice,Codicel)==0)
        {
          bElem=true;
          bCancellato=true;
          pTemp1_2=pLista1;
          pLista1=pTemp1_2->pNext1;
          //cancella l'elemento dalla lista
          delete pTemp1_2;
          remove(cFile1);
        }    
      }
      //se si tratta di più di un elemento nella lista
      if (bElem==false)
      {     
        pTemp1=pLista1;
        pTemp1_2=pLista1->pNext1; 
        while (pTemp1_2 !=NULL)
        {   
          if (strcmp(pTemp1_2->DatiProdotto.codice,Codicel)==0)
          {
            bCancellato=true;
            pTemp1->pNext1=pTemp1_2->pNext1;
            //Cancella l'elemento dalla lista
            delete pTemp1_2;
          }
          pTemp1_2=pTemp1_2->pNext1;
          pTemp1=pTemp1->pNext1;
        }
        pTemp1=pLista1;
        while (pTemp1 !=NULL)
        {      
          if(strcmp(pTemp1->DatiProdotto.codice,Codicel)!=0)
          {     
            strcpy(Catalogo.codice,pTemp1->DatiProdotto.codice);
            strcpy(Catalogo.descrizione,pTemp1->DatiProdotto.descrizione);
            strcpy(Catalogo.minima,pTemp1->DatiProdotto.minima);
            strcpy(Catalogo.misura,pTemp1->DatiProdotto.misura);
            strcpy(Catalogo.prezzo,pTemp1->DatiProdotto.prezzo);
            strcpy(Catalogo.quantita,pTemp1->DatiProdotto.quantita);
            strcpy(Catalogo.reparto,pTemp1->DatiProdotto.reparto);
            /*Apro il file in modalità "ios::app": questo permette di aggiungere 
              il record appena inserito nella lista. I dati vengono scritti
              nel FileTemp*/
            FileOut.open(cFileTemp ,  ios::out | ios::binary | ios::app);
            if(FileOut)
            {
              //Controllo che il file sia aperto e funzionante
              if(FileOut.good())
              {
                //Effettuo la scrittura del record in coda al file
                FileOut.write((char*) &Catalogo, sizeof(Prodotto));
              }
              //Chiusura del file
              FileOut.close();
            }
          }
          pTemp1=pTemp1->pNext1;
        }
      }//if
       pApp1=pApp1->pNext1;
    }//else

  }

 deleteFile(cFile1);
  rename(cFileTemp, cFile1);  //il FileTemp viene rinominato con il nome del File1
  
  if (iNRecordFile1!=0)
  {
    cout<<"...............Cancellazione avvenuta con successo!!!...............\n";
    system("pause");
  }
  EliminaListaMemDin1(pLista1, Catalogo);
  return;
  Menu_princ();
}