PDA

View Full Version : [C] Liste di liste.


ciusss89
27-05-2010, 15:48
Salve,

Ho un problema nella definizione della struttura dati. Vorrei fare una lista di liste.

Tale necessità è dattata dalla sistuzione seguente:
ho un file che contiene un numero indefinito di paziente, sul quale su ogni riga è riportato paziente è temperatura.

Esempio del file in ingresso.

1 36.3 ROSSI
1 36.6 BIANCHI
2 37.1 ROSSI
3 36.1 BIANCHI
4 39.2 ROSSI
5 34.1 ROSSI

HO pensato la struttura dati cosi:
Una lista principale che contiene soldanto i nomi dei pazienti (in questo caso solo 2), e una lista secondaria che dipenda dalla prima, la quale contiene per ogni pazienete la serie delle temperatura lette sullo stesso paziente.

per accedere alla seconda lista intendo seguire qualcosa tipo:
pntA->pntB->campo

Vorrei chiarimenti su come definere le strutture. grazie

Il mio sviluppato per il momento:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define L_nome 20+1
#define db 1
// Gestione acquisizione dati CAMPI di CC.DAT [Giorno rilevazione] [Temp paziente] [Nome]
// Lista secondaria contenente le "misurazioni sui pazienti" sui pazienti.
struct newT{
int day;
float temperature;
struct newT *nextT;
};
// Lista principale contenente la lista pazienti.
struct newP{
int **T;
char paziente[L_nome];
struct newP *nextP;
};

//*****************MAIN FUNCTIONS*****************
struct newP* scanDATA(struct newP *, FILE*);
struct newP* buildP();
struct newT* buildT();
struct newP* Move(struct newP *, char *);
struct newP* Wiev_list(struct newP *);
//*************AND OF MAIN FUNCTIONS**************

int main (){

//**********************VAR**********************
FILE *fin1;

struct newP *ptopP;

ptopP=NULL;
//*******************END OF VAR******************

if((fin1=fopen("cc.dat","r"))==NULL){
fprintf(stderr,"\nERROR!: I can't open your file ");
exit(EXIT_FAILURE);
}
ptopP=scanDATA(ptopP,fin1);


return 0;
}


//**************Details of Funcitions****************
struct newP* scanDATA(struct newP *ptopP, FILE* dati){
//**debug
if(db==1)
printf("\n-----------FUNZIONE scanDATA-----------\n");

int Day;
float Temp;
char Nome[L_nome];
while (fscanf(dati,"%d %f %s",&Day,&Temp,Nome)!=EOF){
//**debug
if(db==1)
printf("%d %f %s \n",Day,Temp,Nome);

ptopP=Move(ptopP,Nome);


}
if(db==1)
Wiev_list(ptopP);
//**debug
if(db==1)
printf("\n-----------END OF scanDATA-------------");
return (ptopP);
}

struct newP* buildP(){
struct newP *newPTR;
newPTR=(struct newP*)malloc(sizeof (struct newP));
if(newPTR==NULL){
fprintf(stderr,"Memory denied");
exit(EXIT_FAILURE);
}
return(newPTR);
}

struct newT* buildT(){
struct newT *newPTR;
newPTR=(struct newT*)malloc(sizeof (struct newT));
if(newPTR==NULL){
fprintf(stderr,"Memory denied");
exit(EXIT_FAILURE);
}
return(newPTR);
}

struct newP* Move(struct newP *ptopP, char *PAZIENTE){
int add=1;
struct newP *ptmpSERCH;
struct newP *ptmp;
ptmpSERCH=ptopP;
//CHECK!
while(ptmpSERCH!=NULL){
if(strcmp(PAZIENTE,ptmpSERCH->paziente)==0)
add=0;
ptmpSERCH=ptmpSERCH->nextP;
}
//NUOVO paziente
if(add==1){
ptmp=buildP();
strcpy(ptmp->paziente,PAZIENTE);
ptmp->nextP=ptopP;
add=1;
ptopP=ptmp;
}
//Dati per paziente?

return (ptopP);
}

struct newP* Wiev_list(struct newP *punt){
printf("\nLista pazienti della lista:");
while(punt!=NULL){
printf("\n%s",punt->paziente);
punt=punt->nextP;
}
}

simXD
27-05-2010, 16:57
In sintesi, non ho capito bene :D , vorresti una struttura che ti contenga nome e temperatura x ogni paziente?

ciusss89
27-05-2010, 17:17
In sintesi, non ho capito bene :D , vorresti una struttura che ti contenga nome e temperatura x ogni paziente?

NO una lista che contiene solo i nomi e il puntatore ad una seconda lista che contine 2 campi.

Non si conosce a priori la dimensione ne della prima che della seconda...mi sono spiegato?

ciusss89
27-05-2010, 20:12
UP ragazzi???

Almeno consigliatemi...se dovreste gestire due campi, di cui non è possibile conoscere a priori le dimensioni di tali strutture cosa usereste? ricordati che una deve fare capo a quella principale.

simXD
27-05-2010, 20:39
beh... forse io una piccola idea ce l'avrei... non ho capio bene cosa vuoi fare con le struct ma non è importante, proviamo così:
hai un numero indefinito di pazienti da inserire in un vettore quindi... potresti dichiarare un vettore di grandezza ad esempio 100 e in seguito potresti eseguire un controllo ogni volta che viene inserito un paziene, per esempio, tu dichiari il tuo vettore a 100, lo carichi con il primo paziente, alla fine con un do-while potresti chiedere se ci sono altri pazienti e continuare ad eseguirlo fino a quando la risposta non sarà un no, a quel punto esce dal ciclo e finisce il programma... ora spero di non aver scritto qualcosa di errato il mio è solo un consiglio, che A MIO PARERE dovrebbe funzionare :D

ciusss89
27-05-2010, 22:19
Cerco di spiegarmi meglio:

Gli esercizi che ci propongono a questo livello, da come si prentano i file di imput ci rendiamo conto se usare strutture statiche o dinamiche.

I dati sono i seguenti:
DATA TEMP NOME

Si ha un numero indefinito di nomi, potrebbero esserci piu temp per lo stesso nome...

Quindi come procedo?...acquisisco i dati in modo da fare una liista PRIMARIA i cui campi sono soltanto i NOMI senza doppioni, e vorrei che il secondo campo fosse il puntatore ad una seconda struttura o sottostruttora figlia della prima contente la data e la temp.

Non posso utilizzare metedodi che prevedono di stabilire a priori le dimensioni.

simXD
28-05-2010, 09:30
ah ho capito ora scusami ma non penso davvero di avere le conoscenze necessarie x aiutarti :D errore mio :D

ciusss89
28-05-2010, 09:31
ah ho capito ora scusami ma non penso davvero di avere le conoscenze necessarie x aiutarti :D errore mio :D
GRazie lo stesso..

RAGA NESSUNO??