Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500

    [C] problema con esercizio su liste

    ciao a tutti avevo un problema su un esercizio con le liste, per la risoluzione avevo pensato di utilizzare 3 liste dove in ognuna vado a salvare le registrazioni degli utenti, nella seconda gli alberghi e nella terza gli accompagnatori; inoltre volevo sapere se si poteva fare una sorta di struttura che mi permette di gestire le tre liste( tipo handle-maniglia)...

    ecco il link del testo:
    link_testo
    questo è il pezzettino di codice che ho iniziato a scrivere...solo le dichiarazioni e le strutture che penso di utilizzare...
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define N 20+1
    
    typedef struct impiegatoR {
            char nome[N];
            char cognome[N];
            char reg[N];
            int flag;
            struct impiegatoR *next;
    }impR;
    typedef struct impiegatoA {
            char nome[N];
            char cognome[N];
            char alb[N];
            int flag;
            struct impiegatoA *next;
    }impA;
    typedef struct impiegatoACC {
            char nome[N];
            char cognome[N];
            char acc[N];
            int flag;
            struct impiegatoACC *next;
    }impACC;
    /*questo che segue dovrebbe essere la struttura che mi permettere di accedere alle altre liste, 
    naturalmente non so se è corretta e non so come gestirla, sia per la lettura delle singole 
    liste e la allocazione dinamica/*
    typedef struct maniglia {
            struct impiegatoR *reg;
            struct impiegatoA *alb;
            struct impiegatoACC *accomp;
    }handle;
    link_testo
    grazie in anticipo
    mrx87

  2. #2
    Utente di HTML.it L'avatar di 810106
    Registrato dal
    Jun 2008
    Messaggi
    67

    io farei cosi:

    codice:
    typedef enum record_id {
      REGISTRAZIONE,
      ALBERGO,
      ACCOMPAGNATORE
    } record_id_t;
    
    typedef char string_t[N];
    
    #define BASIC_MEMBERS  \
      record_id_t id;                 \
      string_t nome, cognome; \
      int flag
    
    typedef struct record 
    {
      BASIC_MEMBERS;
    } record_t;
    
    typedef struct registrazione
    {
        BASIC_MEMBERS;
        string_t reg;
    } registrazione_t;
    
    typedef enum qualifica_albergo 
    {
        3STELLE,
        4STELLE
    } qualifica_albergo_t;
    
    typedef struct albergo 
    {
        BASIC_MEMBERS;
        qualifica_albergo_t q;
    } albergo_t;
    
    ...
    
    typedef struct list {
      struct list *precedente, *successivo;
      record_t *record;
    } list_t;
    Ogni nodo ha un puntatore a `record_t', che contiene solo `nome', `cognome' e flag. Puoi usare `puntatore->id per sapere di che tipo si tratta e fare un cast per accedere agli ulteriori dati;

  3. #3
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    grazie per l'aiuto 810106 ma alla fine sono riuscito a risolvere...usando solo una lista generale con campi nome cognome albergo stato e un puntatore ad un'altra lista che invece contiene gli accompagnatori...in modo che se incontro un una stringa d questo tipo:
    "Rossi Mario registrazione membro"
    "Rossi Mario registrazione nonmembro"
    devo salvare solo la seconda...e quindi basta sovrascrivere nel campo stato relativo a mario rossi e il gioco è fatto!!! cmq per maggiori informazioni posto il codice...magari date un'okkiata...sono spuntati però altri problemi...ovvero quando gestire nella stampa le stringhe "vuote"....e poi il compilatore mi da un errore di assegnamento incompatibile tra 2 puntatori...ve lo segnalo nel codice cn un commento...grazie mille
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define N 20
    
    typedef struct accompagnatori {
            char nomeACC[N];
            char cognACC[N];
            struct accompagnatori *next;
    }acc;
    
    typedef struct impiegato {
            char nome[N];
            char cognome[N];
            char stato[N];
            char albergo[N];
            struct accompagatori *acc_top;
            struct impiegato *next;
    }imp;
    
    imp* newR ( );
    acc* newA ( );
    imp* gestioneR ( imp *top ); 
    imp* gestioneA ( imp *top );
    acc* inserimento ( acc*, char*, char* );
    
    int main ()
    {
        imp *head;
        imp *pNew;
        imp *p;
        int flag;
        
        FILE *aptr;
        char nome[N], cogn[N], scelta[N], classe[N], tmp2[N]; 
        
        head =  NULL;
        
        aptr = fopen("testo.txt","r");
        
        while ( fscanf(aptr,"%s%s%s%s", nome, cogn, scelta, classe) != EOF ) {
              flag=0;
              if ( strcmp(scelta,"registrazione")==0 ) {
                   p = head;
                   while ( p != NULL ) {
                   		if ( strcmp(p->nome,nome)==0 && strcmp(p->cognome,cogn)==0 ) {
                   			strcpy (p->stato, classe);
                   			flag = 1;
                   		}
                   p=p->next;
                   }
                   if ( flag == 0 ) {
                   		pNew = newR ( );
                   		strcpy (pNew->nome, nome);
                   		strcpy (pNew->cognome, cogn);
                   		strcpy (pNew->stato, classe);
                   		pNew->acc_top = NULL;
                   
                   		if ( head == NULL ) {
                        	pNew->next=NULL;
                        	head = pNew;
                   		}
                   		else {
                        	pNew->next=head;
                       		head = pNew;
                   		}
                   }
              
              }
              else if ( strcmp(scelta,"albergo")==0 ) {
                   p = head;
                   while ( p != NULL ) {
                   		if ( strcmp(p->nome,nome)==0 && strcmp(p->cognome,cogn)==0 ) {
                   			strcpy (p->albergo, classe);
                   			flag = 1;
                   		}
                   p=p->next;
                   }
                   if ( flag == 0 ) {
                   		pNew = newR ( );
                   		strcpy (pNew->nome, nome);
                   		strcpy (pNew->cognome, cogn);
                   		strcpy (pNew->stato, classe);
                   		pNew->acc_top = NULL;
                   
                   		if ( head == NULL ) {
                        	pNew->next=NULL;
                        	head = pNew;
                   		}
                   		else {
                        	pNew->next=head;
                       		head = pNew;
                   		}
                   }
              }
              else if ( strcmp(scelta,"accompagnatore")== 0 ) {
                  	fscanf (aptr,"%s", tmp2);
                  	p = head;
                   	while ( p != NULL ) {
                   		if ( strcmp(p->nome,nome)==0 && strcmp(p->cognome,cogn)==0 ) {
    /*questa funzione sotto mi da l'errore di assegnazione non compatibile*/
                   			p->acc_top = inserimento ( p->acc_top, classe, tmp2 );
                   			flag = 1;
                   		}
                   	p=p->next;
                   	}
                   	if ( flag == 0 ) {
                   		pNew = newR ( );
                   		strcpy (pNew->nome, nome);
                   		strcpy (pNew->cognome, cogn);
    /*questa funzione sotto mi da l'errore di assegnazione non compatibile*/
                   		pNew->acc_top = inserimento ( pNew->acc_top, classe, tmp2 );
                   	
                   		if ( head == NULL ) {
                        	p->next=NULL;
                        	head = p;
                   		}
                   		else {
                        	pNew->next=head;
                       		head = pNew;
                   		}
                   	}
        	}
        }	
        /*problema con la stampa e la gestione di eventuali stringhe vuote*/
        p = head;
        while ( p != NULL ) {
              printf ("Cognome: %s\n", p->cognome);
              printf ("Nome: %s\n", p->nome);
              printf ("\tStatus: %s\n", p->stato);
              printf ("\tAlbergo %s", p->albergo);
         p=p->next;   
        }
        printf ("\n");
        
    		 
        return(1);
    }
    imp* newR ( ) 
    {   
        imp* p;
        
        p=(imp*)malloc(sizeof(imp));
        
        if ( p == NULL ) {
             printf ("Errore allocazione!\n");
             exit(1);
        }
        return (p);
    }
    acc* newA ( )    
    {
        acc *pA;      
        
        pA = (acc*)malloc(sizeof(acc));
        
        if ( pA == NULL ) {
             printf ("Errore allocazione!\n");
             exit(1);
        }
        return (pA);
    }
    acc* inserimento ( acc* top, char *nome, char *cogn ) 
    {
    	acc* pNew;
    	
    	pNew = newA ( );
    	strcpy (pNew->nomeACC,nome);
    	strcpy (pNew->cognACC,cogn);
    	
    	if ( top == NULL ) {
    		pNew->next = NULL;
    		top = pNew;
    	}
    	else {
    		pNew->next = top;
    		top = pNew;
    	}
    	return(top);
    }

  4. #4
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    ah comunque lavoro su ubuntu 7.10 e uso come compilatore geany....

  5. #5
    Utente di HTML.it L'avatar di 810106
    Registrato dal
    Jun 2008
    Messaggi
    67
    [CODE]
    while ( p != NULL ) {
    printf ("Cognome: %s\n", p->cognome);
    printf ("Nome: %s\n", p->nome);
    printf ("\tStatus: %s\n", p->stato);
    printf ("\tAlbergo %s", p->albergo);
    p=p->next;
    }

  6. #6
    Utente di HTML.it L'avatar di 810106
    Registrato dal
    Jun 2008
    Messaggi
    67

    :)

    Assegnazione e gestione stringhe vuote:
    codice:
      while ( p != NULL ) {
              printf ("Cognome: %s\n", p->cognome ? p->cognome : "");
              printf ("Nome: %s\n", p->nome ? p->nome : "");
              printf ("\tStatus: %s\n", p->stato ? p->stato : "");
              printf ("\tAlbergo %s", p->albergo ? p->albergo : "");
         p=p->next;   
        }
    Per l'assegamento devi controllare i valori ritornati dalla funzione che devono essere puntatori dello stesso tipo
    e con gli stessi qualificatori.

  7. #7
    Utente di HTML.it L'avatar di 810106
    Registrato dal
    Jun 2008
    Messaggi
    67
    Scusate per sbaglio mentre sistemavo il messaggio ho premuto <TAB><INVIO> e mi ha inserito quella risposta
    incomprensibile Come si fa a cancellare? Qualche buon mod potrebbe fare sta opera di bene!?

  8. #8
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    grazie mille...per la risposta....

  9. #9
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    comunque per quanto riguarda l'incompatibilità del puntatore ritornato dalla funzione "inserimento", ho controllato e sembra che tutto corrisponde...sia il tipo del puntatore da ritornare sia il puntatore al quale viene assegnato il puntatore ritornato dalla funzione sia il tipo che deve ritornare la funzione...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.