From ed6dc05d70d0a4c93dd792e7c919d9299292194b Mon Sep 17 00:00:00 2001
From: Syauqi_AlifIhsan <syauqi.alif-ihsan9@etu.univ-lorraine.fr>
Date: Tue, 8 Apr 2025 00:10:19 +0200
Subject: [PATCH] =?UTF-8?q?fichier=20rang=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 include/db.h       |  22 +++++
 include/job.h      |  48 ++++++++++
 include/list.h     |  33 +++++++
 include/list_elm.h |  24 +++++
 include/outils.h   |   9 ++
 include/rank.h     |  10 ++
 makefile           |  38 ++++++++
 obj/db.o           | Bin 0 -> 10856 bytes
 obj/io.o           | Bin 0 -> 13864 bytes
 readme.md          |   0
 src/db.c           |  74 +++++++++++++++
 src/io.c           | 141 ++++++++++++++++++++++++++++
 src/job.c          |  55 +++++++++++
 src/job_2.c        | 111 ++++++++++++++++++++++
 src/job_3.c        |  55 +++++++++++
 src/list.c         | 103 +++++++++++++++++++++
 src/list_1 (1).c   |  74 +++++++++++++++
 src/list_2.c       | 226 +++++++++++++++++++++++++++++++++++++++++++++
 src/list_elm.c     |  52 +++++++++++
 src/main (1).c     |  32 +++++++
 src/outils.c       |  13 +++
 src/rank.c         |  19 ++++
 22 files changed, 1139 insertions(+)
 create mode 100644 include/db.h
 create mode 100644 include/job.h
 create mode 100644 include/list.h
 create mode 100644 include/list_elm.h
 create mode 100644 include/outils.h
 create mode 100644 include/rank.h
 create mode 100644 makefile
 create mode 100644 obj/db.o
 create mode 100644 obj/io.o
 create mode 100644 readme.md
 create mode 100644 src/db.c
 create mode 100644 src/io.c
 create mode 100644 src/job.c
 create mode 100644 src/job_2.c
 create mode 100644 src/job_3.c
 create mode 100644 src/list.c
 create mode 100644 src/list_1 (1).c
 create mode 100644 src/list_2.c
 create mode 100644 src/list_elm.c
 create mode 100644 src/main (1).c
 create mode 100644 src/outils.c
 create mode 100644 src/rank.c

