diff --git a/run.c b/run.c
index 4a273392f31c7154dbfcb3e1a81ef72531d16f5e..46a3bf7afcb82fac0f6139a10c7455f80dc86097 100755
--- a/run.c
+++ b/run.c
@@ -1,63 +1,4 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <semaphore.h>
-#include <math.h>
-
-int N; 
-//travailler avec des linkendList
-typedef struct node{ 
-    unsigned long long value;
-    struct node *next;
-}node_t;
-
-typedef struct queue{ 
-    struct node *tail;
-    int size;
-    int final;
-}queue_t;
-
-struct buffer_rc{
-    char **tab;
-    int size;       
-    int len;
-    int head;
-    int tail;
-    int stop;
-    FILE *file1;
-};
-
-
-struct buffer_cw
-{
-    queue_t **tab;
-    int size;       
-    int len;
-    int head;
-    int tail;
-    int stop;
-    FILE *file2;
-};
-
-struct buffer_rccw{
-    struct buffer_rc *struct1;
-    struct buffer_cw *struct2; 
-};
-
-/* sémaphore est une structure de donné qui contient :
-    *un entier qui stocke la valeur, positive ou nulle du sémaphore.
-    *une queue qui contient les pointeurs vers les threads
-*/
-pthread_mutex_t mutex1;
-sem_t empty1;
-sem_t full1;
-
-pthread_mutex_t mutex2;
-sem_t empty2;
-sem_t full2;
-
+#include "run.h"
 
 void put_in_buffer_1(char *c, struct buffer_rc *ptr){ //ajouter un element dans le buffer 1
     
@@ -83,7 +24,6 @@ char *get_from_buffer_1(struct buffer_rc *ptr){ // chercher dans le buffer 1
 }
 
 void put_in_buffer_2(struct queue *ptr, struct buffer_cw *buf){ //ajouter un element dans le buffer 2
-    buf->tab[buf->head] = malloc(sizeof(queue_t*));
     buf->tab[buf->head] = ptr;
     buf->len++; //augmente l'espace occupé dans le buffer
     buf->head = (buf->head + 1)%buf->size;
@@ -126,28 +66,21 @@ void enqueue(queue_t* q, unsigned long long val){
     struct node *ptr;
     ptr = malloc(sizeof(node_t));
     if (ptr == NULL){
-        free(ptr);
+        //free(ptr);
         return;}
     ptr->value = val;
-    ptr->next = malloc(sizeof(node_t));
-    if (ptr->next == NULL){
-        free(ptr);
-        return;
-    }
 
     if (q->size == 0)
     {
-        *q->tail = *ptr;
-        *ptr->next = *ptr;
+        q->tail = ptr;
+        ptr->next = ptr;
     }
     else{
-        *ptr->next = *q->tail->next;
-        *q->tail->next = *ptr;
+        ptr->next = q->tail->next;
+        q->tail->next = ptr;
     }
     q->size++;
 
-    free(ptr);
-
 }
 
 
@@ -160,7 +93,6 @@ queue_t* prime_divs(unsigned long long number){
         return NULL;}
     ptr->size = 0;
     ptr->final = 0;
-    ptr->tail = malloc(sizeof(node_t));
 
     for (unsigned long long i = 2; i <= number/2; i++){
         if (is_div(number, i) && is_prime(i) == 1){
@@ -190,13 +122,8 @@ void *writing(void *param){
         {   
             
             if (stop == N-1){
-                for (int i = 0; i < param1->size; i++)
-                {
-                    param1->tab[i] = NULL;
-                }
-                free(param1->tab);
-                free(pr_divs->tail);
                 free(pr_divs);
+                free(param1->tab);
                 return NULL;
             }
             free(pr_divs);
@@ -206,17 +133,18 @@ void *writing(void *param){
             FILE *file2 = param1->file2;   
 
             node_t *current;
-            current = malloc(sizeof(node_t));
-            if (current == NULL){return NULL;}
-            *current = *pr_divs->tail;
+            current = pr_divs->tail;
             current = current->next;
 
             fprintf(file2,"%llu",current->value);
+            node_t *toFree = current;
             current = current->next;
             
 
             for (int i = 1; i < pr_divs->size; i++)
             {
+                free(toFree);
+                toFree = current;
                 fprintf(file2," %llu",current->value);
                 current = current->next;
             }
@@ -224,7 +152,6 @@ void *writing(void *param){
             
             free(pr_divs->tail);
             free(pr_divs);
-            free(current);
         }
        
 
diff --git a/run.h b/run.h
index fc96eee09665172f9413d9832e6b7b52257d7414..9f07197a976bbb2c62339da4410d43c7bbdec269 100644
--- a/run.h
+++ b/run.h
@@ -1,18 +1,24 @@
-#ifndef RUN
-#define RUN
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <semaphore.h>
+#include <math.h>
 #include <pthread.h>
 #include <semaphore.h>
 
-int N;
-
-typedef struct node{
+int N; 
+//travailler avec des linkendList
+typedef struct node{ 
     unsigned long long value;
     struct node *next;
 }node_t;
 
-typedef struct queue{
+typedef struct queue{ 
     struct node *tail;
     int size;
+    int final;
 }queue_t;
 
 struct buffer_rc{
@@ -21,8 +27,11 @@ struct buffer_rc{
     int len;
     int head;
     int tail;
+    int stop;
+    FILE *file1;
 };
 
+
 struct buffer_cw
 {
     queue_t **tab;
@@ -30,6 +39,8 @@ struct buffer_cw
     int len;
     int head;
     int tail;
+    int stop;
+    FILE *file2;
 };
 
 struct buffer_rccw{
@@ -37,6 +48,10 @@ struct buffer_rccw{
     struct buffer_cw *struct2; 
 };
 
+/* sémaphore est une structure de donné qui contient :
+    *un entier qui stocke la valeur, positive ou nulle du sémaphore.
+    *une queue qui contient les pointeurs vers les threads
+*/
 pthread_mutex_t mutex1;
 sem_t empty1;
 sem_t full1;
@@ -46,10 +61,10 @@ sem_t empty2;
 sem_t full2;
 
 
-void put_in_buffer_1(char *c);
-char *get_from_buffer_1(void);
-void put_in_buffer_2(struct queue *ptr);
-queue_t *get_from_buffer_2(void);
+void put_in_buffer_1(char *c, struct buffer_rc *ptr);
+char *get_from_buffer_1(struct buffer_rc *ptr);
+void put_in_buffer_2(struct queue *ptr, struct buffer_cw *buf);
+queue_t *get_from_buffer_2(struct buffer_cw *buf);
 
 int is_div(unsigned long long number, unsigned long long i);
 int is_prime(unsigned long long number);
@@ -71,6 +86,4 @@ struct buffer_rccw *buff_init_12(struct buffer_rc *ptr1,struct buffer_cw *ptr2);
 void thread_create_join(struct buffer_rc *ptr1,struct buffer_cw *ptr2,struct buffer_rccw *ptr3);
 void mut_sem_destroy(void);
 
-int run (char *input,char *output,int n_threads);
-
-#endif
\ No newline at end of file
+int run (char *input,char *output,int n_threads);
\ No newline at end of file