Sono tre file:

FILE lis.h
codice:
#include <malloc.h>
#include <string.h>

extern char file[100];

struct nodo {
   Sms val;
   struct nodo *next;
};

class Lista {
   public:
   Lista(void)
   {  
      lung = 0;
      l = NULL;
   }

   ~Lista(void)
   {  // DISTRUTTORE
      struct nodo *aux;
      while (l != NULL)
      {
	 aux = l;
	 l = l->next;
	 free(aux);
      }
      l = NULL;
      lung = 0;
   }

   void inserisci(int pos, Sms ele)
   {
      if ((pos >= 1) && (pos <= lung+1))
      {
	 int i = 1;
	 struct nodo *p = l;
	 struct nodo *aux = (struct nodo *)malloc(sizeof(struct nodo));
	 struct nodo *prec = NULL;
	 aux->val = ele;
	 while (i != pos)
	 {
	    prec = p;
	    p = p->next;
	    i++;
	 }
	 aux->next = p;
	 if (prec != NULL)
	    prec->next = aux;
	 else
	    l = aux;
	 lung++;
      }
   }

   void elimina(int pos)
   {
      if ((pos >= 1) && (pos <= lung))
      {
         int i = 1;
         struct nodo *p = l;
         struct nodo *prec = NULL;
         while (i != pos)
         {
	    prec = p;
	    p = p->next;
	    i++;
	 }
	 if (prec != NULL)
	    prec->next = p->next;
	 else
	    l = l->next;
	 free(p);
	 lung--;
      }
   }

   void mostra(int pos)
   {
      if ((pos >= 1) && (pos <= lung))
      {
	 struct nodo *p = l;
	 for (int i = 1; i != pos; i++)
	    p = p->next;
	 p->val.visualizza();
      }
   }
   
   void cerca(char *p)
   {
	   struct nodo *s;
	   for (s = l; s != NULL; s = s->next)
	   		if (s->val.confronta(p))
	   		{
		   		system("cls");
	   			s->val.visualizza();
	   			putchar('\n');
	   			system("PAUSE");
   			}
   }
	   

   int lunghezza(void)
   {
      return lung;
   }

   int vuota(void)
   {
      return (lung == 0);
   }
   
   void salva(void)
   {
	   struct nodo *p;
	   char scelta;
	   printf("\n\nVuoi salvare? ");
	   scanf("%c%*c",&scelta);
	   if (scelta != 's' && scelta != 'S')
	   		return;
	   FILE *fp = fopen(file,"w");
	   if (fp != NULL)
	   {
		   for (p = l; p != NULL; p = p->next)
			   fwrite(&(p->val), 1, sizeof(Sms), fp);
		   printf("\n\nSalvato\n\n");
		   fclose(fp);
	   }
	   else
	   		printf("\nNon riuscito\n");
	   	system("PAUSE");
   }

      
   protected: int lung;
   protected: struct nodo *l;
};

class Lista_ordinata : public Lista
{
   public: 
   void inserisci(Sms n)
   {
      int i;
      struct nodo *p;
      bool inserito = false;
      for (i = 1, p = l; i <= lung; i++)
      {
	 if (p->val >= n)
	 {
	    Lista::inserisci(i,n);
	    inserito = true;
	    break;
	 }
	 p = p->next;
      }
      if (!inserito)
      {
	 Lista::inserisci(lung+1,n);
	 inserito = true;
      }
   }

   void elimina(Sms n)
   {
      int i;
      struct nodo *p;
      bool eliminato = false;
      for (i = 1, p = l; p != NULL; i++, p = p->next)
      {
	 if (p->val == n)
	 {
	    Lista::elimina(i);
	    eliminato = true;
	    break;
	 }
      }
      if (eliminato)
	 printf("Operazione riuscita\n");
      else
	 printf("Elemento non presente\n");
   }
   
   FILE *apri(void)
   {
	   Sms aux;
	   struct nodo *p;
	   printf("\n\nChe file vuoi aprire? ");
	   scanf("%[^\n]%*c",file);
	   FILE *fp = fopen(file,"a+");
	   if (fp != NULL)
	   {
		   while (fread(&aux, 1, sizeof(Sms), fp))
		   	   inserisci(aux);
		   return fp;
	   }
	   else
	   {
	   		printf("\nNon riuscito\n");
	   		return NULL;
   		}
   }
};
FILE sms.h
codice:
class Sms
{
	private:
	char testo[481];
	char persona[20];
	char modo;
	struct data {
		unsigned int giorno, mese, anno;
	} data;
	struct ora {
		unsigned int ore, minuti;
	} ora;
	
