codice:
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
# include <ctype.h>
# define DIM 200
# define MAX_CODE 100
#define IS_FULL(ptr) (!(ptr))
#define IS_EMPY(ptr) (!(ptr))
typedef struct // struttura per memorizzare le parole e il numero di occorrenze
{
char t [20];
int occ;
} parola ;
typedef struct ele {
int key;
struct ele*link;
}Ele;
Ele *davanti[MAX_CODE];
Ele *crea_coda( Ele *davanti, int riga );
//void crea_coda ( Ele *davanti, int riga );
void stampa_lista( Ele *inizio);
//coda_pointer davanti[MAX_CODE],dietro[MAX_CODE];
void inserimento( char s[], parola A[], int *n, int righe);
void ordina ( parola A[], int n )
{
int i,j,pos,min;
char parola;
int occorrenze;
char buffer[30];
for (i = 0 ; i < n - 1 ; i++)
{
for (j = i + 1 ; j < n ; j++)
{
if (A[i].t > A[j].t)
{
strcpy(buffer,A[j].t);
strcpy(A[j].t,A[i].t);
strcpy(A[i].t,buffer);
occorrenze = A[j].occ;
A[j].occ = A[i].occ;
A[i].occ = occorrenze;
}
}
}
}
void stampa ( parola A[], int n )
{
int i;
for (i=0;i<n;i++)
{
printf ("parola : %s occorrenze: %d ",A[i].t,A[i].occ);
stampa_lista(davanti[i+1]); // i+1 perchè mettendo solo 1 sbagliava!
// printf("\n\n");
}
}
void stampa_lista( Ele *inizio)
{
while(inizio)
{
printf(" riga: ");
printf("%d",inizio->key);
inizio = inizio->link;
}
printf("\n\n");
/*
for (;inizio;inizio = inizio->link)
{
printf("riga: ");
printf("%d",inizio->key);
}
printf("\n\n");
*/
}
int ricerca( char s[], parola A[], int n)
{
int i,pos= -1;
int dim=strlen(s);
for(i=0;i<dim; i++)
s[i]=tolower(s[i]); // converte in minuscolo ogni lettera
if( (s[dim-1]=='!') || (s[dim-1]=='?') || (s[dim-1]=='.') || (s[dim-1]==':')
|| ( s[dim-1]==',') || (s[dim-1]==';')) //l'ultimo carattere è punteggiatura
{
s[dim-1]='\0';
}
for (i=0;(i<n) && (pos <0);i++)
{
if ( strcmp (s,A[i].t )==0)
pos = i;
}
return pos;
}
Ele *crea_coda( Ele *davanti, int riga )
//void crea_coda ( Ele *davanti, int riga )
{
Ele *p;
Ele *aux = NULL;
p = (Ele*) malloc (sizeof(Ele) );
p->key = riga;
p->link = NULL;
//if (!davanti)
// return(p);
//else
{
aux = davanti;
while ( aux->link && aux->link->key != riga) // per vedere se ho già inserito quel numero di riga aggiungere && aux->key != riga
aux = aux->link;
aux->link = p;
// printf(" ------- riga crea_coda P: %d AUX: %d riga: %d\n",p->key,aux->link->key,riga);
return (davanti);
}
}
void inserimento( char s[], parola A[], int *n, int righe)
{
int pos;
pos = ricerca(s,A ,*n);
if (pos <0) // la parola non esiste ancora perciò la creo
{
A[*n]. occ =1;
strcpy (A[*n].t,s);
pos=(*n); // da togliere serve alla printf
(*n)++;
}
else // aggiorno il contatore esistente
A[pos].occ++;
// printf("--- ho messo [ %s ] in A[ %d ] ho passato la riga [ %d ]\n", s,pos,righe);
// creo la coda con i numeri di riga
crea_coda(&davanti[pos],righe);
//davanti[pos] = crea_coda( &davanti[pos], righe ); da cancellare
//
}
int main()
{
parola A[DIM];
FILE *fp;
char s [20];
int n =0; // posizione nel vettore dell'ultima parola inserita
char c;
int righe = 1;
int i;
for ( i = 0 ; i < 10 ; i++ )
davanti[i] = NULL;
fp= fopen("testo.txt","rt");
if (fp== NULL)
{
printf (" file non trovato\n");
exit ( -1);
}
while (! feof(fp ))
{
// fscanf (fp ,"%s[^ \f\n\r\t\v]%c",s,&c); // con s al posto di 255 non riesce a contare le righe!
fscanf (fp ,"%255[^ \f\n\r\t\v]%c",s,&c);
//
// printf("riga: %d parola:%s carattere: %c \n",righe,s,c);
inserimento(s, A, &n, righe); // passa la parola,l'array e 0 (la prima volta)
if (c == '\n')
righe++;
}
fclose (fp);
printf("\n\n\n");
//ordinamento della lista
ordina(A,n);
stampa (A,n);
printf ("\n\nfine premi invio per uscire");
fflush(stdin);
getchar();
}