PDA

Visualizza la versione completa : [c] controllare se un elemento presente in una lista


Butterfly1988
29-05-2013, 12:42
Ciao ragazzi,
devo inserire delle stringhe in una lista, aggiornandone solo il numero di occorrenze nel caso in cui la stringa sia gi presente. Il codice che ho scritto il seguente ma mi d problemi nell'inserimento. In particolare non riesce a effettuare il controllo del campo word con la parola da inserire, e mi dice in continuazione che la lista vuota..qualcuno pu aiutarmi?




struct stringa
{
char *word;
int number;
struct parola *next;

};

void inserisci(char *w, struct stringa *punt)
{

//devo allocare spazio per il nuovo elemento
struct stringa *nuova;
nuova=alloca_memoria();

//alloco spazio per il campo char *word
if((nuova->word=(char *)malloc(strlen(w)+1))==NULL)
{
fprintf(stderr, "Errore allocazione memoria\n");
exit(EXIT_FAILURE);
}

//copia della parola
printf("copio\n");
strcpy(nuova->word,w);
nuova->occorrenze=1;
printf("occorrenza aggiornata\n");

//aggiorno puntatori
punt=nuova;
nuova->next=NULL;
printf("puntatori aggiornati\n");

}





void controlla(char *word, struct stringa *testa)
{
struct stringa *p; //per appoggio
int trovata=0; //flag
p=testa;

//se la lista vuota devo per forza inserirla
if(p==NULL)
{ printf("lista vuota\n");
inserisci(word,testa);
}

//se la lista non vuota, la scorro e controllo se c' la parola
else
{ //scorri la lista
for(p=testa; p->next==NULL || trovata==0 ; p=p->next)
{
if(strcmp(p->word,word)==0)
{
printf("gia in lista!!!!\n");
//aggiorno solo le occorrenze
(p->number)++;
trovata=1;
}

}
//se alla fine non l'ho trovata, la inserisco
inserisci(word,p);
}

}


nella main imposto che
struct string *testa=NULL;

oregon
29-05-2013, 12:47
Mostra il main e la funzione alloca_memoria

Butterfly1988
29-05-2013, 13:01
int main(int argc, char *argv[])
{
struct string *head = NULL;

if(argc<2)
{
fprintf(stderr, "Usage: %s <file>", argv[0]);
return EXIT_FAILURE;
}

leggi(argv[1], head); //le parole vengono lette da un file dato come argomento

stampa(head);


return EXIT_SUCCESS;

}

void leggi(char *file, struct string *testa)
{
FILE *file;
char str[10];

printf("apertura file\n");

if((file=fopen(f, "w+")) == NULL)
{
fprintf(stderr, "Errore nell'apertura del file\n");
exit(EXIT_FAILURE);
}

printf("lettura..\n");

while(!feof(file))
{
if(fgets(str, 10, file))
printf("STRINGA LETTA:%s\n", str);
controlla(str,testa);
}

}


struct string *alloca_memoria()
{
printf("allocazione memoria\n");
struct string *p;
p=malloc(sizeof(struct parola));
if(p==NULL)
{
fprintf(stderr, "Errore allocazione memoria\n");
exit(EXIT_FAILURE);
}

return p;

}

oregon
29-05-2013, 14:35
Scusa ma come compili questo senza avere errori?