	public:
	Sms()
	{
		testo[0] = '\0';
		persona[0] = '\0';
		modo = 'N';
		data.giorno =  data.mese =  data.anno = 0;
		ora.ore =  ora.minuti = 0;		
	}
	
	~Sms()
	{
		testo[0] = '\0';
		persona[0] = '\0';
		modo = 'N';
		data.giorno = data.mese = data.anno = 0;
		ora.ore = ora.minuti = 0;
	}
	
	int operator==(Sms &x)
	{
		if (modo == x.modo)
			if (data.giorno == x.data.giorno)
				if (data.mese == x.data.mese)
					if (data.anno == x.data.anno)
						if (ora.ore == x.ora.ore)
							if (ora.minuti == x.ora.minuti)
								if (strcmp(testo,x.testo) == 0)
									if (strcmp(persona,x.persona) == 0)
										return 1;
		return 0;
	}
				
	int operator>=(Sms &x)
	{
		if (data.anno > x.data.anno)
			return 1;
		if (data.anno == x.data.anno)
		{
			if (data.mese > x.data.mese)
				return 1;
			if (data.mese == x.data.mese)
			{
				if (data.giorno > x.data.giorno)
					return 1;
				if (data.giorno == x.data.giorno)
				{
					if (ora.ore > x.ora.ore)
						return 1;
					if (ora.ore == x.ora.ore)
					{
						if (ora.minuti >= x.ora.minuti)
							return 1;
					}
				}
			}
		}
		return 0;
	}
			
	void inserisci(void)
	{
		do {
			printf("\nInviato o Ricevuto? ");
			scanf("%c%*c",&modo);
		} while (modo != 'I' && modo != 'R');
		printf("\n%s chi? ",(modo == 'I') ? "A" : "Da");
		scanf("%[^\n]%*c",persona);
		printf("\nInserisci il testo:\n");
		scanf("%[^\n]%*c",testo);
		printf("\nAnno: ");
		scanf("%d%*c",&data.anno);
		printf("\nMese: ");
		scanf("%d%*c",&data.mese);
		printf("\nGiorno: ");
		scanf("%d%*c",&data.giorno);
		printf("\nOra: ");
		scanf("%d%*c",&ora.ore);
		printf("\nMinuti: ");
		scanf("%d%*c",&ora.minuti);
	}
	
	void visualizza(void)
	{
		printf("\n%s : %s",(modo == 'I') ? "Inviato a" : "Ricevuto da",persona);
		printf("\t\t%d/%d/%d",data.giorno,data.mese,data.anno);
		printf("\tOre %d:%d\n\n",ora.ore,ora.minuti);
		printf("%s\n",testo);
	}

	int confronta(char *p)
	{
		return (!(strcmp(p,persona)));
	}
};
FILE principale
codice:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "sms.h"
#include "lis.h"

char file[100];

int main()
{
	Lista_ordinata lista_sms;
	Sms sms;
	char pers[21];
	int scelta,i;
	FILE *fp = lista_sms.apri();
	if (fp == NULL)
		return 0;
	do {
		system("cls");
		printf("\nGESTIONE SMS\n\n");
		printf("1) Inserisci sms\n");
		printf("2) Ricerca\n");
		printf("3) Visualizza lista\n");
		printf("\n0)Fine\n");
		printf("\t\tScelta: ");
		scanf("%d%*c",&scelta);
		switch (scelta)
		{
			case 1:
				sms.inserisci();
				lista_sms.inserisci(sms);
				fwrite(&sms,1,sizeof(Sms),fp);
				fflush(fp);
				break;
			case 2:
				printf("Mittente/Destinatario: ");
				scanf("%[^\n]%*c",pers);
				lista_sms.cerca(pers);
				break;
			case 3:
				for (i = 1; i <= lista_sms.lunghezza(); i++)
				{
					system("cls");
					lista_sms.mostra(i);
					putchar('\n');
					system("PAUSE");					
				}
				break;
		}
	} while (scelta);
	fclose(fp);
}
uso il compilatore mingw