334 lines
No EOL
6.5 KiB
C
334 lines
No EOL
6.5 KiB
C
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "conf.h"
|
|
|
|
int findConfId(ptConf confChain)
|
|
{
|
|
ptConf px = confChain;
|
|
int max = 0;
|
|
|
|
while (px->next != NULL)
|
|
{
|
|
if (px->id > max)
|
|
{
|
|
max = px->id;
|
|
}
|
|
|
|
px = px->next;
|
|
}
|
|
|
|
return max + 1;
|
|
}
|
|
|
|
ptConf newConfChain()
|
|
{
|
|
ptConf confChain = (ptConf)malloc(sizeof(tConf));
|
|
|
|
confChain->next = (ptConf)malloc(sizeof(tConf));
|
|
confChain->next->next = NULL;
|
|
confChain->id = -1;
|
|
|
|
return confChain;
|
|
}
|
|
|
|
void addConf(ptConf confChain, int id, char title[], char speaker[], int day, int month, int year)
|
|
{
|
|
ptConf px = confChain;
|
|
|
|
while (px->next != NULL)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
px->id = id;
|
|
px->day = day;
|
|
px->month = month;
|
|
px->year = year;
|
|
strcpy(px->title, title);
|
|
strcpy(px->speaker, speaker);
|
|
px->listeners = (ptListenerList)malloc(sizeof(tListenerList));
|
|
px->listeners->next = (ptListenerList)malloc(sizeof(tListenerList));
|
|
px->listeners->listener = NULL;
|
|
px->listeners->next->next = NULL;
|
|
px->next = (ptConf)malloc(sizeof(tConf));
|
|
px->next->next = NULL;
|
|
}
|
|
|
|
void removeConf(ptConf confChain, int id)
|
|
{
|
|
ptConf px = confChain;
|
|
|
|
while (px->next != NULL && px->next->id != id)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
if (px->next != NULL && px->next->id == id)
|
|
{
|
|
ptListenerList py = px->next->listeners->next;
|
|
|
|
while (py->next != NULL)
|
|
{
|
|
removeConfFromConfList(py->listener->confs, px->next);
|
|
py = py->next;
|
|
}
|
|
|
|
ptConf tmp = px->next->next;
|
|
free(px->next);
|
|
px->next = tmp;
|
|
}
|
|
}
|
|
|
|
int findListenerId(ptListener listenerChain)
|
|
{
|
|
ptListener px = listenerChain;
|
|
int max = 0;
|
|
|
|
while (px->next != NULL)
|
|
{
|
|
if (px->id > max)
|
|
{
|
|
max = px->id;
|
|
}
|
|
|
|
px = px->next;
|
|
}
|
|
|
|
return max + 1;
|
|
}
|
|
|
|
ptListener newListenerChain()
|
|
{
|
|
ptListener listenerChain = (ptListener)malloc(sizeof(tListener));
|
|
|
|
listenerChain->prev = NULL;
|
|
listenerChain->next = (ptListener)malloc(sizeof(tListener));
|
|
listenerChain->next->prev = listenerChain;
|
|
listenerChain->next->next = NULL;
|
|
listenerChain->id = -1;
|
|
|
|
return listenerChain;
|
|
}
|
|
|
|
int addListener(ptListener listenerChain, int id, char name[], int age, int level)
|
|
{
|
|
if (level < 0 || level > 5)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
ptListener px = listenerChain;
|
|
|
|
while (px->next != NULL)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
px->id = id;
|
|
strcpy(px->name, name);
|
|
px->age = age;
|
|
px->level = level;
|
|
px->confs = (ptConfList)malloc(sizeof(tConfList));
|
|
px->confs->next = (ptConfList)malloc(sizeof(tConfList));
|
|
px->confs->conf = NULL;
|
|
px->confs->next->next = NULL;
|
|
px->next = (ptListener)malloc(sizeof(tListener));
|
|
px->next->next = NULL;
|
|
px->next->prev = px;
|
|
return 0;
|
|
}
|
|
|
|
void removeListener(ptListener listenerChain, int id)
|
|
{
|
|
ptListener px = listenerChain;
|
|
|
|
while (px->next != NULL && px->next->id != id)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
if (px->next != NULL && px->next->id == id)
|
|
{
|
|
ptConfList py = px->next->confs->next;
|
|
|
|
while (py->next != NULL)
|
|
{
|
|
removeListenerFromListenerList(py->conf->listeners, px->next);
|
|
py = py->next;
|
|
}
|
|
|
|
ptListener tmp = px->next->next;
|
|
free(px->next);
|
|
px->next = tmp;
|
|
px->next->prev = px;
|
|
}
|
|
}
|
|
|
|
void addConfToConfList(ptConfList confList, ptConf conf, int grade)
|
|
{
|
|
ptConfList px = confList;
|
|
|
|
while (px->next != NULL)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
px->conf = conf;
|
|
px->next = (ptConfList)malloc(sizeof(tConfList));
|
|
px->grade = grade;
|
|
px->next->next = NULL;
|
|
}
|
|
|
|
void removeConfFromConfList(ptConfList confList, ptConf conf)
|
|
{
|
|
ptConfList px = confList;
|
|
|
|
while (px->next != NULL && px->next->conf != conf)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
if (px->next != NULL && px->next->conf == conf)
|
|
{
|
|
ptConfList tmp = px->next->next;
|
|
free(px->next);
|
|
px->next = tmp;
|
|
}
|
|
}
|
|
|
|
void printConfList(ptConfList confList)
|
|
{
|
|
ptConfList px = confList;
|
|
|
|
printf("Participation aux conferences : ");
|
|
while (px->next != NULL)
|
|
{
|
|
printf("%s(%d) ", px->conf->title, px->grade);
|
|
px = px->next;
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
void addListenerToListenerList(ptListenerList listenerList, ptListener listener, int grade)
|
|
{
|
|
ptListenerList px = listenerList;
|
|
|
|
while (px->next != NULL)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
px->listener = listener;
|
|
px->next = (ptListenerList)malloc(sizeof(tListenerList));
|
|
px->grade = grade;
|
|
px->next->next = NULL;
|
|
}
|
|
|
|
void removeListenerFromListenerList(ptListenerList listenerList, ptListener listener)
|
|
{
|
|
ptListenerList px = listenerList;
|
|
|
|
while (px->next != NULL && px->next->listener != listener)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
if (px->next != NULL && px->next->listener == listener)
|
|
{
|
|
ptListenerList tmp = px->next->next;
|
|
free(px->next);
|
|
px->next = tmp;
|
|
}
|
|
}
|
|
|
|
void printListenerList(ptListenerList listenerList)
|
|
{
|
|
ptListenerList px = listenerList;
|
|
|
|
printf("Participants : ");
|
|
while (px->next != NULL)
|
|
{
|
|
printf("%s(%d) ", px->listener->name, px->grade);
|
|
px = px->next;
|
|
}
|
|
printf("\n");
|
|
}
|
|
|
|
int participateToConf(ptConf confChain, ptListener listenerChain, int confId, int listenerId, int grade)
|
|
{
|
|
if (grade < 0 || grade > 5)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
ptConf px = confChain;
|
|
ptListener py = listenerChain;
|
|
ptListenerList pz;
|
|
|
|
while (px->next != NULL && px->id != confId)
|
|
{
|
|
px = px->next;
|
|
}
|
|
|
|
pz = px->listeners->next;
|
|
while (pz->next != NULL)
|
|
{
|
|
if (pz->listener->id == listenerId)
|
|
{
|
|
return -2;
|
|
}
|
|
pz = pz->next;
|
|
}
|
|
|
|
while (py->next != NULL && py->id != listenerId)
|
|
{
|
|
py = py->next;
|
|
}
|
|
|
|
if (px->id != confId || py->id != listenerId)
|
|
{
|
|
return -2;
|
|
}
|
|
|
|
addListenerToListenerList(px->listeners, py, grade);
|
|
addConfToConfList(py->confs, px, grade);
|
|
|
|
return 0;
|
|
}
|
|
|
|
int confGradeAvg(ptConf conf)
|
|
{
|
|
ptListenerList px = conf->listeners->next;
|
|
int total = 0, nb = 0;
|
|
|
|
while (px->next != NULL)
|
|
{
|
|
total += px->grade;
|
|
nb++;
|
|
px = px->next;
|
|
}
|
|
|
|
if (nb != 0)
|
|
{
|
|
return total / nb;
|
|
}
|
|
else
|
|
{
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
int confParticipations(ptConf conf)
|
|
{
|
|
ptListenerList px = conf->listeners->next;
|
|
int nb = 0;
|
|
|
|
while (px->next != NULL)
|
|
{
|
|
nb++;
|
|
px = px->next;
|
|
}
|
|
|
|
return nb;
|
|
} |