Khyna | Voici la fonction chargeAgenda, ne chambrer pas trop... je débute en C..
Code :
- struct jour* chargeAgenda(char unFichier[100]) {
-
- struct jour *j;
- int i = 2;// incrment pour les lignes.
- struct rdv unRdv;//le rdv avec lequel on va commencer la liste.
- double diff;//diffrence en seconde entre deux dates.Sert a tudier la chronologie.
- struct jour *p;//pointeur qui nous permet de parcourir la liste.
- struct jour *precedentP;//precedent du pointeur qui parcoure la liste.
- time_t tTest;
- j = malloc(sizeof(struct jour));
- j->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
- j->jourSuivant = malloc(sizeof(struct jour));
- p = malloc(sizeof(struct jour));
- precedentP = malloc(sizeof(struct jour));
- p->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
- precedentP->unRdvAgenda = malloc(sizeof(struct rdvAgenda ));
- p->jourSuivant = malloc(sizeof(struct jour));
- precedentP->jourSuivant = malloc(sizeof(struct jour));
- initializeFile(unFichier);// initialisation du fichier.
- readRDV(&unRdv,1);// lit le premier rdv la ligne 1.
- j->dateDuJour = unRdv.dateDebut;
- j->jourSuivant = NULL;
- j->unRdvAgenda->leRdv.dateDebut = unRdv.dateDebut;
- j->unRdvAgenda->leRdv.dateFin = unRdv.dateFin;
- strcpy(j->unRdvAgenda->leRdv.libelle, unRdv.libelle);
- j->unRdvAgenda->leRdvAgendaSuivant = NULL;
- while ( !eof() ) {
- struct rdv rdvTmp;
-
- readRDV(&rdvTmp,i);
- p = j;
- precedentP = NULL;
-
-
- if ( rdvTmp.dateDebut.tm_mday == j->dateDuJour.tm_mday && rdvTmp.dateDebut.tm_mon == j->dateDuJour.tm_mon && rdvTmp.dateDebut.tm_year == j->dateDuJour.tm_year) {//la date du rdvTmp est la meme que le premier rdv de la liste.
- struct rdvAgenda *newRdvAgenda;
- struct rdvAgenda *pRdvAgenda;
- struct rdvAgenda *precPRdvAgenda;
- time_t tPRddvAgenda;
- time_t tNewRdvAgenda;
- double diffRdv;
- newRdvAgenda = malloc(sizeof(struct rdvAgenda));
- newRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
- pRdvAgenda = malloc(sizeof(struct rdvAgenda));
- pRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
- precPRdvAgenda = malloc(sizeof(struct rdvAgenda));
- precPRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
- newRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
- newRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
- strcpy(newRdvAgenda->leRdv.libelle, rdvTmp.libelle);
- pRdvAgenda = p->unRdvAgenda;
- precPRdvAgenda = NULL;
- tPRddvAgenda = mktime(&(pRdvAgenda->leRdv.dateDebut));
- tNewRdvAgenda = mktime(&(newRdvAgenda->leRdv.dateDebut));
-
- diffRdv = difftime(tNewRdvAgenda,tPRddvAgenda);
- while ( diffRdv >= 0 && pRdvAgenda->leRdvAgendaSuivant != NULL ) {
- precPRdvAgenda = pRdvAgenda;
- pRdvAgenda = pRdvAgenda->leRdvAgendaSuivant;
- tPRddvAgenda = mktime(&(pRdvAgenda->leRdv.dateDebut));
- diffRdv = difftime(tNewRdvAgenda,tPRddvAgenda);
- }
-
- if ( diffRdv < 0 && precPRdvAgenda == NULL) {//il y a qu'un seul rdvAgenda et il doit se placer apres le rdvTmp.
- p->unRdvAgenda = newRdvAgenda;
- newRdvAgenda->leRdvAgendaSuivant = pRdvAgenda;
- } else {
- if (pRdvAgenda->leRdvAgendaSuivant == NULL) {
-
- pRdvAgenda->leRdvAgendaSuivant = newRdvAgenda;
-
- } else {
-
- precPRdvAgenda->leRdvAgendaSuivant = newRdvAgenda;
- newRdvAgenda->leRdvAgendaSuivant = pRdvAgenda;
-
- }
- }
-
- //free(precPRdvAgenda->leRdvAgendaSuivant);
- //free(pRdvAgenda->leRdvAgendaSuivant);
- //free(pRdvAgenda);
- //free(precPRdvAgenda);
- printf("cas spcial au tour : %d\n",i);
- } else {// sinon la date du rdvTmp est avant ou apres la tete de la liste.
-
- time_t tRdvTmp;
- time_t tDateDuJour;
- tRdvTmp = mktime(&(rdvTmp.dateDebut));
- tDateDuJour = mktime(&(p->dateDuJour));
-
- diff = difftime(tRdvTmp,tDateDuJour);
- if ( diff < 0 ) {//le rdvTmp se situe avant le premier jour (tete de la liste) rpertori.
- //on cr un nouveau jour, qui sera notre nouvelle tete de liste.
- struct jour *newJ;
- newJ = malloc(sizeof(struct jour));// allocation de mmoire pour le pointeur sur ma liste.
- newJ->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
- newJ->jourSuivant = malloc(sizeof(struct jour));
- newJ->dateDuJour = rdvTmp.dateDebut;
- newJ->jourSuivant = j;
- newJ->unRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
- newJ->unRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
- strcpy(newJ->unRdvAgenda->leRdv.libelle, rdvTmp.libelle);
- newJ->unRdvAgenda->leRdvAgendaSuivant = NULL;
- j = newJ;
- } else {//le rdvTmp se situe apres le premier jour (tete de la listerpertori).
- while ( diff >= 0 && ( p->dateDuJour.tm_mday != rdvTmp.dateDebut.tm_mday || p->dateDuJour.tm_mon != rdvTmp.dateDebut.tm_mon || p->dateDuJour.tm_year != rdvTmp.dateDebut.tm_year ) && p->jourSuivant != NULL ) {
- //on se place sur le jour le plus appropri.
- precedentP = p;
- p = p->jourSuivant;
- tDateDuJour = mktime(&(p->dateDuJour));
- diff = difftime(tRdvTmp,tDateDuJour);
- }
- if ( p->dateDuJour.tm_mday == rdvTmp.dateDebut.tm_mday && p->dateDuJour.tm_mon == rdvTmp.dateDebut.tm_mon && p->dateDuJour.tm_year == rdvTmp.dateDebut.tm_year ) {//il y a un jour deja rpertori pour ce le jour du rdvTmp.
- struct rdvAgenda *newRdvAgenda;
- struct rdvAgenda *pRdvAgenda;
- struct rdvAgenda *precPRdvAgenda;
- time_t tPRddvAgenda;
- time_t tNewRdvAgenda;
- double diffRdv;
- newRdvAgenda = malloc(sizeof(struct rdvAgenda));
- newRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
- pRdvAgenda = malloc(sizeof(struct rdvAgenda));
- pRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
- precPRdvAgenda = malloc(sizeof(struct rdvAgenda));
- precPRdvAgenda->leRdvAgendaSuivant = malloc(sizeof(struct rdvAgenda));
-
- newRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
- newRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
- strcpy(newRdvAgenda->leRdv.libelle, rdvTmp.libelle);
- pRdvAgenda = p->unRdvAgenda;
- precPRdvAgenda = NULL;
-
- tPRddvAgenda = mktime(&(pRdvAgenda->leRdv.dateDebut));
- tNewRdvAgenda = mktime(&(newRdvAgenda->leRdv.dateDebut));
-
- diffRdv = difftime(tNewRdvAgenda,tPRddvAgenda);
-
- while ( diffRdv >= 0 && pRdvAgenda->leRdvAgendaSuivant != NULL ) {
-
- precPRdvAgenda = pRdvAgenda;
-
- pRdvAgenda = pRdvAgenda->leRdvAgendaSuivant;
-
- tPRddvAgenda = mktime(&(pRdvAgenda->leRdv.dateDebut));
- diffRdv = difftime(tNewRdvAgenda,tPRddvAgenda);
-
- }
- if ( diffRdv < 0 && precPRdvAgenda == NULL) {//il y a qu'un seul rdvAgenda et il doit se placer apres le rdvTmp.
- p->unRdvAgenda = newRdvAgenda;
- newRdvAgenda->leRdvAgendaSuivant = pRdvAgenda;
- } else {
- if (pRdvAgenda->leRdvAgendaSuivant == NULL) {
- pRdvAgenda->leRdvAgendaSuivant = newRdvAgenda;
- } else {
- precPRdvAgenda->leRdvAgendaSuivant = newRdvAgenda;
- newRdvAgenda->leRdvAgendaSuivant = pRdvAgenda;
-
- }
- }
- //free(precPRdvAgenda->leRdvAgendaSuivant);
- //free(pRdvAgenda->leRdvAgendaSuivant);
- //free(pRdvAgenda);
- //free(precPRdvAgenda);
-
- printf("cas spcial au tour : %d\n",i);
-
- } else {
-
- if ( p->jourSuivant == NULL && diff > 0) {//le rdvTmp tombe sur un jour qui n'est pas rpertori et qui est apres tous les autres rdv de la liste.
- //on cr un nouveau jour, qui sera la fin de la liste.
-
- struct jour *newJ;
-
-
- newJ = malloc(sizeof(struct jour));// allocation de mmoire pour le pointeur sur ma liste.
- newJ->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
- newJ->jourSuivant = malloc(sizeof(struct jour));
-
-
- newJ->dateDuJour = rdvTmp.dateDebut;
- newJ->jourSuivant = NULL;
- newJ->unRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
- newJ->unRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
- strcpy(newJ->unRdvAgenda->leRdv.libelle, rdvTmp.libelle);
- newJ->unRdvAgenda->leRdvAgendaSuivant = NULL;
-
- p->jourSuivant = newJ;
-
- p = newJ;
-
- } else {// cas ou il existe forcment des rdv dans liste qui sont avant et apres.
-
- //on cr un nouveau jour, qui sera au milieu de la liste.
- struct jour *newJ;
-
- newJ = malloc(sizeof(struct jour));// allocation de mmoire pour le pointeur sur ma liste.
- newJ->unRdvAgenda = malloc(sizeof(struct rdvAgenda));
- newJ->jourSuivant = malloc(sizeof(struct jour));
- precedentP->jourSuivant = newJ;
- newJ->dateDuJour = rdvTmp.dateDebut;
- newJ->jourSuivant = p;
- newJ->unRdvAgenda->leRdv.dateDebut = rdvTmp.dateDebut;
- newJ->unRdvAgenda->leRdv.dateFin = rdvTmp.dateFin;
- strcpy(newJ->unRdvAgenda->leRdv.libelle, rdvTmp.libelle);
- newJ->unRdvAgenda->leRdvAgendaSuivant = NULL;
-
- p = newJ;
- }
-
- }
- }
- }
- if ( !eof() ) {
- readRDV(&rdvTmp,i);//pour pas avoir d'occurence la fin.
- }
- i++;
- }
- //afficher(j);
-
- closeFile();
-
- free(precedentP->jourSuivant);
- free(p->jourSuivant);
- free(precedentP->unRdvAgenda);
- free(p->unRdvAgenda);
- free(precedentP);
- free(p);
- return j;
-
- }
|
|