Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [c] controllare se un elemento è presente in una lista

    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?

    codice:
    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;

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,299
    Mostra il main e la funzione alloca_memoria
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    codice:
    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;
    
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,299
    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?)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    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..

    codice:
    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);
      	}
    
    }

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,299
    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 è?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    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!)

    codice:
    #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;
    
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.