Newsgroup: it.comp.lang.c
Titolo: Per l'ennesima volta, aiutooo!!!

Lo so che qualcuno mi odierà per tutte queste richieste d'aiuto, ma questa
volta è una cosa seria: il mio problema è che devo scrivere un programma che
legga da un file non ordinato ad accesso diretto dei records e li ordini
secondo due chiavi in una lista indice.
Questa lista indice è una lista di records contenente 4 campi, chiave 1,
chiave2 e posizione del record all'interno del file, ho provato a crivere il
programma, ma bo, non so spiegarmi perchè non gira, misteri de C,     C'E'
QUALCUNO CHE SA SPIEGARMI IL PERCHE' E DARMI QUALCHE DRITTA?
AIUTOOOOOOOOOO!!!
Questa è la schifiezza che fino ad ora sono riuscita a fare:
/* Programma allocazione schedario biblioteca */
#include <stdio.h>
#include <stdlib.h>
typedef struct libri * punt_l;
typedef struct indice_libri * punt_i;
typedef struct libri {
        int posizione;
        char autore[30];
        char titolo[30];
        char editore[30];
        int anno_pub;
        char argomento[15];
        int prestito;
        struct libri *successivo;
       } libro;
typedef struct indice_libri {
        char autore[30];
        int posizione;
        fpos_t *posizione_file;
        struct indice_libri* succ;
       } libro_in;
punt_i testa;
void inserisci_lista(punt_i *elemento, punt_i *radice, punt_i *precedente)
{punt_i* temp;
 temp=(punt_i*)malloc(sizeof(libro_in));
 (*temp)->succ=NULL;
 strcpy((*temp)->autore, (*elemento)->autore);
 (*temp)->posizione_file=(*elemento)->posizione_file;
 (*temp)->posizione=(*elemento)->posizione;
 (*temp)->succ=NULL;
 if (*radice==NULL) *radice=(*temp);
 else
 if (strcmp((*radice)->autore, (*temp)->autore)==0)
 {if ((*radice)->posizione > (*temp)->posizione)
{(*temp)->succ=(*radice)->succ;
            (*radice)->succ=(*temp);
           }
  else
    {(*temp)->succ=(*radice);
     (*precedente)->succ=(*temp);
    }
 }
 else
 if (strcmp((*elemento)->autore, (*radice)->autore)<0)
 {(*temp)->succ=(*radice);
  (*precedente)->succ=(*temp);
 }
 else
 inserisci_lista(&(*elemento), &(*radice)->succ, &(*radice));
}
void crea_lista()
{FILE *fp;
 punt_l temp1;
 punt_i temp2;
 fp=fopen("archivio.dat", "rb");
 if (fp==NULL) {clrscr();
  gotoxy(20,10); puts("***  File non esistente  ***");
  getch();
        }
 else
 while (!feof(fp)) {
      temp1=(punt_l)malloc(sizeof(libro));
      temp2=(punt_i)malloc(sizeof(libro_in));
      fgetpos(fp, temp2->posizione_file);
      fread(temp1, sizeof(libro), 1, fp);
      strcpy(temp2->autore, temp1->autore);
      printf("%s", temp1->titolo);
      temp2->posizione=temp1->posizione;
      temp2->succ=NULL;
      inserisci_lista(&temp2, &testa, NULL);
      free(temp2);
      free(temp1);
     };
 fclose(fp);
 return;
}
void stampa(punt_i radice)
{punt_l temp;
 FILE *fp;
 if (radice==NULL) return;
 fsetpos(fp, (radice->posizione_file));
 fread (temp, sizeof(libro), 1, fp);
 printf("\nTitolo       :   %s", temp->titolo);
 printf("\nAutore       :   %s", temp->autore);
 printf("\nPosizione    :   %d", temp->posizione);
 printf("\nEditore      :   %s", temp->editore);
 printf("\nAnno Publicaz:   %d", temp->anno_pub);
 printf("\nArgomento    :   %s", temp->argomento);
 if (temp->prestito==0) printf("\nDisponibile");
 else
 printf("\nNon disponibile");
 if (radice->succ!=NULL) stampa(radice->succ);
 else
 getch();
}
void inserimento(void)
{FILE *fp;
 punt_l temp;
 int i,j;
 char prestito;
 fp=fopen("archivio.dat", "wb");
 temp=(punt_l)malloc(sizeof(libro));
 temp->successivo=NULL;
 clrscr();
 gotoxy(10,5); printf("Immettere Titolo   : "); scanf(" %[^\n]",
temp->titolo);
 gotoxy(10,6); printf("Immettere Autore   : "); scanf(" %[^\n]",
temp->autore);
 gotoxy(10,7); printf("Immettere Posizione: "); scanf("%d", &i);
 temp->posizione=i;
 gotoxy(10,8); printf("Immettere Editore  : "); scanf(" %[^\n]",
temp->editore);
 gotoxy(10,9); printf("Immettere Argomento: "); scanf(" %[^\n]",
temp->argomento);
 gotoxy(10,10); printf("Immettere Anno Pub.: "); scanf("%d", &j);
 temp->anno_pub=j;
 gotoxy(10,11); printf("Il libro Š prestato? ");
 while ((prestito!='s')&&(prestito!='n')) prestito=getch();
 if (prestito=='s') temp->prestito=1;
 else
 temp->prestito=0;
 fseek(fp, 0L, 2);
 fwrite(temp, sizeof(libro), 1, fp);
 free(temp);
 fclose(fp);
}
void stampa2(punt_i nodo)
{if (nodo==NULL) return;
 printf("%s", nodo->autore);
 printf("%d", nodo->posizione);
 if (nodo->succ!=NULL) stampa2(nodo->succ);
}
void main()
{char scelta;
 testa=NULL;
 while (scelta!='f')
 {clrscr();
  gotoxy(25,2); puts(" ***   Menu principale   ***");
  gotoxy(10,5); puts("1) Caricamento file");
  gotoxy(10,6); puts("2) Stampa File");
  gotoxy(10,7); puts("3) Inserimento dati");
  gotoxy(10,8); puts("4) Stampa 2");
  gotoxy(10,12); puts("f) Fine");
  scelta=getch();
  switch(scelta)
  {
   case '1' : crea_lista(); break;
   case '2' : stampa(testa); break;
   case '3' : inserimento(); break;
   case '4' : stampa2(testa); getch(); break;
  };
 };
}
Se qualcuno sente questo disperato grido d'aiuto .......
Grazie per l'attenzione e scusatemi se rompo!!!!

Ragazzi, chiunque volesse darmi una risposta non importa piů, grazie mille,
ma ce l'ho fatta da solo!!!!! Sěěěěěěěěě!!!!!!!
Grazie lo stesso per la buona volontŕ!!!!!!!
            un salutone a tutti!!!!
                        Marc