[/code]
void leggi(char *file, struct string *testa)
{
FILE *file;
char str[10];

printf("apertura file\n");

if((file=fopen(f, "w+")) == NULL)
[/code]

Cosa f ?
Perch esiste la stessa variabile (file) di due tipi diversi (addirittura uno come argomento?)

Butterfly1988
29-05-2013, 14:42
Si scusami, in realt cosi,ho sbagliato a riscrivere.. sulla lettura comunque non mi da problemi, perch ho fatto anche una stampa di prova ed tutto ok..




void leggi(char *f, struct string *testa)
{
FILE *file;
char str[10];

printf("apertura file\n");

if((file=fopen(f, "w+")) == NULL)
{
fprintf(stderr, "Errore nell'apertura del file\n");
exit(EXIT_FAILURE);
}

printf("lettura..\n");

while(!feof(file))
{
if(fgets(str, 10, file))
printf("STRINGA LETTA:%s\n", str);
controlla(str,testa);
}

}

oregon
29-05-2013, 16:24
Ok ma c' ancora confusione ... ad esempio scrivi

struct string *p;
p=malloc(sizeof(struct parola));

per allocare una struct parola con un puntatore a struct string ... e poi string cosa ?

Butterfly1988
29-05-2013, 16:41
:dh: scusami solo che nel frattempo che aspettavo una risposta ho cambiato il codice e poi ho fatto un casino nella copia...ecco l'ultima versione...qui non dovrebbero esserci errori di scrittura (scusami ancora!)



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


struct parola
{
char *word;
int occorrenze;
struct parola *next;
};



struct parola *alloca_memoria()
{
printf("alloco memoria\n");
struct parola *p;
p=malloc(sizeof(struct parola));
if(p==NULL)
{
fprintf(stderr, "Errore allocazione memoria\n");
exit(EXIT_FAILURE);
}

return p;

}

void inserisci(char *w, struct parola *punt)
{
printf("inserimento\n");

//devo allocare spazio per il nuovo elemento
struct parola *nuova;
nuova=alloca_memoria();

//alloco spazio per il campo char *word
if((nuova->word=(char *)malloc((strlen(w)+1)*(sizeof(char))))==NULL)
{
fprintf(stderr, "Errore allocazione memoria\n");
exit(EXIT_FAILURE);
}

//copia della parola
printf("copio\n");
nuova->word=strcpy(nuova->word,w);
nuova->occorrenze=1;
printf("occorrenza aggiornata\n");

//aggiorno puntatori

nuova->next=NULL;
punt=nuova;
printf("puntatori aggiornati\n");

}


void controlla(char *word, struct parola *head)
{
printf("controllo\n");
struct parola *p; //per appoggio
int trovata=0; //flag
p=head;

//se la lista vuota devo per forza inserirla
if(p==NULL)
{ printf("lista vuota\n");
inserisci(word,head);
}

//se la lista non vuota, la scorro e controllo se c' la parola
else
{ //scorri la lista
for(p=head; p!=NULL || trovata==0 ;head=p->next, p=p->next)
{ //se trovo la parola
if(strcmp(p->word,word)==0)
{ printf("gia in lista!!!!\n");
//aggiorno solo le occorrenze
(p->occorrenze)++;
trovata=1;

}

}

//se alla fine non l'ho trovata, la inserisco IN CODA
inserisci(word,p);

}

}

void stampa(struct parola *cima)
{

printf("stampo\n");
struct parola *temp;
if (cima==NULL)
printf ("No elements to print!\n");
else {
temp=cima;
do {
printf ("%s\n", temp->word);
temp=temp->next;
} while (temp!=NULL);
}
}



void leggi_file(char *f,struct parola *head)
{
FILE *file;
char s[10];

printf("apro file\n");

if((file=fopen(f, "r")) == NULL)
{
fprintf(stderr, "Errore nell'apertura del file\n");
exit(EXIT_FAILURE);
}

fseek(file,0,SEEK_SET);
printf("leggo_file\n");



while(!feof(file))
{
if(fgets(s, 10, file))
printf("ho letto:%s\n", s);
controlla(s,head);
}

printf("fatto\n");
}


int main(int argc, char *argv[])
{
if(argc<2)
{
fprintf(stderr, "Usage: %s <file_input>", argv[0]);
return EXIT_FAILURE;
}

struct parola *head= NULL;

leggi_file(argv[1],head);
stampa(head);


return EXIT_SUCCESS;

}

Loading