diff --git a/include/db.h b/include/db.h
new file mode 100644
index 0000000..c4a0157
--- /dev/null
+++ b/include/db.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include "list.h"
+
+/* file mode : text or binary */
+typedef enum file_mode { TEXT, BINARY } file_mode_t;
+
+/** 
+ * @brief read a list from a text or binary file acording to the mode 
+ * @param mode : TEXT or BIN
+ * @param data_read_fct : ptr to fct that reads datum from file fd ; fct's parameters : (fd, mode)
+ * @param del_fct : ptr to fct that deallocate datum's memory, ; fct's parameter (datum)
+ */
+list_t * read_list ( file_mode_t mode, void * (*read_fct) (), void (*del_fct) () );
+
+
+/** 
+ * @brief write a list into a text or binary file acording to the mode
+ * @param mode : TEXT or BIN
+ * @param data_write_fct : ptr to fct that writes datum into file fd ; fct's parameters : (datum, fd, mode)
+ */
+void write_list ( list_t * L, file_mode_t mode, void (*write_fct) () );
\ No newline at end of file
diff --git a/include/job.h b/include/job.h
new file mode 100644
index 0000000..a3bbc2b
--- /dev/null
+++ b/include/job.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include "list.h"
+#include <stdbool.h>
+
+#define UNDEF -2
+
+/** Des redondances possibles avec d'autres TAs ! */
+typedef struct {
+  char * title;                 // Nom de la tâche
+  double life;                  // Durée de la tâche
+  int input_degree;             // Son degré de dépendance
+  int output_degree;            // Les tâches qui en dépendent
+  int rank;                     // Rang de la tâche
+  int dyn_input_degree;         // Facilité de prog
+  list_t * precedence;   // Les tâches précédentes
+  list_t * posteriority; // Les tâches ultérieures
+  double au_plus_tot;           // Date au plus tôt
+  double au_plus_tard;          // Date au plus tard
+  double marge_totale;          // Marge totale
+  double marge_libre;           // Marge libre
+  bool critique;                // Une tâche critique ?
+} job_t;
+
+job_t * new_empty_job();
+job_t * new_job(char * title);
+void free_job(job_t ** ptrJ);
+void view_job ( job_t * J );
+char * get_job_title(job_t * J);
+void set_job_title(job_t * J, char * title);
+double get_job_life(job_t * J);
+void set_job_life(job_t * J, double life);
+int get_job_iDegree(job_t * J);
+void set_job_iDegree(job_t * J, int iDegree);
+void incr_job_iDegree(job_t * J);
+void decr_job_iDegree(job_t * J);
+
+int get_job_oDegree(job_t * J);
+void set_job_oDegree(job_t * J, int oDegree);
+void incr_job_oDegree(job_t * J);
+void decr_job_oDegree(job_t * J);
+int get_job_rank(job_t * J);
+void set_rank(job_t * J, int rank);
+int titleJobCmp(job_t * J1, job_t * J2);
+int iDegreeJobCmp(job_t * J1, job_t * J2);
+int oDegreeJobCmp(job_t * J1, job_t * J2);
+int rangJobCmp(job_t * J1, job_t * J2);
+
diff --git a/include/list.h b/include/list.h
new file mode 100644
index 0000000..f843d10
--- /dev/null
+++ b/include/list.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include <stdbool.h>
+#include "list_elm.h"
+
+typedef struct list {
+	list_elm_t * head;
+	list_elm_t* tail;
+	int numelm;
+} list_t;
+
+list_t * new_list();
+void del_list ( list_t * * L, void (*ptrf) () );
+bool empty_list ( list_t * L );
+
+list_elm_t * get_head ( list_t * L );
+list_elm_t * get_tail ( list_t * L );
+void view_list ( list_t * L, void (*ptrf)() );
+
+void cons ( list_t * L, void * data );
+void queue ( list_t * L, void * data );
+void ordered_insert ( list_t * L, void * data, int (*cmpFct)() );
+
+int get_numelm(list_t * L);
+
+// void take_out(struct list_t * L, void * D);
+void quick_sort(list_t * L, int (*cmpFct)()); 
+void find(list_t * L, void ** ptrKey, int (*cmpFct)(), void (*delFct)());
+void del_list(list_t ** ptrL, void (*ptrf) ());
+void clean(list_t * L);
+bool is_empty(list_t * L);
+
+	
diff --git a/include/list_elm.h b/include/list_elm.h
new file mode 100644
index 0000000..621dd32
--- /dev/null
+++ b/include/list_elm.h
@@ -0,0 +1,24 @@
+#pragma once
+
+typedef struct list_elm {
+  void * data;
+  struct list_elm * suc, * pred;
+} list_elm_t;
+
+list_elm_t * new_list_elm ( void * data );
+/**
+ * @brief delete the list element E and optionnaly its datum
+ * @param ptrf : a ptr to fct that deallocates datum's memory ;
+ *               if ptrf is NULL, datum is not freed
+ */
+void del_list_elm( list_elm_t * * E, void (*ptrf)() );
+
+list_elm_t * get_suc ( list_elm_t * E );
+list_elm_t * get_pred ( list_elm_t * E );
+void * get_data ( list_elm_t * E );
+
+void set_suc ( list_elm_t * E, list_elm_t * S );
+void set_pred ( list_elm_t * E, list_elm_t * P );
+void set_data ( list_elm_t * E, void * data );
+
+void view_list_elm ( list_elm_t * E, void (*ptrf)() );
diff --git a/include/outils.h b/include/outils.h
new file mode 100644
index 0000000..79f54e3
--- /dev/null
+++ b/include/outils.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#define EPSILON 0.00000001// ε = 10^{-8}
+
+/** Integer comparaison */
+int int_cmp (  int * a, int * b );
+
+/** Double comparaison */
+int double_cmp ( double * a, double * b );
\ No newline at end of file
diff --git a/include/rank.h b/include/rank.h
new file mode 100644
index 0000000..9ba383b
--- /dev/null
+++ b/include/rank.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include "list.h"
+
+
+void ranking(list_t * G);
+void prune(list_t * G);
+
+void marges(list_t * G);
+
diff --git a/makefile b/makefile
new file mode 100644
index 0000000..8d48e77
--- /dev/null
+++ b/makefile
@@ -0,0 +1,38 @@
+BDIR = bin
+IDIR = include
+ODIR = obj
+SDIR = src
+
+CC = gcc
+# Le déboggage en toutes circonstances grâce à :: -D _DEBUG_
+# que l'on peutarêter à tout moment grâce à :: -U _DEBUG_
+CFLAGS = -Wall -I$(IDIR) -g -c
+LFLAGS = -lm 
+
+PROG = $(BDIR)/mpm
+
+_DEPS = job.h list.h list_elm.h outils.h #rank.h
+DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))
+
+_OBJS = db.o io.o job.o list.o list_elm.o main.o outils.o #rank.o 
+OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS))
+
+.PHONY : run all dirs clean delete
+
+run : all
+	./$(PROG)
+
+all : dirs $(OBJS)
+	$(CC) -o $(PROG) $(OBJS) $(LFLAGS)
+
+dirs :
+	mkdir -p $(ODIR) $(BDIR)
+
+$(ODIR)/%.o : $(SDIR)/%.c $(DEPS)
+	$(CC) $(CFLAGS) -o $@ $<
+
+clean :
+	rm -rf $(ODIR)
+
+delete : clean
+	rm -rf $(BDIR)
\ No newline at end of file
diff --git a/obj/db.o b/obj/db.o
new file mode 100644
index 0000000000000000000000000000000000000000..02a8690f0be0218bc1f329379cdd0383219ac9fd
GIT binary patch
literal 10856
zcmb<-^>JfjWMqH=Mg}_u1P><4z_3CE!FB*M9T>zJ#27yF%l!)V=zQwY{HCC@c8y18
z=>m_=&>1Nn-7Kma3=9k&ovuF&59|QxcmX0jI$cjR*REkG_4epxg$Nu+lI?YU;L&*u
zr&O;fM9Vdg&f_rS4!n-Tsh(t`ggv@LFL-pjp77{|+tD4m#-rQyfJe9Q0<a+1x&JSE
zbh=*fXs*4$P<k4o0q&w59^I}xJX#Nwl!F=F3^3QW94JWv3n5&8!=t(O21ALwN4M*Z
zeGtz<%>g;0JM@M}X8^}*X|N5)9XP-$z%l_GV6jdCkM7VJ9=)zRkX#IQF3b+F>d+r4
z9@-+{7%5=|huq1-NKqHy(OG+<v-F5ZXXp;JsB5l0LdD3s@Y<7Fkp+z=XlQl1-gvDI
z3Pg`?22dP!`yTP>cHPl=&Z85Oz8wF9G~Dp$cHr>nbcF<a={b*X*9)-Nnc&gw3JNAj
z!i5JDD99NYI5~q-6H^p&GK)(T(u(qP6-rVoN)*yEb5a#F^hzp9G`TpzoV>)`R0S&r
z)nbOC5|B;|eMy;liA9w#ok^K_XgZ6MK-w5MIm3%GOHv^gmgEz#t{iL^NF%yFLe`Zh
zF&txMU|?ln1g9-wkQuTd0vSJILh!(umg$<f6$1kU3kN$$f`tW4iEyw$3}Imc^H~_#
zz_LtWEut)}nRz7)EF54Sm|&hEnacpOn}LCWd8Rao%{&ogEJULih|L8u;s%Q$hYAw|
zq+nt(W={hNf=ekDGtM3c1_llY#~jQNfN(6p90>@=63kJ6aIC-_4G6~?%rSs)Y``1~
z2*(!8ae#0fz#I<<#}Uj4fN-3^oCpZVMa-6ofgu6HaT9T3VqnOCa6G`SE`V@6!JHBZ
z$BP>jdle9luTUTZ149FZ<HsMtz`)Q1;rMg7GchnULpXu_;Y<t+9S}|=Zvz7Z!vqK?
zT0D`7fnf%O6C;_;#K5os!ifbtX9a{4$LYbqz_0<riRaQ|U|`q*;Us|Fb^yXj;wWHZ
zU^v16jxSbr$+-*+4C0{BXVK>42GPtGObiUnAYndGbb(yO4@w#g49o^h3=9x8F>qEI
z69WTSVFMEb16ZLj1M>_91_lX`05d3(p(zBKw!rZ(!Nx3b2^RlsEL<R`Ge{PfCNr?H
zih?8{@z2I81L6oUFwbRzCMz~JFdJeDJDY$6Gc*;kv-5-4kR-*<!3W|%Okw9_1Entk
z2IlK9Q`otfA2Ts9NP#@e&f*A4aBO@Y%nS?yAQ1@32niz&Hcd@t1_p2jU>5)zo5jq)
zzyu-~m}Oy7oI7|xmb8MTx<I*$2V@c(-)xWom{`CJ$`v4IF)w9iV31zJ%)r3G08u7#
z2&4=o#{?oEwy_C<ZMy-Jf{3#7vAttvU;tr=8(0`Y)<Gp9TDVzY4g?#|E~*F<U;>A<
zAjoYTjC>%6+JK~5nHU(DKm>yfNQ(0kBUmHIM-d=-P+W2_fVE{af<2m#5C)en>^xkc
z5NTuqc}fms2%{yqv;Z;H!D)|yfpHEyD+7bP4+Ep6G)Oh`#2xjVAO)6MpulIIxCP2J
z2L%@M#1-{yX(<d=oFI2HO?2P|DYa$?C19qB0YV@i2)lp?1_lPU)SO%f7g10EGEMYg
zU{C;wGjf341!98mZn#T!vNAA$?dDK~*gXegH;2IyRt5&<i4&k)SBO(Oz)s-=JB4}T
zhI+7DxL|H!^I_oThWQ9AB>~QkOcNd0Tp8rRDHG%!xSLZzjsdwjgh2tEhQTgY1jP=>
zdJYC=koy=Ic^R1bthlYYExA2~Ew~vNm{=J+g&7!_`5CwsIY2BH6$Wl@J8ot^1_o9!
zB*hF2Y$goM99D{q5Y0>y3=HggjP{Z+^VB6hg>57mg&7z)Bp4VNI9WlOkyUdEGcxmW
zb3<$gspA%AVCJ)tWMJSyGDne3T@qppuL-&de2k2q!XTaeiVU8@`rHf*0vZg=d@|e&
z41!Q26gjO~Ex8eH5#nYPWE5g&U=S8$ROJ)qW|o(h2MGv>GcbtoGjMY=Fo;5Z%)!7Q
zrUniTafHVi7$nTWVv@Wd-y?;b6bmCWpB*<hx2G_|OVXl@Aos~YUBeA>OdcP?IkIpG
za11~^Du*nnE(vm;gG3EDDCJp^Yy}0m0;*b1VPw^cqR{YR&|zR;0Ow)`4rs!FP{{Q(
zL<B;D>M&LY4u&iS1_nk(#@~FrAPSVW8NmYb;Nl9R7L#ORlxN}xm!KdWkP;JYJE(+W
zU;$|W6OcLr#09h1Sc4fj!RkOlk{oHQ{LfigZ?H0_bJ((SaLi|A=2#D5aZF)l)@K#s
z&}CI)U}9n9n8zwy$;uC6?qcQeW@Ytal?QPmScO4U39A5zYGM`fW@Y=#%2LY8!y(Kn
zc7v6F7b{N_D{~n$KZhPG*KSrOZ&r7XNRBjC*5|Cu>8y?*T^u%0tJkqQA@QX-CbKes
zVr9{1wPavoVdl8XssobU#mZE{%D9_JoPm+CpeQr1B#j|HK0hrjzJwv((?7l_H8CZ=
zprnW)J~<;XGmoL5C^dy4HMgLoG9J`UWGK$8N{ugJ0JRI_bMsR`?D*o0{GyVi(loFE
zNu_D=Nr}a&3_1CE=?Y+?G_N=_Jufvy0n}KEPtH$CO)e`zk_QPxRU~I57BPU`0Jbe2
zWKUi`*kG_|YF-LNBS??CU#Nn!p}B&gv7WJ>fr4&sNoiiHZF*{6YEfpgf^KeNQF4ZD
zg@u`}nTdjKx`J+6VsT|&az;^pUVdq@ZfRb5W?qVJNn%n?YO#WDT5(BYa<*<kQGQ8k
za!G!XZgEKw$OkZq<ebFf448Cgex8DET5=i^pCLXiCo#Pk>{L(~fLt1%Tv`;LoS##g
zn+Fz$dA+bSwKSC>K0hY~6!OKXB@8e+C9$M5m!UX0F%J@&xrs&DsYMLwsU`6lsfj5J
zDXBT}X~`uFs6m=ml$u(US{x6G1I!RFPA!QCwJSi;TMlY~gX1?Pu_TcJ6v*+ZIl1vA
z4B$vqKsDFXKfXAzEEN);5Un7~<8$(pv!VVqVgM%thBQzofg!{-B7~tNF*673U5E~F
zKzRCtH9-@Zo2QQ}*efvm8Pf6#Qu7$%A>J(p`xl(@zzRwj;+^vIa}b^erxJ*RLFoYO
zvCNdzc(9*9Ne1Gk_%d+h!on78YkYiWaelI;WjrK|!RCW1O>pW0c@7-RU<*LWn<1|>
z7bFde0I<K(l5_HlQyCy$1L=n39y1fD*TCk0(?7^n;LrmHKzu=BiYY^UX<lh@YKjp<
zUTQfcKY>&wB_?N=7C=Hd9u}7nv&-S$g77{4;~`dqt#I=6a}0`PC@xCYPf5~CX3)>b
z&rQ`&%*jmC_YLqx=N1<wGw7EV7wP9@Ch4aqC+k;On8ll!=;mbRl~(Ac=auRk8tZ4~
zCFhi;q(T%zIhYEQGE0hyP@-Q_S&&-H05t|h0|VH>V4}DrB_%aYFM|QBS}%j4xTL5w
zxg;JGUwRn~PzvOKP*T;)0H<2L43G&RwJDkTdKnB1?#|9u3L2qFrFkW#&=Nt{tQ5>O
zsxvatGceJF3WJMx0ca=9-7l1ZiGkq&sI&){{R|8YBA~(@RIOA6F)&sLFiP{VbAWmx
zpoSp`gQUT&C|5p#HYR6YHs(!?JnS6chNBHgl7WE%+}?xB%Yo&gQWzAd3SwdS_#Z<8
z)LMqrO&C(lkfu2nad?vxMUEM*T7^k6L%K6CE}Uj&0Jq`bd>Dh7fe*%n(;yp#klYCl
z8wN;E0u;`0g;0hhR1V68Q=rx=Hud^A)SKcEx5gn3Y9(Vc-yes1P)8M;`UD*6L7jbU
z>Ooy$Y~rm93=E)fgM}A3&47BnILrs7_++Ho5nhPE>v5E_4N|5;>Kb_Yg;bS;#K46t
ztbzblF0gFI04?a^<H7Y}d~!y1d>W`=hZH{`W#Cd8TwFq95Y&VNF+q6=)VBKb9|CMa
zg3#t2D38I!y`bVC^`K5QOdJ&MASqBo3#48f#9?4yNQKfM^`OofOnm`V9Ht)B@dpW2
zg9y;r3j+f<HN(_*K*eF|O`!a#P#R=DvU?Uo#bN4U?%4np2dPJP&u*wVOg+rq$DraM
z^`P7ZbI*MwaZv7piSvRA2B`b_85kH~;+ja}pmYTjw?q;bL{cA$Bo69+!PHMg5(f>E
z!NlhxiG#{QnD|yCanPVOO#Bs89OmB~sDHjg#X<f>4o_B)LZtKn3r``aI7mHmc*;V>
zK@=!G%z~P)0TO_Q4{~^#Ld8K8Nc|G1deF!fhzT+u**yUug;?AZ3l#^cM|MvJR2)Qs
z%)bIMl!1Yv7$ktjJ<Ukspn)b>xE)6lM-JyZNaD!h4C@$y@)o!|0<{<9cMuaK4(j#n
z2XVk<3xoj@hv@~0h=B+O1_qcocnp96Iu-<~_n=_`RmPwNWq{O!%6cf50aPx7*dTF`
zy~ZF80|Nsrzr)0@K+^%J`~@k2iSL4n`+@|a?g5#z9_s%PG;toNcr==LH<S+<Wrp|*
zWX@iwdRX}Yvv(U*eJPZNiG%cjgc?Bvl6zc1k<7rrFa=Fq5-L6qO}qqZ?`kx0U#Ne<
zlPyT*gYq^==}{1YB)$^LzXYXW?(~P+3oAEZ;v1pjZ_w1ggWCHOO*|UvPBy4K%$xwI
zI$<>N5GWrq<ctVsd8j$MP<fa+%~1DPp^3*r#of`wCqT`C*#k2N*5*n?Q@;@E&O9`6
z&~P<Ksv1qa4$6lNF(cd$8QNxGm<pAL*?S-Ao<(TlZXm-M7#P;0iJL>!??Dsqg7Qy7
zX_)z-b^*w!YiQyNq2cowO?)y``~#Z!aVY;Ul!loP8jS;)&jocCOxzX97l+a?@j|Hi
zs%YZxpnO9p4O5>9<y%5&nD{)XJ7DD}OgslFo{pv-Rt`==6R!n1o`Hd3CYpFGRD2$q
zI1|+UtI@>&K<zz>Caw%M=LVWMWHgz9;R%{JXt)}r<s+K72-MzxXyRc|J~vbz77of#
zz8sW>i7$ex*FqD&3Kh3O6Ay%nJE4gmfbu<|G|YU+90mhJD4O_6X!sPMi5o-tZBQC!
zPA$~lwP@ncpynJ#6Nkm$O*C=PTsk;B(Zp9m&Hsib4ht6^P=$<CPC}-c7#Nh$#6e@`
zAoFd}#32(&3=FPl;-8`RMxu#>%mCp6H1R5^`<l?it)SwaP;pSOfQ*K<^VdPeVc`i&
z2Yb=PbwQdK7#MD%iF-rEpF_oA=2t_-A=8nF@@+cE@eB+M!q7$oOg&VXK?^F5?jB1t
zaacO`Koj2tG7!{0M-zv+vjI(f5>)+cs5poVa=Iai0h$qjIt=6<s29N^ptdfE0a6B1
z4`PF`5{Q7N2T(f)G?)((QUei4;_6U7a(f1(9@hSZ^&3F;g2Z9%4<o2Pn0PsqZw94d
z;tQaBSU!V^uYigpw|_w9Z-t6`LTQ-#T~NLsl!l4J+I7Kb;wPYdSicFT{sL4SR$juy
z??J_p+e;w#JcWv<Lur`$4^Td=T@Mrg4izti(lGHqP(G~xg&tp^em+PEC=Njw#0Fu=
z8XU+p07x8`Ul{a?D|1T{lNj`hONt<L28>mdnv<vpTDQQU2Oj;?ODZmA&@0M^aKN%D
zsY#{j@tJvP`3!mxc4AUeQEC~39+GroQDR<tDo88HK!~!O%)C^Xmg15k7!xEM59TN5
z=jNv7l`!b#<(H)Dx%-9cf;-DletKT1UO`cQL26M+CDg9ejQF&o#9Ua15aekJFen^B
zVT;@*2N?$oNA#%^kXn#D3`;}%Dlqjh@d{9<gMon|0a}iM`X(T~pfmzfgPgxW;!tHE
zDKJ(-7XXVwC#j)q5Cs}90GWxdoLK#aSo$g;b2Xp_-Ue}yFvu<>E`uFZKe8Bz%?vGc
zPC?5jkQfMq{0gFB*b+zh-GBzr3#f&l@B_sWl*<5>W&n+UpqmLY`z*9W_5w{3jmrSa
z*XUv({aZnuTLuOO0}uxZqpJm#7a*^q$NvFEh$fhRko!SSLU%tX-=mue()ko>zYCfq
z8kYf7o?x^81Jr)VN)E_)EXYW7`$6qPkeM)dg6sxiO=ySsI5ZuA#6TFN7MTW(1A)ZQ
z^?!g?G%O%VkOnA*abYxQjR%O0uKx>Y@P&Z^Jf#WM3Z_76K@1oT>c7C)AaNL001eW>
zI7l?Q+Kmj5MH!&75=j{YOh2f6Ko*CEA582dH2tINcYxXtN*^$_AR1l&5gh4%0kmNa
z3l~uO0T~I?4@>_b|Df9qvS$WJF#`jG15^@J9AQg;AThKk25D!w0kRO(ZvgWU1js%F
Wj{&@x1DpN}Q1@R(Rtya*WFY`*tHvDw

literal 0
HcmV?d00001

diff --git a/obj/io.o b/obj/io.o
new file mode 100644
index 0000000000000000000000000000000000000000..10bee52ae486bc83610bea63e627baa252d403ca
GIT binary patch
literal 13864
zcmb<-^>JfjWMqH=Mg}_u1P><4z>r~pU^{@B4h-T9Vho@8<$i^FbUyWHe8V8Xz~Ir$
zqr!l~Zhqt7(Yg1;{r~?{Ji1v_H5eEeJUU%}7#{HGZUu>Y^ooLv^XR<h(Rus@gxUJw
z{{R0wKx~-6i~Ilodo=F_i8GXNc{J|@2{4puc=WP@lzDU>+{Fhn8OA*Zmw=f0l9!2r
z!J~KT2aq}4VDmkCc_CWQd2}8}vaGiitO&zdtq1s9jxmBvfha(@_5#Sz-mPG&yA|Xz
zk8Y@^F2Y$5cX)KSf|d0KaCi`K1`%$3xeDxObobnVxCcxTbWbnXJ>9Jk)eahP2ZMqI
z68zo05J`yByB!p;sG&4yTTTD}|L@T~73vxg)g2_z86X1<vEvRB|G+B1j`+kc0FL)h
z{DKY^P!-5x23W)#pkl`y0vKL1PJjhJG#Wv%d*?6638)c>NR_aV4E>Sfp)CSV$R(`c
z06KXXo(r1a7<hEn-tg!wz2MPYdxN2b-J`ko0%}5a2S*y%{T`j@3Du+9^+vaYK=Thq
z{=ONY)Yk2K1CcRYUwCx8zJT+)LvMI=GJ%DTI|zVNGf4Wl0|$tWl%_jfKcMh_cyzmd
zKuPwk2TD{xc6)S(zVPT2KrlfG)%C`42LVv2@VdsMJM;oXGg8R7e(>mqXaVc|;L#1y
z<<SYIKXeCxWji4hRQ81jobSK^u@<cQ1~R+bL7+E)5#$<(;vZ;^E{%se=m&BE((U@g
zqniP04#?^s5cj>nPz1FR;?5focmC*h5MVrnuoDze;CS``nF~!X6HXomg)u`>2}5yF
zvVLa1UNS>kih`P&f;)qPYB7VKrw@Z_P8x#`NGLhCz%981qCPb-B|g0<u^<D?WhgAo
zOwNuk&M$&ULj)NZ4y<QqU|?ln1V^L<NK_U?AmiUG2p%_xDZ#`nkj%gUDZZIlxIk<M
z$>P#v1}0X~R0akH4p0;_FtN&jI06h(9L#zQ3=C`_y-aLiHpCoeHi6YJbC}urL2QVj
z%<SSI4#XU04z>*p3=9Gc%vlT!4ALyDnRz7;!<adl%NQ6KWFlBNIm;NK4r1Zr0<j?m
zv2b&>Gr}Ci!ov<W2<$o*UNA=l!r=pRBp@7qFh>T$5#Z@#WMEK$a0I~|4G2dFY_tJ{
zBMjzPKsX{`jst`v3g&n~IAR==85tM?7?`UW85md?!9gMbW^;f;nRz<{NSp~2RA5OK
zab{5bgW0Ut#5aMoaj=7=Sy&(xB<fh0pggcj7AA16XW;--U?H{{l6M%Pk-#=n8pH-i
z!VPvqjwWVk*s&Xfy$%UGb~A9GLL!0P9Lxb{P6l=hFb5J`?3Q2-B!t+lz#K>jv0H;V
zkPu?G0dpWB#BK}bKthP!0nCAf5W6Fo695h_b|)|=0>W_-o6XF?kO1Mhi7a4dV90=Q
zJix9lfN(s)oDvAfi~BJn149Lb<12KWk%6HB!tvuj$H>6Y1mXB|EM;b3XoheC`L{AN
zFmymTk-YC285kx&IML$!nHd;Br6mIcdyM2sW(I}@5Sdu8b5=k&ah#wWu>rz~=UT?d
zz_0_tNdUX;0ECmoagLdR;RqxtbFfSPW@KOhXFhgqJ|0jEGf!h?U|<Fb^MaBH$W?rx
z1i-+++{eto08z6G&N{-(zyMZwkC}l1tWcPN8RS7hkN`6%k_BHdGcZ6?1q&n@$$@O*
zT+hTS%)-FH1ade7I3+QOXo3Vl*^miDFbIJZGG_3CvXC_ksL<d9i7*N9fusXriW$J7
z%=}={bdV@0|3J)Sk*NR)fCvWWS&R%2QD(u(AW@JqCJ>8(c?JsugZzB39l{_x;+T0r
zwr&L}1Ni`|PxJyv0IUz>ZYB_yf%z&61A_uc`2(;4V9&5fe*`H75e&>A>mj1@Jgf{1
zOdviJxX1vDGRx|KM8U>_Ss-Jf4g*;O_8*HBCrFz+NF`V+Sd@DX*quorQBasOfd~dg
zkQcblGlJs_<gjLt{99%Q2Byc%pm0<IDd2JCT>=sZX#wkF+R4bk0A@jgo|&5q<fd(`
zAT8iv;b7zgg~mmYHjqhR;~11drZKvKGd+m;6`a}_7#Qa)XJcSc@nK+elL8sUG|@u@
zB=4rYn~i~iX`%zTC3%63fq|15Bo4w{AOeITX`X=rTupe3fnuC#Vg#5MDg-et0n7`7
z@-oCg+9LT<*+9-!1#v)lD~MoVU}$G!U=RnfGe7~t%D@1(306I!$TBdffz*K=3W@_r
zI%NiVh!>Q?L9Pa;crFHk18fWo>L8;TApr(rf-oD@SB!I(vNJG%z0NHMiaVBxJNDP}
zr=>9P@PLAoW#WbX_5AJ(ynG;ku}r+NzaC4-fIZ941u}|d;)DJ5aQB1S{~+u5y%@v<
zL1~0#;(`73VC9-z5dH}y<)DT&NI5vT3^}HNYhzH~g@Mt81DrHLvYMd$uLa8c|K%AN
z7<n0(`K-9Dxh=Upg)O)l7?@ZYJcSt;nE4sF6*)jG78M3=ZaZ#fJ_ZI>P^Hc$hNOdm
zfnAT$UJ`1ABAdFTjU=Nm0|SQ%NRc8V#9Sr`1_n+fb=>Nbp284?T-=O;j6&=T4BWzu
z%zWJ35T}5Q;1OnE=ChGxVBlqB^b`h(@F_BQ3hQ$-Fz}l&FmqTTn=YURcD0~6m=Z#^
z3ucorR8W!2n$;4?1tP5IP89_?-c#5_669_%m^QFqAdVJC7E|N}*}%XcA;_r8C(O+(
zFD(!9k$^Y@gCsA=ok)Qz#m~Ua&A=cH4N?vU1{q;SWKYW?0+)e74r&cI#K91|<wY4m
zVWA)j4HQLWMR|OPkX3?9aD%+t&IpYfWmIvHTOA~7z_F&nisW99=T#xG1F}#}lo4b$
zh^dZhf~PRD85*dPpa|3iMIZx%7C8Dqtq2_k1_p4m1X2coQY9E8w+_JqPy$qKu`+Nl
zRDv3KjEukeco`TO!To<wLyeJ99$eT$6=P6LjPgwU;BGUx^a2xL+YtmfJA)fdAm=fF
z32>o@M6hZyaDsJ!EMVqhWYQL56@1Dn#PO7sl|z_;iG`7E9s?5#^E_5=HYN>GR?a9^
zekN66RvwTPM-!`P3#%ZA`Gl2;nWuzRl1W{Jm8pbDNrIIFtSpk13nI-@29lC0VPz@d
zh-MXo(p=1?Osb3^6>J<$tO{(*{7tM}C9Dc1tg<$&T(+!&C9GVftdb?HTqjv2z$An%
zTEeQ$9Gb?;C(FtU(*1;$mD#X~m4~C5m9do7iX)1ZmBSV!!BzrteF-ZU8<U0zD@O^d
z+$2`v&k#57VihfA71_<IbnrSWFSF1!sHcQjMZMRuitlFSJ;kcRq0cH>!m3irD%!-V
z*32qi!YWhBD%r%!*UT!_#46g%%C{RN$hQQpnb(_DibJ1Oy@ZvwnN@`&5~P!_8N?Sa
zVdb2(o0V}76Eg!NV|;vmT3UPwL%gSdd=aQCQczOF5TBfpn3=~=P?Va&P@Gwn3X(6*
z$S*2MDoq2cOe#%_Pf9FKWynn|N>7c?$xJFrWys0TOIH9BrFq4f>3OLs3ZNc9erZWT
zX-RxaYI;#>DnlBGh)>Q>Nlh**LDB+J3DuOGkyykKA0H6p8WIv2?-uIk9OCKk7az|M
zpO%@EnwJlD0objnc_|PhK)T)iLKU11%@qud^^Ell6m)Y-O7l`}(^K<Oi!zfHbaNAn
zk~3^8EX;JxOcZp}6?D@Qi!1YzGm7%_@=J?#OY_Pz^HOw65|eULixqU!ic1ocvvmuK
z@=H>aOY)0!i%W_?-h)Xb=Oh+qz@#(t^AvQ`lGBj*4Do3>iRr~)r-A|t<kI-$(xUj}
z{G8I<JcgXiv{bMpEF@C$OOtX^8RGMEQa~|MoLa&FqstO=;)_cQ;tMj%@=F*}D)Ztq
z^N>O`u{6FQr?fb}B)^0K+OGsfW^Q6pc4`qrdTL30MrvXT14^94gQB4*wKyIWp`d8?
zVkpQjE=euQ%rD9;se}Y7ijLycl6X+h5oC0EQD#YMJSd?QCFW%_q$HLkGUQ|ym&B*$
z<i?jUfK!SBif)ju;>5C4NTP|4&n(VQwzP~-D^5<#OM@n&lKhgyoK%Lg%+&Juto$Sf
zkhe4Q(xBds&&f~DhK8yULws(2N-9HfNl|ic0Ygb*W)4FhR2MjjB<7|vBo}3tWEPe}
zLK)&>P$ZOOmVkoU(;sXgC}Dg0$Gds@xH1$Z7L{a{Waj5Fq~#Z+<}t)WLa>-2K0dLy
zIJKxGJ`H41W^sIKZUHEaKt3*Eh<D1*&q0JPIPpS40F)@fz5#^|II_z#Q&Qu>!4+Qy
zPHC_x20H+x3>1V6@EA=jN@2(^N=YqBO^MIU1G#|#8f4%o&CE+K0tHokz6&ICfh~t5
zlf2U0)SO&~wAB1GhOGRg_&iXUfHS+9Nqh+?YbU3sq~;|<!Uvq2z!@4IQ=q^?NoPm{
z6Y=o{i7BQG@uhjC#i=Pq3~+~JLLCCKv4jC^Dr9H_lng=12NX>pe}aP}DKR;_v;dMO
z(lYZ>7~shgq686KU_K}bf(?d8AtYMC?gk}jP*@-aU-UEbb5r#bb28KPeFJ<M(744#
z$slLvl%}LI=$953>E~o7>8B?r>sMHq#haPv=49rTR_LbZmFgQB>u2UABNRe8m<p3J
zONt?8;Z>qvQdy9Ss*nLZS_CFQJ_RKLy$o=c(#rtFo?Zq+aY;%_YMNdK16Vg$pr|yt
z1e|pBG8jM!2rQVAlbHlzWafkEqRhN>y$l9O64uLLU~qSKwo=dtO)AYRDTNl6x@M(d
zu2G$liJpOpCR7+y88d)tZqP^~sNQz>3k9_;4uHhK)j9*TfevarR0T0GRtPXk^RRP(
zy5TaQ0Uxjl3=H5Vy(^zU8<R6H8}nZ#9(E1}kh~349^CbT%fDd+$wQ?uC{PoFh2i6W
z3<(AX24={B2!<3hq}72U4r+ZcGO#khrZK>SEKoOt#36GU3=A-FkY;Ac7yyWgf|=3U
zS};jw6x}dUkUPOmCWHW##moSjvw(7-lo101gAkIxz+uV2z+ej=YJ)05qMUJv``{3d
z!XXYC!vn=TlF?vhArAGR_9Hg+{W#Rmz#+a2hd8J!i_QF9IMnaQA$|gf_$3_TkD=iY
z3wLl@Wnf@<heQ2$9O9q^i_QI@VLNQ%pb<Q5;*hceOY=z25L=^3&j7g?hSY3`LKvlH
zL$8*h)hkFfs6LK&_wjdf^ojR(a|?D2i4Spf@^Os^x91?`ZfXgLj)zpR;Nl#;>H^h8
z;0h6B9GC$r?HJ<Y!Huo><cw@c6^m5Ufa(o!T?b--DiC<}3#tu30-%B)lrUXD1hnr1
zDx3cNhX8-5IH=6xVPIf@i6<b5gK{HGya_4}>W+ZS0rjUqLK8s*lKBwR|NozjCJr7!
zU|?Wa3>6323(D0n^Y=o<Vdlf)_$*W$q@EwiowuRlF!kU85e5c^XHapFdXO0~^Zz1=
z3nG~#2`V@l7#Oq|7#KjKQZV((Na7%~VdC0Qagh0-aTS=j3sfBD9?-A_$jT6?I7mIR
z`!k{9F!dm}g49<+#nILGB8elre<f5L-Tj-9#F5><8!8SmAKCp^pyD8Nkk#LZii6aH
z26<rq{Q(t6SI-Rc5NHyBfq?;8y#!PoM1j%|%)c5S0jPT9@G*mmgD8-Ckefi^;|LOf
zst1_?b59ji97KWCgUWS~`aX~VQu>66FTx>y1S$^lFK7%8X8tXxILN=CxP^&7g^GjJ
zOCqH!29P75?vz3j*M^FNw1Jqgy50)JL2@T7AGx53gW3lmfB8VgLG~i&qYNZ*kXo2K
zE0DxNqx3NGg-GJa`F%YOanL9|$bOK$ps{zDIscK=OC$NW5~L6s4#?^!Ac-TZ2Mv<L
z%$G+p=LM2_1tjq=IK*M)4QOB!d8h{DN09j-anPXmDG&!-mq8dHaS(>^AZZxH28n?%
zNDqh)ic=5`$_Ajg1hGLFls-T-NG;3_Aih3`V1Nu1gUslLh8HaULFz%`&QQa`(A0zC
z5+sxjB9P4SfT}M?6JG`mmlibf?NEDR<u=UT!%%bPp{c(CRS%vPN3s`|USZ`k%$yHU
zb8exTQw|C!1_p-bXyUR^cYZ+=PlEEnLvBd++Ck0dgPI4kcO#T94W(h?-=Xe@Oz9!Q
zA2zOLil+V$l<x$kVdhMMn&Xcq-U4+`44Sw-)cvq>9%jx>sQNlI^=F~xccF<x=J6O9
zrlE;DLe<Yk6Ay!i=W;Z0@GK4k1H)D{aWSZS_MnNsgz^tVX_))nq4u6a6Ay-(a}iCv
z2O17H(8NQb=D_L~nE3~x>Yt#ghYB-%KobYeLxJS}poud=&4<M^%zVgXECU0~-!O4l
zUR8$r117!&WH<u@g8`a26EvJ{(ZqK`#l6tPVfw?-#2-QVDNq__FQ|V5vbqpWJRa)L
zIyCV#D8Cy@!^{Cq*?`QMfhH~hb>~tvaVcoHZ9)?VwG}|->_-z{0}^ClU^s&&z7EQV
zrFWQn`l0TB29<}2XG6t5qluS8-2<ynVd}wiObiSRyij?V_zI|gm_K0RuzaG9roI&F
zeiJnD+0gKT<ujN$y-;yKH1*%0?vF+jH-)N))ypt*wn5!lil*KMs=gUbyba3lhte=}
zzCq2IjwXH;>Ym+b;x$n5qiEupQ2tja4Ku$E8a{u}#J!>7j8ON&)E7X-MbN}y?K~|s
zaYLxNFn`0$0ZqMwj0!?i{{ZU#3^ehH&~T_j6OV_QzW`1AK2&@gnmDXI^bk$_1eE_B
zO2gc_8p`Jd4Fn<8QyoxoBQ)_7P<MKuiSL1mC!>jPfVwjqO}qrEz6DKO8LECMns`3c
zJ=@X5MWE_0p^3xd=_XVh6zm`?Vg3ETP;po|fL5b`;)@$JfP@qdpz#clxF}Q{WDdwm
z*f^3Lk~qlx1dt>H1A{(P9A^F{sJJbf_$-hn1_lOiH1WkCix?OfBGJUTpys4O#X-tI
zM!?!d)lhMmy|DDz0TqX-&w+;LOsF`z`fF(7F;Mjnq2e%eKw$&IKcM0;b1r}!#lXOz
z3T?c?#9`s74;2TQ1M(7Vyv_nD4paXGBnetb2^9ya2N?}3x6`5GF!iwhTRBu5rXI9R
z0p!jOs5ngh9;o?K(ZpS${)KuAyg&lR2AKouyMbt!`5-n3gBO!P(+|iFP+toqt_C8I
z#KB7>p#64`6i6)yYlAop3=E(ZdmtuA41|qA90mpkSiK4o1K}8`xEYiNiGgrEly3#4
zL1G}h0?LPttANBn7`8IR6Dki917XlO97xCyL?F2zG!6$63I-8K;;{Zm1e*9oC_ffT
zgUklu>rg(dy$liq;RjIhbSMoH17Yw2O$G*r95nH7P(ElJ6T}3m1!35@3231rvN#(k
z;ushhszHKC?uWI@8_>kXq3XM!;vg<49YVPbpgtXl4H5%k5F3PH<pf9!gkj|mgI;lE
zZb@PigI;k-5rocwv5Hc267@<_D@qvjz_UtvNyWtsdPVsV4p=rNHK{Z`J~J;ZpFt18
zPE1NFN-bm1Ly}G`O3X`71!)Bt2vL@knU@OFQe095V}gX^!TjX>+}zZ>5(d4z{E}2X
zcfU|w@Gu^fpPpB$S5TB+kXlqy3AHOVBR;JNGz|svF2xuWj-aqb&TAk;Vd03r-T|Z*
zBoD)&zBnlB!qmgWcR)L!KR}Yu`3;a>Si2cHpMu1p#R5z_gEh3ifD1qwAhl2?m;#L}
zg3KgWzaePO1v-ubHV{fUK<$U+E2uEW422z3KTIA*&w%RR3@zti;^^+TgpPHfhu;Qh
z2do1+aRM680>u%?uOPEv;pc_JesAc&MJXr~fHXicy8WQ?0bLBF^Z;mZ4b+bTagZ>&
zT2T0aq8Q!%7P=5kuzCjMe$aRYy8A)p2fCRcogbj~|3{NV<ATd2Z1!hB?T3v!g6szc
zCA$5!(C~w~6J$3CzXuJPGB7Y)1Q`wzfMS^aFuDVW{sW-FOa|CWYN%$YS`ZJWA5=es
z*y#2@01YNGFff49H%L7UgVci9FnS@9nILf(=7A*;m;jW9>4S0^HZnk#rJ^Mh1_7vk
zQ278;3!-7+2V#TpNvQqk`VFA^LFoge4u;Y7AHk9S6QBcNuy6szA81J~Oh43k@Qfb1
z-5|R<pb8|Q1p}x*iY@*@X%eagqz#T2fC@GS1_n{I07K(4fRYI|{S%<>zYI4K!a&y#
E05cv}JOBUy

literal 0
HcmV?d00001

diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..e69de29
diff --git a/src/db.c b/src/db.c
new file mode 100644
index 0000000..b26b108
--- /dev/null
+++ b/src/db.c
@@ -0,0 +1,74 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "db.h"
+#include "list.h"
+#include "list_elm.h"
+
+list_t * read_list( file_mode_t mode, void * (*read_fct) (), void (*del_fct) () ) {
+	FILE * fd;
+	char fname[20];
+	list_t * L = new_list();
+	
+	if (mode == TEXT) {// Open file in TEXT mode
+		printf( "\t\tRead list from text file (.txt)\n\tfile name :" );
+		scanf( "%s", fname );
+		fd = fopen( fname, "rt" );
+	}
+	else {// open file in BIN mode
+		printf( "\t\tRead list from binary file (.bin)\n\tfile name :" );
+		scanf( "%s", fname );
+		fd = fopen( fname, "rb" );
+	}
+	//todo
+	void * datum;
+	while ((datum = read_fct(fd, mode)) != NULL) {
+		queue(L, datum);
+	}
+
+	
+	list_elm_t * E = get_tail(L);
+	if (E != NULL && empty_list(E->data)) {
+		list_elm_t * T = get_pred(E);
+		if (T != NULL) {
+			set_suc(T, NULL);
+			L->tail = T;
+		} else {
+			L->head = L->tail = NULL;
+		}
+		del_list_elm(&E, del_fct);
+	}
+
+		/** TODO parcourir le fichier pour y collecter les formulaires et les ranger dans la L
+			ATTENTION :
+				il est **possible** que vous créiez un élément de trop (un formulaire vide) en fin de liste.
+				Il faut alors penser à le supprimer grâce au code suivant :
+					E = get_tail (L);
+					struct elmlist * T = getPred(E);
+					set_suc(T, NULL);
+					L->tail = T;
+					del_elmlist(E, ptr_del);
+		*/
+
+		
+		fclose(fd);
+		return L;
+	}
+void write_list( list_t * L, file_mode_t mode, void (*write_fct) () ) {
+	FILE * fd;
+	char fname[20];
+	if (mode == TEXT) {
+		printf( "\t\tWrite list to text file (.txt)\n\tfile name :"), scanf( "%s", fname );
+		fd = fopen( fname, "wt" );
+	} else {
+		printf("\t\tWrite list to binary file (.bin)\n\tfile name :"), scanf( "%s", fname );
+		fd = fopen(fname, "wb" );
+	}	
+		
+		for (list_elm_t * elm = get_head(L); elm != NULL; elm = elm->suc){
+			write_fct(elm->data, mode, fd);
+		}
+	/// @todo Parcourir L et écrire les formulaires grâce à data_write_fct
+	fclose(fd);
+}
+
diff --git a/src/io.c b/src/io.c
new file mode 100644
index 0000000..aafeda6
--- /dev/null
+++ b/src/io.c
@@ -0,0 +1,141 @@
+#include "list.h"
+#include "list_elm.h"
+#include "job.h"
+#include "list.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+list_t * read_graph ( char * filename ) {
+    FILE * fd = fopen ( filename, "rt" );
+    list_t * G = new_list ( );
+    assert ( fd && G );
+    char job_name [ BUFSIZ ];
+
+    while ( !feof ( fd ) ) {
+
+        fscanf ( fd, " %s", job_name);
+        if ( !strcmp (job_name, "NIL" ) ) continue;
+
+        job_t * J = new_job ( job_name );
+
+	/** @note
+	    À l'appel J pointe sur le job que l'on vient de créer.
+	    
+	    FIND retrouve le job J dans la liste G des jobs grâce à la fonction titleJobCmp.
+	    Si ce job n'est pas dans la liste G alors
+	        le job pointé par J est enregistré dans G
+	    Si ce job est déjà dans G alors
+	        le job pointé par J est supprimé grâce à free_job
+		puis le pointeur de J est réassigné sur le job trouvé dans G
+	 */
+	find ( G, ( void ** ) &J, &titleJobCmp, &free_job );
+
+	fscanf ( fd, "%lf", &(J->life) );
+
+	/** @note
+	    Enregistrement des préséances
+	*/
+	job_t * predJ;
+	fscanf( fd, " %s", job_name );
+	while ( strcmp ( job_name, "NIL" ) ) {
+	  predJ = new_job ( job_name );
+    //SOUVIENS SI &TITTLEJOBCMP = &SETJOBTITLE
+	  find ( G, (void **) &predJ, &titleJobCmp, &free_job );
+
+	  ordered_insert ( predJ->posteriority, J, &titleJobCmp );
+	  incr_job_oDegree ( predJ );
+
+	  ordered_insert ( J->precedence, predJ, &titleJobCmp );
+	  incr_job_iDegree ( J );
+
+	  fscanf ( fd, " %s", job_name );
+	}
+	
+	/** @note valeurs par défaut des autres champs */
+        J->dyn_input_degree = J->input_degree;
+        J->rank = UNDEF;
+        J->au_plus_tard = UNDEF;
+        J->au_plus_tot = UNDEF;
+        J->marge_totale = UNDEF;
+        J->critique = false;
+    }
+
+    view_list(G,&view_job);
+    return G;
+}
+
+static void partition(list_t * L, elmlist_t * pivot, list_t * val_inf, list_t * val_sup, int (*cmpFct)(void*, void*)) {
+    for (elmlist_t * cur = L->head; cur != NULL; cur = cur->suc) {
+        if (cmpFct(get_data(cur), get_data(pivot)) < 0)
+            queue(val_inf, get_data(cur));
+        else
+            queue(val_sup, get_data(cur));
+    }
+}
+
+void quick_sort(list_t * L, int (*cmpFct)(void*, void*)) {
+    assert(L && cmpFct);
+
+    if (L->numelm > 1) {
+        //CONFIRMER LE STRUCT
+        struct list_elm_t * pivot = get_head(L);
+        L->head = get_suc(pivot); 
+        pivot->pred = NULL;
+        pivot->suc = NULL;
+
+            
+        /** @note
+         * La listes des données inférieures à pivot
+         * La listes des données supérieures à pivot
+         */
+        list_t * val_inf_pivot = new_list();
+        list_t * val_sup_pivot = new_list();
+
+    /** @note Déplacement des données de L dans val_inf_pivot et val_sup_pivot */
+        partition(L,pivot,val_inf_pivot,val_sup_pivot,cmpFct);
+        
+        /** @note On supprimer les éléments de L sans supprimer ni L ni les jobs */
+        // elmlist_t * S;
+        // for(elmlist_t * E = L->head; E; E = S){
+        //     S = E->suc;
+        //     free(E);
+        // }
+
+        /** @note
+         * Si la partie inf est vide alors L commence par le pivot
+         * Sinon on tri grâce à cmpFct la partie inf puis on ajoute en queue le pivot
+         */
+
+        
+        if (is_empty(val_inf_pivot)) {
+            L->head = pivot;
+            L->tail = pivot;
+            L->numelm = 1;
+        } else {
+            quick_sort(val_inf_pivot, cmpFct);
+            L->head = val_inf_pivot->head;
+            L->tail = val_inf_pivot->tail;
+            L->numelm = val_inf_pivot->numelm;
+            pivot->pred = L->tail;
+            L->tail->suc = pivot;
+            L->tail = pivot;
+            L->numelm += 1;
+        }
+         /** @note
+         * Si la partie sup n'est pas vide alors
+         * On la trie puis on la concatène à la partie inf
+         */
+        if (!is_empty(val_sup_pivot)) {
+            quick_sort(val_sup_pivot, cmpFct);
+            val_sup_pivot->head->pred = pivot;
+            set_suc(pivot, val_sup_pivot->head);
+            L->tail = val_sup_pivot->tail;
+            L->numelm += val_sup_pivot->numelm;
+        }
+        free(val_inf_pivot);
+        free(val_sup_pivot);
+    }
+}
\ No newline at end of file
diff --git a/src/job.c b/src/job.c
new file mode 100644
index 0000000..dc5002c
--- /dev/null
+++ b/src/job.c
@@ -0,0 +1,55 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+#include <string.h>
+#include "job.h"
+#include "list.h"
+
+job_t * new_empty_job ( ) {
+    job_t * J = calloc ( 1, sizeof (job_t ) );
+    assert( J );
+    J->precedence = new_list ( );
+    J->posteriority = new_list ( );
+    J->rank = UNDEF;
+    J->au_plus_tard = UNDEF;
+    J->au_plus_tot = UNDEF;
+    J->marge_totale = UNDEF;
+    J->critique = false;
+    return J;
+}
+job_t * new_job ( char * title ) {
+    job_t * J = new_empty_job ( );
+    J->title = strdup ( title );
+    return J;
+}
+void free_job(job_t ** ptrJ ) {
+    assert ( ptrJ && *ptrJ );
+    if( (*ptrJ)->title ) free ( (*ptrJ)->title );
+    free ( *ptrJ );
+    *ptrJ = NULL;
+}
+
+void view_job ( job_t * J ) {
+    printf ( "JOB %s\n\tpreceeded by [", get_job_tilte ( J ) );
+    for(elmlist_t * E = get_head ( J->precedence ); E; E = get_suc ( E ) ) {
+        printf ( " %s", get_job_tilte ( get_data ( E ) ) );
+    }
+    printf ( " ]\n" );
+    // if ( !get_numelm ( J->posteriority ) ) printf ( "\t" );
+    printf ( "\tfollowed by [" );
+    for(elmlist_t * E = get_head(J->posteriority); E; E = get_suc(E)){
+        printf(" %s", get_job_tilte(get_data(E)));
+    }
+    printf ( " ]\n" );
+    printf ( "\tiDeg=%d\toDeg=%d\tlife=%2.2lf", J->input_degree, J->output_degree, J->life );
+    printf ( "\trank=" );
+    if ( J->rank == UNDEF ) printf ( "U" ); else printf ( "%d", J->rank );
+    printf ( "\tearly=" );
+    if(J->au_plus_tot == UNDEF ) printf("U"); else printf ( "%2.2lf",J->au_plus_tot );
+    printf ( "\tlate=" );
+    if(J->au_plus_tard == UNDEF ) printf("U"); else printf ( "%2.2lf",J->au_plus_tard );
+    printf ( "\ttotale= " );
+    if ( J->marge_totale == UNDEF ) printf("U"); else printf ( "%2.2lf", J->marge_totale );
+    printf ( "\tcritical= " );
+    if ( J->critique ) printf("Y\n"); else printf ( "N\n" );
+}
diff --git a/src/job_2.c b/src/job_2.c
new file mode 100644
index 0000000..76c8897
--- /dev/null
+++ b/src/job_2.c
@@ -0,0 +1,111 @@
+#include "job.h"
+#include "list.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+job_t * new_empty_job(){
+    job_t * J = calloc ( 1, sizeof (job_t ) );
+    assert( J );
+    J->precedence = new_list ( );
+    J->posteriority = new_list ( );
+    J->rank = UNDEF;
+    J->au_plus_tard = UNDEF;
+    J->au_plus_tot = UNDEF;
+    J->marge_totale = UNDEF;
+    J->critique = false;
+    return J;
+}
+
+job_t * new_job(char * title){
+    job_t * J = new_empty_job ( );
+    J->title = strdup ( title );
+    return J;
+}
+
+void free_job(job_t ** ptrJ){
+    assert ( ptrJ && *ptrJ );
+    if( (*ptrJ)->title ) free ( (*ptrJ)->title );
+    free ( *ptrJ );
+    *ptrJ = NULL;
+}
+
+void view_job ( job_t * J ) {
+    printf ( "JOB %s\n\tpreceeded by [", get_job_tilte ( J ) );
+    for(elmlist_t * E = get_head ( J->precedence ); E; E = get_suc ( E ) ) {
+        printf ( " %s", get_job_tilte ( get_data ( E ) ) );
+    }
+    printf ( " ]\n" );
+    // if ( !get_numelm ( J->posteriority ) ) printf ( "\t" );
+    printf ( "\tfollowed by [" );
+    for(elmlist_t * E = get_head(J->posteriority); E; E = get_suc(E)){
+        printf(" %s", get_job_tilte(get_data(E)));
+    }
+    printf ( " ]\n" );
+    printf ( "\tiDeg=%d\toDeg=%d\tlife=%2.2lf", J->input_degree, J->output_degree, J->life );
+    printf ( "\trank=" );
+    if ( J->rank == UNDEF ) printf ( "U" ); else printf ( "%d", J->rank );
+    printf ( "\tearly=" );
+    if(J->au_plus_tot == UNDEF ) printf("U"); else printf ( "%2.2lf",J->au_plus_tot );
+    printf ( "\tlate=" );
+    if(J->au_plus_tard == UNDEF ) printf("U"); else printf ( "%2.2lf",J->au_plus_tard );
+    printf ( "\ttotale= " );
+    if ( J->marge_totale == UNDEF ) printf("U"); else printf ( "%2.2lf", J->marge_totale );
+    printf ( "\tcritical= " );
+    if ( J->critique ) printf("Y\n"); else printf ( "N\n" );
+}
+
+char * get_job_title(job_t * J) {
+    assert(J);
+    return J->title;
+}
+
+void titleJobCmp(job_t * J, char * title){
+
+
+
+}
+
+void set_job_title(job_t * J, char * title) {
+    assert(J && title);
+    if(J->title)
+        free(J->title);
+    J->title = strdup(title);
+}
+
+
+double get_job_life(job_t * J) {
+    assert(J);
+    return J->life;
+}
+
+
+void set_job_life(job_t * J, double life) {
+    assert(J);
+    J->life = life;
+}
+
+
+int get_job_iDegree(job_t * J) {
+    assert(J);
+    return J->input_degree;
+}
+
+
+void set_job_iDegree(job_t * J, int iDegree) {
+    assert(J);
+    J->input_degree = iDegree;
+}
+
+
+void incr_job_iDegree(job_t * J) {
+    assert(J);
+    J->input_degree++;
+}
+
+
+void decr_job_iDegree(job_t * J) {
+    assert(J);
+    J->input_degree--;
+}
\ No newline at end of file
diff --git a/src/job_3.c b/src/job_3.c
new file mode 100644
index 0000000..6ac6944
--- /dev/null
+++ b/src/job_3.c
@@ -0,0 +1,55 @@
+#include "job.h"
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+//TOUS EST CHANGee
+int get_job_oDegree(job_t * J) {
+    assert(J);
+    return J->output_degree;
+}
+
+void set_job_oDegree(job_t * J, int oDegree) {
+    assert(J);
+    J->output_degree = oDegree;
+}
+
+void incr_job_oDegree(job_t * J) {
+    assert(J);
+    J->output_degree++;
+}
+
+void decr_job_oDegree(job_t * J) {
+    assert(J);
+    J->output_degree--;
+}
+
+int get_job_rank(job_t * J) {
+    assert(J);
+    return J->rank;
+}
+
+void set_rank(job_t * J, int rank) {
+    assert(J);
+    J->rank = rank;
+}
+
+int titleJobCmp(job_t * J1, job_t * J2) {
+    assert(J1 && J2);
+    return strcmp(J1->title, J2->title);
+}
+
+int iDegreeJobCmp(job_t * J1, job_t * J2) {
+    assert(J1 && J2);
+    return J1->input_degree - J2->input_degree;
+}
+
+int oDegreeJobCmp(job_t * J1, job_t * J2) {
+    assert(J1 && J2);
+    return J1->output_degree - J2->output_degree;
+}
+
+int rangJobCmp(job_t * J1, job_t * J2) {
+    assert(J1 && J2);
+    return J1->rank - J2->rank;
+}
diff --git a/src/list.c b/src/list.c
new file mode 100644
index 0000000..7032f0b
--- /dev/null
+++ b/src/list.c
@@ -0,0 +1,103 @@
+#include <stdlib.h>
+#include <assert.h>
+#include "list.h"
+#include "list_elm.h"
+
+list_t * new_list() {
+    list_t * L = calloc(1, sizeof(list_t));
+    assert(L);
+    L->head = NULL;
+    L->tail = NULL;
+    L->numelm = 0;
+    return L;
+}
+
+void del_list(list_t ** L, void (*ptr_del)(void *)) {
+    assert(L && *L);
+    list_t * list = *L;
+    list_elm_t * E = list->head;
+    while (E) {
+        list_elm_t * temp = E;
+        E = E->suc;
+        if(ptr_del) {
+            ptr_del(temp->data);
+        }
+        free(temp);
+    }
+    free(*L);
+    *L = NULL;
+}
+
+bool empty_list(list_t * L) {
+    assert(L);
+    return L->numelm == 0;
+}
+
+list_elm_t * get_head(list_t * L) {
+    assert(L);
+    return L->head;
+}
+
+list_elm_t * get_tail(list_t * L) {
+    assert(L);
+    return L->tail;
+}
+
+void view_list(list_t * L, void (*ptr_view)(void *)) {
+    assert(L && ptr_view);
+    for (list_elm_t * E = L->head; E != NULL; E = get_suc(E)) {
+        ptr_view(E->data);
+    }
+}
+
+void cons(list_t * L, void * data) {
+    list_elm_t * E = new_list_elm(data);
+    E->suc = L->head;
+    if (L->head != NULL) {
+        L->head->pred = E;
+    }
+    L->head = E;
+    if (L->tail == NULL) {
+        L->tail = E;
+    }
+    L->numelm++;
+}
+
+void queue(list_t * L, void * data) {
+    list_elm_t * E = new_list_elm(data);
+    if(empty_list(L)) {
+        L->head = E;
+        L->tail = E;
+    } else {
+        L->tail->suc = E;
+        E->pred = L->tail;
+        L->tail = E;
+    }
+    L->numelm++;
+}
+
+void insert_after(list_t * L, void * data, list_elm_t * elm) {
+    if(elm == NULL) return;
+    list_elm_t * E = new_list_elm(data);
+    E->suc = elm->suc;
+    E->pred = elm;
+    if(elm->suc != NULL) {
+        elm->suc->pred = E;
+    } else {
+        L->tail = E;
+    }
+    elm->suc = E;
+    L->numelm++;
+}
+
+void ordered_insert(list_t * L, void * data, int (*cmpFct)(void*, void*)) {
+    if(empty_list(L) || cmpFct(L->head->data, data) > 0) {
+        cons(L, data);
+    } else {
+        list_elm_t * current = L->head;
+        while(get_suc(current) != NULL && cmpFct(get_suc(current)->data, data) <= 0) {
+            current = get_suc(current);
+        }
+        insert_after(L, data, current);
+    }
+}
diff --git a/src/list_1 (1).c b/src/list_1 (1).c
new file mode 100644
index 0000000..ef9df30
--- /dev/null
+++ b/src/list_1 (1).c	
@@ -0,0 +1,74 @@
+#include "list_1 (1).h"
+#include "list"
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <assert.h>
+
+typedef struct{
+    elmlist_t * head;
+    elmlist_t * tail;
+    int numelm;
+  } list_t ;
+  // Create an empty list
+  list_t * new_list(){
+  list_t * t = calloc(1, sizeof(list_t));
+    assert(t);
+    return t;
+  }
+  // Delete list, its elements and possibly the data
+  //DOIT CONFIRMER LE STRUCT
+  void del_list(list_t ** ptrL, void (*ptrf) ()){
+  assert(ptrL && *ptrL);
+  list_t * L = *ptrL;
+    if(ptrf){
+      for(elmlist_t * E = L->head; E; ){
+          elmlist_t * T = E;
+          E = E->suc;
+          (*ptrf)(T->data);
+          free(T);
+      }
+  }
+  } else {
+  	for(elmlist_t * E = L->head; E ; ){
+  		elmlist_t * T = E;
+  		E = E->suc;
+  		free(T);
+  	}
+  free(*ptrL);
+  (*ptrL) = NULL;
+}
+  // Clean list; delete its elments but keep data and the list
+  void clean(list_t * L){
+    assert(L);
+    elmlist_t *curr = L->head;
+    while (curr != NULL) {
+        elmlist_t *temp = curr;
+        curr = curr->suc;
+        free(temp);
+    }
+    L->head = NULL;
+    L->tail = NULL;
+    L->numelm = 0;
+}
+  // Is list L empty ?
+  bool is_empty(list_t * L){
+  assert(L);
+  if (L->numelm == 0) return true;
+    return false;
+  }
+
+  elmlist_t * get_head(list_t * L){
+    assert(L);
+    L = L->head;
+    return L;
+  }
+
+  elmlist_t * get_tail(list_t * L){
+    assert(L);
+    L = L->tail;
+    return L;
+  }
+  
+  
+  
\ No newline at end of file
diff --git a/src/list_2.c b/src/list_2.c
new file mode 100644
index 0000000..ed867d3
--- /dev/null
+++ b/src/list_2.c
@@ -0,0 +1,226 @@
+#include "list_1 (1).h"
+#include "list.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <assert.h>
+
+// Gimme the number of elements of L
+int get_numelm(struct list_t * L){
+    assert(L);
+    return L->numelm;
+}
+// Take out the data D of the list L if it is present
+void take_out(struct list_t * L, void * D){
+  assert(L);
+  elmlist_t * current = L->head;
+  while (current != NULL) {
+      if (get_data(current) == D) {
+          elmlist_t * p = get_pred(current);
+          elmlist_t * s = get_suc(current);
+          // Update predecessor’s successor
+          if (p) set_suc(p, s);
+          else L->head = s;  // current was head
+          // Update successor’s predecessor
+          if (s) set_pred(s, p);
+          else L->tail = p;  // current was tail
+          free(current);
+          L->numelm--;
+          return;
+      }
+      current = get_suc(current);
+  }
+}
+
+// Add a element holding data to the head of L
+void cons(struct list_t * L, void * data){
+    elmlist_t * E = calloc(1, sizeof(elmlist_t));
+    assert(L && E);
+    set_data(E, data);
+    set_suc(E, L->head);
+    set_head(L, E);
+    if(is_empty(L)) L->tail = E;
+    L->numelm += 1;
+ }
+
+
+
+
+// Add  a element holding data to the tail of L
+void queue(struct list_t * L, void * data){
+  assert(L);
+  elmlist_t * E = calloc(1, sizeof(elmlist_t));
+  assert(E);
+  set_data(E, data);
+  E->suc = NULL;
+  if (is_empty(L)) {
+      E->pred = NULL;
+      L->head = E;
+      L->tail = E;
+  } else {
+      E->pred = L->tail;
+      L->tail->suc = E;
+      L->tail = E;
+  }
+  L->numelm++;
+  }
+// Insert in L a element holding data wrt order given by cmp_ptrf
+void ordered_insert(struct list_t * L, void * data, int (*cmp_ptrf)()){
+  assert(L && cmp_ptrf);
+  elmlist_t * E = calloc(1, sizeof(elmlist_t));
+  assert(E);
+  set_data(E, data);
+  // if list is empty, simply add the element
+  if (is_empty(L)) {
+      E->pred = E->suc = NULL;
+      L->head = L->tail = E;
+      L->numelm++;
+      return;
+  }
+}
+
+// Elements qui sont moins = val_inf et le reste val_sup.
+static void partition(list_t * L, elmlist_t * pivot, list_t * val_inf, list_t * val_sup, int (*cmpFct)(void*, void*)) {
+    for (elmlist_t * cur = L->head; cur != NULL; cur = cur->suc) {
+        if (cmpFct(get_data(cur), get_data(pivot)) < 0)
+            queue(val_inf, get_data(cur));
+        else
+            queue(val_sup, get_data(cur));
+    }
+}
+
+void quick_sort(list_t * L, int (*cmpFct)(void*, void*)) {
+    assert(L && cmpFct);
+
+    if (L->numelm > 1) {
+       
+        elmlist_t * pivot = get_head(L);
+        L->head = get_suc(pivot); 
+        pivot->pred = NULL;
+        pivot->suc = NULL;
+
+            
+        /** @note
+         * La listes des données inférieures à pivot
+         * La listes des données supérieures à pivot
+         */
+        list_t * val_inf_pivot = new_list();
+        list_t * val_sup_pivot = new_list();
+
+    /** @note Déplacement des données de L dans val_inf_pivot et val_sup_pivot */
+        partition(L,pivot,val_inf_pivot,val_sup_pivot,cmpFct);
+        
+        /** @note On supprimer les éléments de L sans supprimer ni L ni les jobs */
+        // elmlist_t * S;
+        // for(elmlist_t * E = L->head; E; E = S){
+        //     S = E->suc;
+        //     free(E);
+        // }
+
+        /** @note
+         * Si la partie inf est vide alors L commence par le pivot
+         * Sinon on tri grâce à cmpFct la partie inf puis on ajoute en queue le pivot
+         */
+
+        
+        if (is_empty(val_inf_pivot)) {
+            L->head = pivot;
+            L->tail = pivot;
+            L->numelm = 1;
+        } else {
+            quick_sort(val_inf_pivot, cmpFct);
+            L->head = val_inf_pivot->head;
+            L->tail = val_inf_pivot->tail;
+            L->numelm = val_inf_pivot->numelm;
+            pivot->pred = L->tail;
+            L->tail->suc = pivot;
+            L->tail = pivot;
+            L->numelm += 1;
+        }
+         /** @note
+         * Si la partie sup n'est pas vide alors
+         * On la trie puis on la concatène à la partie inf
+         */
+        if (!is_empty(val_sup_pivot)) {
+            quick_sort(val_sup_pivot, cmpFct);
+            val_sup_pivot->head->pred = pivot;
+            pivot->suc = val_sup_pivot->head;
+            L->tail = val_sup_pivot->tail;
+            L->numelm += val_sup_pivot->numelm;
+        }
+        free(val_inf_pivot);
+        free(val_sup_pivot);
+    }
+}
+
+// void quick_sort(list_t * L, int (*cmpFct)()){
+
+//     if (L == NULL || L->numelm < 2)
+//         return;
+
+
+//     elmlist_t * pivotNode = L->head;
+//     void * pivotData = pivotNode->data;
+
+
+//     list_t * less = new_list();
+//     list_t * greater = new_list();
+
+
+//     for (elmlist_t * cur = L->head; cur != NULL; cur = cur->suc) {
+
+//         if (cur == pivotNode)
+//             continue;
+
+//         if (cmpFct(cur->data, pivotData) < 0)
+//             queue(less, cur->data);
+//         else
+//             queue(greater, cur->data);
+//     }
+
+
+//     clean(L);
+
+
+//     quick_sort(less, cmpFct);
+//     quick_sort(greater, cmpFct);
+
+//     for (elmlist_t * node = less->head; node != NULL; node = node->suc)
+//         queue(L, node->data);
+
+
+//     queue(L, pivotData);
+
+//     for (elmlist_t * node = greater->head; node != NULL; node = node->suc)
+//         queue(L, node->data);
+
+//     free(less);
+//     free(greater);
+// }
+
+
+
+
+
+void view_list(list_t * L, void (*ptrf)()) {
+  assert(L && ptrf);
+  elmlist_t * curr = L->head;
+  while (curr) {
+      ptrf(get_data(curr));
+      curr = curr->suc;
+  }
+
+}
+// Return un ptr vers element else NULL
+void find(list_t * L, void ** ptrKey, int (*cmpFct)(), void (*delFct)()) {
+  assert(L && ptrKey && cmpFct);
+  elmlist_t * curr = L->head;
+  while (curr) {
+      if (cmpFct(get_data(curr), *ptrKey) == 0) {
+          if (delFct)
+              delFct(ptrKey);
+          *ptrKey = get_data(curr);
+          return;
+      }
+      curr = curr->suc;
+  }
+}
diff --git a/src/list_elm.c b/src/list_elm.c
new file mode 100644
index 0000000..aa173df
--- /dev/null
+++ b/src/list_elm.c
@@ -0,0 +1,52 @@
+#include <stdlib.h>
+#include <assert.h>
+#include "list_elm.h"
+
+list_elm_t * new_list_elm ( void * data ){
+    list_elm_t * E = calloc(1,sizeof(list_elm_t));
+    assert(E);
+    E->data = data;
+    return E;
+}
+
+void del_list_elm( list_elm_t * * E, void (*ptrf)() ){
+    assert(E && *E);
+    if (ptrf) {
+        ptrf((*E)->data);
+    }
+    free(*E);
+    *E = NULL;
+}
+
+list_elm_t * get_suc ( list_elm_t * E ){
+    assert(E);
+    return E->suc;
+}
+list_elm_t * get_pred ( list_elm_t * E );
+void * get_data ( list_elm_t * E ){
+    assert(E);
+    return E->data;
+}
+
+void set_suc ( list_elm_t * E, list_elm_t * S ){
+    assert(E);
+    E->suc = S;
+}
+
+void set_pred ( list_elm_t * E, list_elm_t * P ){
+    assert(E);
+    E->pred = P;
+}
+
+void set_data ( list_elm_t * E, void * data ){
+    assert(E);
+    E->data = data;
+}
+
+void view_list_elm ( list_elm_t * E, void (*ptrf)() ){
+    assert(E && ptrf);
+    for(elmlist_t * courant = E->head; courant; courant = get_suc(E)){
+      void * data = E->data;
+      (*ptrf)(data);
+    }
+}
\ No newline at end of file
diff --git a/src/main (1).c b/src/main (1).c
new file mode 100644
index 0000000..5bb714b
--- /dev/null
+++ b/src/main (1).c	
@@ -0,0 +1,32 @@
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "job.h"
+#include "list.h"
+#include "list_elm.h"
+
+
+int main(int argc, char ** argv){
+    if(argc < 2) exit(-1);
+
+    list_t * G = read_graph(argv[1]);
+    printf("Liste des tâches lue\n");
+    view_list(G, &view_job);
+
+    printf("Liste des tâches triée par degré d'entrée croissant\n");
+    quick_sort(G, &iDegreeJobCmp);
+    view_list(G,&view_job);
+
+    printf("Liste des tâches triée par rang croissant\n");
+    ranking(G);
+    view_list(G,&view_job);
+
+    printf("Prune edges\n");
+    prune(G);
+    view_list(G,&view_job);
+
+    printf("\nMarges totales des tâches\n");
+    marges(G);
+    view_list(G,&view_job);
+    return 0;
+}
diff --git a/src/outils.c b/src/outils.c
new file mode 100644
index 0000000..99f432b
--- /dev/null
+++ b/src/outils.c
@@ -0,0 +1,13 @@
+#include "outils.h"
+
+
+
+/** Integer comparaison */
+int int_cmp(int * a, int * b){
+	return *a - *b;
+}
+
+/** Double comparaison */
+int double_cmp(double * a, double * b){
+	return ((*a - *b) < -EPSILON) ? -1 : ((*a -*b) > +EPSILON) ? +1 : 0;
+}
diff --git a/src/rank.c b/src/rank.c
new file mode 100644
index 0000000..1d1438c
--- /dev/null
+++ b/src/rank.c
@@ -0,0 +1,19 @@
+#include "rank.h"
+#include "list_1 (1).h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+
+void ranking(list_t * G){
+
+}
+void prune(list_t * G){
+assert(G);
+
+}
+
+void marges(list_t * G){
+assert(G);
+
+}
\ No newline at end of file
-- 
GitLab