Hola, el siguiente programa crea un fichero, añade un nuevo registro, busca un cliente y ordena los clientes por su nombre:
    
Código C:
Ver original- #include <stdlib.h> 
-   
- #include <stdio.h> 
-   
- #include <string.h> 
-   
- struct client{ 
-   
-     char nom[10]; 
-   
-     char cognom[30]; 
-   
-     char adreca[30]; 
-   
-     int dia; 
-   
-     int mes; 
-   
-     int any; 
-   
-     long int next; /* Punter al seguent registre */ 
-   
-     }; 
-   
-   
- main(){ 
-   
-   
-   
-     int op, i; /* Operacio del menu a excutar */ 
-   
-      
-   
-     void crear(); /* Modul de creacio del  fitxer */ 
-   
-     void escriu(); /* Modul que escriu nous registres al fitxer*/ 
-   
-     void cerca();  /* Modul per a cercar clients en el fitxer */ 
-     int n=12; 
-   
-   
-         int ordenar(); 
-   
-         struct client *c; /* Variable per a llegir les dades */ 
-   
-   
-     do{ /* Bucle del programa principal, segons valor de op */ 
-   
-         do{ 
-   
-   
-             printf("1.- Crear el fitxer.\n"); 
-   
-             printf("2.- Afegir un nou registre\n"); 
-   
-             printf("3.- Cercar clients.\n"); 
-             printf("4.- Ordenar clients.\n"); 
-   
-   
-   
-         }while( (op < 1) && (op > 5) ); 
-   
-   
-   
-         switch(op){ 
-   
-             case 1: {crear(); 
-   
-                  break;} 
-   
-             case 2: { escriu();  
-   
-                  break;} 
-   
-             case 3: {cerca(); 
-   
-                  break;} 
-             case 4: { 
-                     qsort(- c ,-  n , sizeof(- c ),-  ordenar );
 
-                        /*for(i=1; i <= n; i++) 
-                           printf("%s\t%s\n", (c+i)->nom, (c+i)->cognom);*/ 
-   
-                  break;} 
-   
-         } 
-   
-     }while(op != 5); 
-   
- } /* fi main */ 
-   
-         int ordenar(); 
-   
- void crear() { 
-   
-   
-   
-     int i; /* Control de bucle */ 
-   
-     char f; /* Indica la fi del bucle de entrada de dades */ 
-   
-         struct client c; /* Variable per a llegir les dades */ 
-   
-     FILE *pf; /* Punter al fitxer a crear */ 
-   
-   
-   
-     void escriu();/* Llegeix els nous registres al fitxer */  
-   
-   
-   
-     /* Creacio del fitxer */ 
-   
-   
-   
-     if((- pf =fopen("corty","wb"))==-  NULL ){
 
-   
-         printf("\n ERRADA AL CREAR EL FITXER CORTY \n"); 
-   
-   
-     } 
-   
-   
-   
-     /* Escriptura dels registre primaris amb valors buits */ 
-   
-   
-   
-     c.nom[0]='b';/* Valor inicial del nom, sera buit el registre */     //} 
-   
-     c.nom[1]='u';                                                       //}} 
-   
-     c.nom[2]='i';                                                       //}}}}esto es igual strcpy(c.nom,"buit"); 
-   
-     c.nom[3]='t';                                                       //}}} 
-   
-     c.nom[4]='\0';                                                      //}} 
-   
-     c.next=-1;                                                          //} 
-   
-   
-   
-   
-   
-     for (i=1; i<=12; i++){ /* Crea buits els registres primaris */ 
-   
-         printf("\nCrea registre %d\n",- i );
 
-   
-   
-     } 
-   
-      
-   
-   
-   
-     fclose(- pf ); /* Tanca el fitxer que em creat */
 
-   
-   
-   
-     do{ 
-   
-         printf("Entrada de dades dels Clients:\n\n"); 
-   
-         escriu(); 
-   
-   
-   
-     }while((f != 'n') && (f != 'N')); 
-   
-   
-   
- } /* Fi de crear */ 
-   
-   
-   
- void hueco(FILE *p, /* Punter al fitxer persona*/ 
-   
-     int x, /* Resultat del hash */ 
-   
-     struct client y /* Dades del nou registre */ ){ 
-   
-   
-   
-     int j; /* Per a veure si el registre triat pel hash es buit */ 
-   
-     long int k,m; /* Guarda a posicio de l'ultim registre de la llista */ 
-   
-     struct client c1; /* Valors dels registre anteriors al nou */ 
-   
-     char buit[5];  
-   
-     buit[0]='b'; 
-   
-     buit[1]='u'; 
-   
-     buit[2]='i'; 
-   
-     buit[3]='t'; 
-   
-     buit[4]='\0'; 
-   
-   
-   
-     fseek(- p ,- x */*este asterisco es multiplicacion*/sizeof(- c1 ),- SEEK_SET );
 
-   
-   
-     fread(&- c1 ,sizeof(- c1 ),1,- p ); /* Llegeix registre per a veure si es ple */
 
-   
-     j =strcmp(- c1. nom,- buit ); /* Igual a valor inicial? */
-   
-     if (j == 0) /* Registre buit */ 
-   
-     { 
-   
-         fseek(- p ,- x */*este asterispersonaco es multiplicacion*/sizeof(- y ),- SEEK_SET );
 
-   
-   
-     } 
-   
-     else { /* El registre primari no es buit */ 
-   
-     /* Ha de buscar l'ultim de la cadena */ 
-   
-         while(c1.next != -1){ 
-   
-             /* Situa el punter al seguent de la 
-   
-             llista */ 
-   
-             fseek(- p ,- c1. next,- SEEK_SET );
 
-   
-             k =ftell(- p ); /* Guarda la posicio per
-   
-                     si es l'ultim */ 
-   
-                 
-   
-             /* LLegeix el registre */ 
-   
-             fread(&- c1 ,sizeof(- c1 ),1,- p );
 
-   
-         } 
-   
-         /* Guardar el nou registre */ 
-   
-         fseek(- p ,0,- SEEK_END ); /* Va al final del
 
-   
-                       fitxer per guardar el 
-   
-                       nou registre */ 
-   
-         m =ftell(- p ); /* Posicio de l'ultim de la
-   
-                 llista */ 
-   
-   
-         /* A d'assignar la posicio del l'ultim 
-   
-         a seu predecessor */ 
-   
-         c1.next=m; 
-   
-         /* Posicio del registre predecessor per a 
-   
-         sobrescriure'l */ 
-   
-   
-   
-         } 
-   
- } 
-   
-   
-   
- void cerca(){ 
-   
-   
-   
-     struct client c1; /* Llegeix el registres fins trobar el que volem */ 
-   
-     int x; /* Resultat del hash */ 
-   
-     char n[30]; /* Nom del client a cerca */ 
-   
-     int d,m,a; /* Data de neiximent del client a cerca */ 
-   
-     int j; /* Resultat de comparar les cadenes de noms de clinets */ 
-   
-     FILE *pf; /* Punter al fitxer */ 
-   
-     char f; /* Permet aturar el programa al mostrar les dades */ 
-   
-   
-   
-     void leelin(); /* Llegix cadenes amb espais en blanc dintre */ 
-   
-     int fhash(); /* Modul que calcula la funcio hash aplidar */ 
-   
-   
-   
-     if((- pf =fopen("corty","rb"))==-  NULL ){
 
-   
-         printf("\n ERRADA AL OBRIR EL FITXER CORTY \n"); 
-   
-   
-     } 
-   
-     printf("\nCOGNOM del Client a CERCAR    :"); 
-   
-     leelin(&n,29); 
-   
-     printf("\nData de Neiximent: "); 
-   
-   
-   
-   
-   
-   
-   
-     x=fhash(d,m,a); /* Calcula el hash */ 
-   
-     fseek(- pf ,- x *sizeof(- c1 ),- SEEK_SET );
 
-   
-     do{ 
-   
-         fread(&- c1 ,sizeof(- c1 ),1,- pf );
 
-   
-   
-         if(j == 0) {/* Trobat */ 
-   
-             printf("\n%s  %s\n",- c1. nom,- c1. cognom);
 
-   
-             printf("\nPrem una tecla...."); 
-   
-   
-   
-         } 
-   
-         fseek(- pf ,- c1. next,- SEEK_SET );
 
-   
-     }while ((c1.next != -1) && (j != 0 )); 
-   
-   
-   
-     if (j != 0){ 
-   
-   
-         printf("\nPrem una tecla...."); 
-   
-   
-   
-     } 
-   
-   
-   
-   
-   
-   
- } /* fi de cerca */ 
-   
-   
-   
- int fhash(int day, int month, int year){ /* Calcula el hash en funcio de la 
-   
-                     data de neiximent */ 
-   
-   
-   
-     int res; /* Resultat del hash */ 
-   
-   
-   
-     res=(day + month + year) % 12;  /* Formula del hash */ 
-   
-   
-   
-     return(res);  /* Torna al modul cridant el resultat del hash */ 
-   
-   
-   
- } /* Fi de fhash */ 
-   
-   
-   
- void escriu(){/*Modul que llegeix els nous registres i crida a hueco*/ 
-   
-   
-   
-         struct client c; /* Variable per a llegir les dades */ 
-   
-     FILE *pf; /* Punter al fitxer a personacrear */ 
-   
-     int i; /* Pren el valor tornat per la funcio fhash */ 
-   
-      
-   
-     int fhash(); /* Modul que calcula la funcio hash aplidar */ 
-   
-     void leelin(); /* Llegix cadenes amb espais en blanc dintre */ 
-   
-     void hueco(); /* Escriu el nou registre al fitxer */ 
-   
-   
-   
-     if((- pf =fopen("corty","rb+"))==-  NULL ){
 
-   
-         printf("\nERRADA AL OBRIR FITXER\n"); 
-   
-   
-     } 
-   
-   
-     leelin(&c.nom,9); 
-   
-   
-     leelin(&c.cognom,29); 
-   
-   
-     leelin(&c.adreca,29); 
-   
-     printf("\nData de Neiximent: "); 
-   
-   
-   
-   
-   
-   
-   
-     c.next=-1; /* No apunta a cap registre,es l'ultim*/ 
-   
-     i=fhash(c.dia,c.mes,c.any); /*Calcula el hash*/ 
-   
-     hueco(pf,i,c); /* Modul que escriu al fitxer els nous registres */ 
-   
-   
-   
-   
- } /* Fi de escriu */ 
-   
-   
-   
- void leelin(char *linia,int lon){ 
-   
-   
-   
- /* Funcio que llegeix linies amb qualsevol caracter menys el LF, 
-   
-    caracter 10 taula ASCII de 7 bits */ 
-   
-   
-   
- /* Permet llegir linies amb espais en blanc */ 
-   
-   
-   
-     int i; /* Caracter d'entrada com a sencers */ 
-   
-     int j; /* Comtador del nombre de caracters llegits */ 
-   
-   
-   
-     j=0; 
-   
-   
-   
-     do{  /*Filtrat de LF o blancs inicials */ 
-   
-   
-     } 
-   
-     while((i==10) || (i==32)); 
-   
-   
-   
-        *(linia+j)=i; /* Assigna el 1er caracter llegit */ 
-   
-        j++; /* S'incrementa despres de llegir el 1er caracter */ 
-   
-   
-   
-        while((i!=10) && (j<=lon)){ /* Fins llegir el caracter LF o 
-   
-                        superar la longitud del vector */ 
-   
-   
-   
-         i =getchar(); /* Pren caracters del tecla */
-   
-         if((i!=10) && (j <= lon)) 
-   
-             *(linia+j)=i; /* Assigna el caracters llegits */ 
-   
-         else 
-   
-             *(linia+j)='\0'; /* Marca la fi de la cadena */ 
-   
-   
-   
-         j++; /* Incrementa el comptador de caracters llegits */ 
-   
-     } 
-   
- }  /* fi de leelin */ 
-   
-   
- int ordenar(struct client *c1, struct client *c2){ 
-     return (strcmp(- c1 ->- nom ,-  c2 ->- nom ));
 
- } 
Cuando le doy a la opción de ordenar me da fallo de segmentación, ¿por qué?