PDA

Visualizza la versione completa : [C] problema con esercizio su liste


MrX87
06-06-2008, 11:15
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 (http://fmgroup.polito.it/quer/teaching/laurea/tlp/esami/testi/AnniAccademiciPrecedenti/20050902.doc)
questo Ŕ il pezzettino di codice che ho iniziato a scrivere...solo le dichiarazioni e le strutture che penso di utilizzare...


#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 (http://fmgroup.polito.it/quer/teaching/laurea/tlp/esami/testi/AnniAccademiciPrecedenti/20050902.doc)
grazie in anticipo
mrx87

810106
06-06-2008, 15:41
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;

MrX87
07-06-2008, 12:48
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


#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);
}

MrX87
07-06-2008, 12:49
ah comunque lavoro su ubuntu 7.10 e uso come compilatore geany....

810106
07-06-2008, 13:25
[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;
}

810106
07-06-2008, 13:28
Assegnazione e gestione stringhe vuote:


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. :)

810106
07-06-2008, 13:36
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!? :)

MrX87
07-06-2008, 14:06
grazie mille...per la risposta....

MrX87
08-06-2008, 12:54
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...

Loading