Ti posto le correzioni alla funzione cerca , e alla funzione elimina , commentate nel codice .
L'indentazione è inesistente , e non è un bel vedere , se un insegnate vedesse codice scritto cosi'
minimo dimezza il voto



codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct tabella{
 int cod_prod;
 char nome_prod[10];
 char tipo_prod[20];
 float prezzo;
 int cancellato;
 };
typedef struct tabella frutta;
void menu();
void insElemento();
void cercaElemento();
void delElemento();
void visElemento();
int main(){
 int comando;
 do{
 menu();
 printf("\nComando:\t");
 scanf("%d", &comando);
 switch(comando){
  case 1:{
   insElemento();
   break;
  }
  case 2:{
   cercaElemento();
   break;
  }
  case 3:{
   delElemento();
   break;
  }
  case 4:{
   visElemento();
   break;
  }
 }
 }while(1);
 return 0; 
}
void menu(){
 printf("--------------------------");
 printf("\n1 - Inserisci Prodotto\n");
 printf("2 - Cerca Prodotto\n");
 printf("3 - Elimina Prodotto\n");
 printf("4 - Visualizza Prodotti\n");
 printf("--------------------------");
}
void insElemento(){
 int risp;
 FILE *fp;
 struct tabella frutta;
 fp=fopen("frutta.txt","a");
 do{
  printf("Inserisci il codice del prodotto: ");
  scanf("%d", &frutta.cod_prod);
  printf("Inserisci il nome del prodotto: ");
  scanf("%s", frutta.nome_prod);
  printf("Inserisci la tipologia del prodotto: ");
  scanf("%s", frutta.tipo_prod);
  printf("Inserisci il prezzo del prodotto: ");
  scanf("%f", &frutta.prezzo);
  fwrite (&frutta, sizeof (struct tabella), 1, fp);
  
  printf("Continuare? 1:SI - 0:NO\t");
  scanf("%d", &risp);
 }while (risp==1);
 fclose(fp);
}
 void cercaElemento(){ //Ho provato il comando strcmp, ma di norma si dovrebbe fare con il codice.
  int search;//IL CODICE E' UN NUMERO INTERO 
  int trovato =0; //  Variabile che usiamo come simil bool 
  FILE *fp;
  struct tabella frutta;
  printf("Inserire il CODICE del prodotto da ricercare "); 
   scanf("%d",&search); 
   fp=fopen("frutta.txt", "r"); 
   while(fread(&frutta, sizeof(struct tabella), 1, fp)>0){
   
      if ( search==frutta.cod_prod) 
      {  
           printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
           trovato=1;
      }
  //PERCHE NON FUNZIONA l'ELSE?? INFATTI MI STAMPA Elemento non trovato tante volte quanto gli elementi presenti nel file.
      
     }
     
     if(!trovato)
           printf("Elemento non trovato!\n");
         
}
 
 
 void delElemento(){
     //Piccole modifice al codice CERCA DI CAPIRLO DA SOLO 
     
     /* La logica che hai seguito è giusta , ossia creiamo un
        file copia , che contiene tutti gli elementi i record , tranne
        quello con codice da eliminare , e sucessivamente cancelliamo
        il file di origine e rinominiamo il file destinazione, ora quello
        che hai sbagliato , e visto che la struttura il record lo devi elinare
        non ti devi preuccupare di modificarlo , a te serve solo riconscerolo 
        tramite codice prodotto */
  
 
  struct tabella frutta; 
  printf("Inserire il codice prodotto da eliminare: "); 
   scanf("%d", &elimina); 
  
  
  
  //Cancellazione fisica
  FILE *fp1, *fp2; 
  fp1=fopen("frutta.txt", "r"); 
  fp2=fopen("frutta2.txt", "w"); 
  while(!feof(fp1)){  
  fread(&frutta, sizeof(struct tabella), 1, fp1);  
  if (frutta.cod_prod!=elimina)   //Scrivo tutti i record tranne quello con codice uguale ad elimina 
  fwrite(&frutta, sizeof(struct tabella), 1, fp2); 
  } 
  fclose(fp1); 
  fclose(fp2); 
  remove("frutta.txt"); 
  rename("frutta2.txt","frutta.txt");
 }
 void visElemento(){
  FILE *fp;
  struct tabella frutta;
  fp=fopen("frutta.txt","r");
  
  while(fread(&frutta, sizeof (struct tabella), 1, fp)>0){
  printf("Cod: %d\tNome: %s\tTipo: %s\tPrezzo: %f E\n" , frutta.cod_prod, frutta.nome_prod, frutta.tipo_prod, frutta.prezzo);
 }
  fclose(fp);
 }