Re: Help for my code
- From: "AK" <anoopkammaran@xxxxxxxxx>
- Date: 30 Nov 2005 01:54:18 -0800
TC wrote:
> Hi.
> I write a program in c language that read a text file and extrapolate
> the word. for all word the program calculate the number of the times
> that word is present in the text.
> The problem is the REALLOC that on my pc at times it produces error.
> Someone can help me for this error?
> Thank you
>
>
> /*Inclusione librerie*/
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
> #include <malloc.h>
> #include <ctype.h>
>
> /*Definizione della strutura Elemento*/
> typedef struct
> {
> char *parola;
> unsigned int freq;
> }Elem;
>
> /*Definizione della lista delle parole trovate*/
> struct Albero
> {
> Elem Elemento;
> struct Albero *s;
> struct Albero *d;
> };
>
> /*Definizione variabili*/
> //Albero ordinato per alfabeto
> struct Albero *treeA = NULL;
> //Albero ordinato per frequenze
> struct Albero *treeF = NULL;
>
> unsigned int count = 0;
>
> /*Definizione funzioni*/
> //Funzione di scansione del file costruzione delle parole e chiamata
> //della funzione di inseriento nell'albero ordinato per alfabeto
> void Scansione(FILE *pf);
> //Aggiungi nodo all'albero ordinato per alfabeto
> struct Albero *AggNodo_TreeA(struct Albero *nodo, char *parola);
> //Stampa albero
> void Print(struct Albero *nodo);
> //Crea un nuovo albero ordinato per frequenza utilizzando come sorgente
> l'albero
> //ordinato per alfabeto
> void CreaAlberoF(struct Albero *sorg);
> //Aggiunge un nuovo nodo all'albero ordinato pre frequenze copiando i
> valori dal
> //nodo passato come sorgente
> struct Albero * AggNodo_TreeF(struct Albero *sorg, struct Albero *dest);
>
>
> main (void)
> {
> int fOK;
> //Nome del file di testo
> char *NF;
> //Puntatore al file
> FILE *pf;
> /*MAIN*/
> printf("\n Avvio del programma \n");
>
> do
> {
> printf("\nInserire il nome del file di testo che si desidera
> utilizzare (Esempio: Testo.txt) \n");
>
> NF = (char*)malloc(sizeof (char));
> NF[0]='\0';
>
> do
> {
> scanf("%s",NF); //Lettura del nome del file
> }
> while (strlen(NF)<4);
>
> pf=fopen(NF, "r"); //Apertura del file in modalità di lettura
>
> //Controllo apertura del file
> if (pf==NULL)
> {
> //Restituzione del messaggio di errore in caso di mancata
> apertura
> perror("ERRORE nell'apertura del file");
> fOK = 0;
> }
> else
> {
> fOK = 1;
> }
> }while(fOK != 1);
>
> printf("\n\n");
>
> int iScelta = 0;
>
> do
> {
> /*Menù*/
> printf("\n 1- Scansione del file di testo \n");
> printf("\n 2- Creazione del file delle parole ordinato per
> frequenza \n");
> printf("\n 3- Stampa a video del file delle parole ordinato per
> frequenza \n");
> printf("\n 4- Stampa a video del file delle parole ordinato per
> ordine alfabetico \n");
> printf("\n 5- Esci \n");
>
> do
> {
> scanf("%d", &iScelta);
> }while(iScelta!= 1 && iScelta!= 2 && iScelta!= 3 && iScelta!= 4
> && iScelta!= 5);
>
> //Blocco di scelta
> switch(iScelta)
> {
> case (1):
> Scansione(pf);
> printf("\n Scansione EFFETTUATA! \n");
> break;
> case (2):
> CreaAlberoF(treeA);
> printf("\n Lista delle parole ordinata per
> frequenza creata! \n");
> break;
> case (3):
> count=0;
> Print(treeF);
> break;
> case(4):
> count=0;
> Print(treeA) ;
> break;
> default:
> exit(0);
> }
> }while(iScelta!=5);
> }
>
> /*Funzione che effettua la scansione del file per individuare le parole
> e richiama la funzione di aggiunta di un nuovo elemento all'albero
> alfabeto*/
> void Scansione (FILE *pf)
> {
> char *parola; //Parola
> char c; //Variabile per la letura dei caratteri dal file di testo
> char *carattere; //Variabile utilizzatata per la concatenazione
> int lung; //Lunghezza della parola
>
> //Istanziazione e inizializzazione della variabile carattere
> carattere = (char*)malloc(2*sizeof(char));
> carattere[0]='\0';
>
> //Istanziazione e inizializzazione della variabile parola
> //parola = (char*)malloc(1*sizeof(char));
> // parola[0]='\0';
>
> while(!feof(pf)) //Ripete fino alla fine del file
> {
>
> fread(&c,1*sizeof(char),1,pf); //Lettura del carattere
> printf("\n carattere letto->%c",c);
> //Controllo se il carattere è presente nell'alfabeto
> if (isalpha(c))
> {
> printf("\n carattere valido");
> //Calcolo della lunghezza della parola
> lung=strlen(parola);
> //Assgnamento del valore alla variabile carattere
> carattere[0]=c;
> carattere[1]='\0';
> parola=(char*)realloc(parola,(lung+1)*sizeof(char));
> //lowercase
> *carattere = tolower(*carattere);
> //Concatenzazione dei caratteri per formare la parola
> parola = strcat(parola,carattere);
> printf("\n valore attuale di parola->%s",parola);
> }
> else
> {
> //Inserimento della parola
> if ((parola[0]!='\0'))
> {
> //printf("%s",parola);
> //Richiamo della funzione che aggiunge le parole
> nell'albero
> //ordianto per alfabeto
> if (treeA == NULL)
> {
> //Aggionamemto della radice
> treeA = AggNodo_TreeA(treeA,parola);
> }
> else
> {
> AggNodo_TreeA(treeA,parola);
> }
> //Reinizializzazione della variabile parola
> //parola=NULL;
> parola=(char*)realloc(parola,sizeof(char));
> parola[0]='\0';
> }
> }
> }
> //Chiusura file
> fclose(pf);
> }
>
> //Funzione di aggiunta di un nodo all'albero
> struct Albero *AggNodo_TreeA(struct Albero *nodo, char *parola)
> {
> if (nodo == NULL)
> {
> //Creazione nuovo nodo dell'albero
> nodo = (struct Albero*) malloc(sizeof(struct Albero));
> //Imposto il valore dei puntatori ai nodi figli
> nodo->d = NULL;
> nodo->s = NULL;
> //Impostazione della frequenza
> nodo->Elemento.freq = 1;
> //Allocazione della memoria per la stringa contenete la parola
> if(!(nodo->Elemento.parola =
> (char*)malloc(strlen(parola)*sizeof(char))))
> {
> printf("\n Errore di allocazione della memoria.\n");
> }
> //Copia della stringa
> strcpy(nodo->Elemento.parola,parola);
> //Se è il primo inserimento aggiorno il puntatore alla radice
> dell'albero
> printf("\n Parola inserita nel nodo: %s",nodo->Elemento.parola);
> }
> else
> {
> //Variabile che restituisce il valore della comparazione parola
> int conf;
> //Comparazione della parola
> conf = strcmp(nodo->Elemento.parola,parola);
> printf("\n S1: %s S2: %s Ris: %d",nodo->Elemento.parola,parola,conf);
> //printf("%d",conf);
>
> switch(conf)
> {
> case (1):
> nodo->s = AggNodo_TreeA(nodo->s,parola);
> break;
> case (-1):
> nodo->d = AggNodo_TreeA(nodo->d,parola);
> break;
> default:
> //Se le parole sono uguali incremento il valore della
> frequenza
> nodo->Elemento.freq = nodo->Elemento.freq + 1 ;
> }
> }
> return nodo;
> }
>
> //Funzione di stampa dell'albero passato in input
> void Print(struct Albero *nodo)
> {
>
> if (nodo != NULL)
> {
>
> //Richiamo della funzione sul ramo sinistro
> Print(nodo->s);
>
> if (count == 10 )
> {
> printf("\n Premere un tasto per continuare...\n");
> getchar();
> count = 0;
> }
> else
> {
> count++;
> }
> //Stampa della parola
> printf("\n PAROLA: %s ", nodo->Elemento.parola);
> printf(" FREQUENZA: %d ", nodo->Elemento.freq);
>
> //Richiamo della funzione sul ramo destro
> Print(nodo->d);
> }
> }
>
> struct Albero * AggNodo_TreeF(struct Albero *sorg, struct Albero *dest)
> {
> if (dest == NULL)
> {
> //Creazione nuovo nodo dell'albero
> dest = (struct Albero*) malloc(sizeof(struct Albero));
> //Imposto il valore dei puntatori ai nodi figli
> dest->d = NULL;
> dest->s = NULL;
> //Impostazione della frequenza
> dest->Elemento.freq = sorg->Elemento.freq;
> //Allocazione della memoria per la stringa contenete la parola
> dest->Elemento.parola =
> (char*)malloc(sizeof(sorg->Elemento.parola));
> //Copia della stringa
> strcpy(dest->Elemento.parola,sorg->Elemento.parola);
> }
> else
> {
> //Comparazione Frequenza
> if ( dest->Elemento.freq < sorg->Elemento.freq)
> {
> dest->s = AggNodo_TreeF(sorg,dest->s);
> }
> else
> {
> dest->d = AggNodo_TreeF(sorg,dest->d);
> }
> }
> return dest;
> }
>
> /*Funzione che crea l'abero delle frequenze partendo dall'abero ordinato per
> alfabeto passato in input*/
> void CreaAlberoF(struct Albero *sorg)
> {
> struct Albero *nodoprec;
> if (sorg != NULL)
> {
> CreaAlberoF(sorg->s);
> if (treeF == NULL)
> {
> treeF = AggNodo_TreeF(sorg, treeF);
> }
> else
> {
> AggNodo_TreeF(sorg, treeF);
> }
> CreaAlberoF(sorg->d);
> }
> }
Please translate your comments in English would you?
.
- References:
- Help for my code
- From: TC
- Help for my code
- Prev by Date: Neater method of creating a linked list
- Previous by thread: Help for my code
- Next by thread: Neater method of creating a linked list
- Index(es):