diff --git a/circ_list.c b/circ_list.c new file mode 100644 index 0000000000000000000000000000000000000000..95ed608c0cc07f2b660a5396866a5e45b09bcdb2 --- /dev/null +++ b/circ_list.c @@ -0,0 +1,370 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include "circ_list.h" + +void display(Element* head){ + + Element* now = head; + printf("["); + + do { + printf("%d;",now->content); + now = now->next; + if(now == NULL){ + break; + } + }while(now->part != Head); + printf("]"); +} + + +//Fonction Créant des éléments par défaut +Element* element_create(void *data, Body Part, Element* Next){ + + //Allocation de la mémoire + Element* New = calloc(1,sizeof(Element)); + //Attribution des données + New->content = data; + New->part = Part; + New->next = Next; + //Retour de l'élément + return New; +} + +//Fonction qui créer une liste vide contenant seulement la tête +Element* list_create(){ + + Element* create = element_create(NULL,Head,NULL); + return create; +} + +//Fonction Créant un chaine par défaut +Chain_Circ* chain_create(){ + + //Déclaration de la tête ainsi de que de la queue + Element* tail = element_create(NULL,Tail,NULL); + //last et next correspondent a la queue pour la tête + Element* head = element_create(NULL,Head,tail); + //et inversement pour la queue + tail->next = head; + //Attribution de la mémoire pour la chaine + Chain_Circ* New = calloc(1,sizeof(Chain_Circ)); + //Distribution de la tête, la queue et la longueur + New->head = head; + New->tail = tail; + //2 est la longueur de base vue qu'il n'y a que la tête et la queue + New->length = 2; + +} + +//Fonction vérifiant le contenu de la chaine +bool list_empty(Element* head){ + + //Si head ne pointe sur rien alors la chaine est vide + if(head->next == NULL) { + //On retourne donc "vrai" + return true; + } + else { + //Sinon elle n'est pas vide on retourne "faux" + return false; + } +} + +//Fonction qui déplace la tête au prochain élément +Element* list_move(Element* head){ + + head->next->part= Head; + Element* new_head = head->next; + head->part = Tail; + + return new_head; +} + +//Fonction qui compte le nombre d'élément de la liste en partant de la tête +unsigned int list_count(Element* head) { + + //On utilise une fonction qui contient la tête + Element* now = head; + //Et une autre qui va compter les éléments + unsigned int count = 0; + //On compte tant que l'on est pas de retour à la tête ou que le prochaine élément est NULL + do{ + count++; + //On passe à l'élément d'après ici + now = now->next; + if(now == NULL){ + break; + } + }while(now->part != Head); + return count; +} + +//Fonction qui insert un élément après la tête +Element* list_insert_after(Element* head, void* data){ + + //On créer l'élément que l'on veut insérer + Element* insert = element_create(data,Trunk,NULL); + //Si il y avait déja un élément après la tête + if(head->next != NULL){ + //Notre nouvel pointera dessus afin de garder intacte la liste + insert->next = head->next; + } + //Sinon on fait simplement pointer la tête sur le nouvel élément + head->next = insert; + + //Puis on le retourne + return insert; + +} + +//Fonction qui insert un élément avant la tête +Element* list_insert_before(Element* head, void* data) { + + //On créé simplement un élément qui pointe sur la tête + Element* insert = element_create(data,Trunk,head); + + return insert; +} + +//Fonction de comparaison des données +int compare (void* data1, void* data2){ + + //On vérifie si les valeurs sont différentes + if (data1!=data2 ){ + + return 0; + } + //Si la condition n'est pas remplie alors elle sont égales + else { + + return 1; + } +} + +//Fonction qui recherche un élément dans la liste +Element* list_search(Element* head, void* data, int (*compare)(void*, void*)){ + + //On stock head dans une variable + Element* now = head; + + //Boucle s'arrêtant au retour de la tête si c'est une liste circulaire ou des qu'un élément est NULL + do{ + //On compare les valeurs + int v = (*compare)(data,now->content); + //Si c'est 1 on retourne l'élément car on l'a trouvé + if(v==1){ + return now; + } + //Sinon on passe à celui d'après + now = now->next; + + if(now == NULL){ + return NULL; + } + + }while(now->part != Head); + + //Si on fini la boucle sans rien avoir trouvé on renvoi NULL + return NULL; +} + + +//Fonction qui supprime un élément dans la liste +Element* list_remove(Element* head, void* data, int (*compare)(void*, void*)){ + + //On stock head dans une variable + Element* now = head; + //On créé une variable pour garder l'élément précédent + Element* last; + + //Boucle s'arrêtant au retour de la tête si c'est une liste circulaire ou des qu'un élément est NULL + do{ + //On compare les valeurs + int v = (*compare)(data,now->content); + //Si le retour est 1 + if(v==1){ + //on fait pointé l'élément juste avant celui qu'on supprime à l'élément après celui-ci + last->next = now->next; + + //Et l'élément qu'on veut enlever de la liste ne pointe plus sur rien. De cette façon il n'est plus dans la liste + now->next = NULL; + return now; + } + + //le précédent de vient l'actuel + last = now; + //l'actuel devient le prochain + now = now->next; + + if(now == NULL){ + return NULL; + } + + }while(now->part != Head); + + //Si on fini la boucle sans rien avoir trouvé on renvoi NULL + return NULL; + +} + + +void list_free(Element* head, void (*data_free)(void*)){ + + //On stock head dans une variable + Element* now = head; + + //Boucle s'arrêtant au retour de la tête si c'est une liste circulaire ou des qu'un élément est NULL + do{ + + (*data_free)(now); + + //l'actuel devient le prochain + now = now->next; + + if(now->next == NULL){ + break; + } + + }while(now->part != Head); + +} + +//TESTS// + +//TEST DE LA CREATION DE CHAINE +void Test1() { + + //On créer un chaine afin de vérifier si elle correspond bien à nôtre code + Chain_Circ* test = chain_create(); + + //On verifie chaque attribut pour qu'il correspondent bien au code + if(test->length == 2 && test->head->part == Head && test->tail->part == Tail){ + printf("\nTest chain_create() OK"); + } + //Si la condition n'est pas rempli alors notre fonction ne fait pas ce que l'on veut + else{ + printf("\nTest chain_create() Error"); + } + + //On libère la mémoire + free(test->head); + free(test->tail); + free(test); + +} + +//TEST COMPTE DE LA LISTE +void Test2(){ + + //Création d'une chaine par défaut + Chain_Circ* test = chain_create(); + + //On verifie si ça correspond a la taille donnée par défaut + if(list_count(test->head)== test->length){ + printf("\nTest list_count() OK"); + } + else{ + printf("\nTest list_count() Error"); + } + + //Libération de la mémoire + free(test->head); + free(test->tail); + free(test); +} + +//TEST INSERTION AVANT ET APRES LA TETE +void Test4() { + + //On créer une liste + Element* head = list_create(); + int* data = 1; + + //Utilisation de la fonction d'insertion après la tête + Element* insert1 = list_insert_after(head, data); + //Si la tête pointe bien sur l'élément retourné et que la donné est bien celle que l'on voulait le test est bon + if(head->next == insert1 && head->next->content == data){ + printf("\nTest list_insert_after() OK"); + } + else { + printf("\nTest list_insert_after() Error"); + } + + //Puis on refait la même chose avec la fonction d'insertion avant la tête + Element* insert2 = list_insert_before(head,data); + if(insert2->next == head && insert2->content == data){ + printf("\nTest list_insert_before() OK"); + } + else { + printf("\nTest list_insert_before() Error"); + } + list_free(head,free); +} + +//TEST DE LA FONCTION DE RECHERCHE +void Test5(){ + + //Création d'un liste + Element* test = list_create(); + //Variable de la donnée qui sera testée + int* data; + //Insertion d'élément de 5 à 1 + for(int i = 5; i>0; i--){ + data = i; + list_insert_after(test,data); + } + //Recherche d'un des éléments inséré + data = 3; + Element* test_v = list_search(test,data,compare); + + //Recherche d'un élément qui n'a pas été inséré + data = 7; + Element* test_f = list_search(test,data,compare); + + //Si il trouve le premier et non le deuxieme alors la fonction marche parfaitement + if(test_v != NULL && test_f == NULL){ + printf("\nTest list_search() OK"); + } + else{ + printf("\nTest list_search() Error"); + } + //On libére la mémoire + list_free(test,free); +} + +//TEST DE LA FONCTION DE SUPPRESSION D'UN ELEMENT DE LA LISTE +void Test6(){ + + //Création d'un liste + Element* test = list_create(); + //Variable de la donnée qui sera testée + int* data; + //Insertion d'élément de 5 à 1 + for(int i = 5; i>0; i--){ + data = i; + list_insert_after(test,data); + } + data = 3; + list_remove(test,data,compare); + Element* test_s = list_search(test,data,compare); + + if (test_s == NULL){ + printf("\nTest list_remove() OK"); + } + else{ + printf("\nTest list_remove() Error"); + } + //On libère la mémoire + list_free(test,free); +} + +//Fonction de tout les Tests +void All_Test(){ + Test1(); + Test2(); + Test4(); + Test5(); + Test6(); +} \ No newline at end of file diff --git a/circ_list.h b/circ_list.h new file mode 100644 index 0000000000000000000000000000000000000000..8cbda306104cb43884230465bbf3fe61a8223508 --- /dev/null +++ b/circ_list.h @@ -0,0 +1,57 @@ +#include <stdbool.h> +//Enum Body afin de déterminer les partis de la chaine dans nôtre structure Element suivante +typedef enum Body { + + Head, + Tail, + Trunk, + +}Body; + +//Structure Element Contenant la donnée, l'élément suivant, l'élément précédent et la parti de la chaine (queue, tête ou tronc) +typedef struct Element{ + + void* content; + struct Element* next; + Body part; + +}Element; + +//Structure Représentant une chaine circulaire composé de la tête et de la queue ainsi que de la longeur de la chaine +typedef struct Chain_Circ { + + Element* head; + Element* tail; + unsigned int length; + +}Chain_Circ; + +//Fonctions defini pour le fichier "circ_list.c" + +Element* element_create(void *data, Body Part, Element* Next); + +Element* list_create(); + +Chain_Circ* chain_create(); + +bool list_empty(Element* head); + +Element* list_move(Element* head); + +unsigned int list_count(Element* head); + +Element* list_insert_after(Element* head, void* data); + +Element* list_insert_before(Element* head, void* data); + +int compare(void* data1, void* data2); + +Element* list_search(Element* head, void* data, int (*compare)(void*, void*)); + +Element* list_remove(Element* head, void* data, int (*compare)(void*, void*)); + +void list_free(Element* head, void (*data_free)(void*)); + +void display(Element* head); + + diff --git a/circ_list.o b/circ_list.o new file mode 100644 index 0000000000000000000000000000000000000000..34952b9f1e0830060127ae3bce6201fa56bfe395 Binary files /dev/null and b/circ_list.o differ diff --git a/joseph.c b/joseph.c new file mode 100644 index 0000000000000000000000000000000000000000..7a4c39308b5bf5209f7fa5f833f7cd8d0c99158c --- /dev/null +++ b/joseph.c @@ -0,0 +1,75 @@ +#include <stdio.h> +#include <stdbool.h> +#include <stdlib.h> +#include "circ_list.h" + +//Fonction qui supprime le k-eme élément +Element* delete_k(Element* head,int k){ + + //Variable de déplacement dans la liste + Element* now = head; + //variable pour le compte + int loop = 1; + //Si k = 1 cela veut dire que l'on va supprimer la tête donc on la déplace + if(k==1){ + head = list_move(head); + } + //Boucle jusqu'a que que notre compte soit égale à k + while(loop!=k){ + //Incrémentation + loop++; + //On passe à l'élément d'après + now = now->next; + } + //Affichage de l'élément supprimé comme demandé + printf("\n%d",now->content); + //Suppression + list_remove(head,now->content,compare); + //On retourne la tête dans le cas où elle aurait été changé + return head; +} + +int main (int argc, char *argv[]){ + + if(strcmp(argv[1], "test") == 0){ + All_Test(); + } + else{ + //On récupère les 2 premiers arguments + int n = atoi(argv[1]); + int k = atoi(argv[2]); + + //Création d'une liste + Element* head = list_create(); + //On donne la valeur 1 + head->content = 1; + + int* kk; + //Boucle d'insertion jusqu'a avoir n élément dans la liste chainée + for(int i=n; i>1; i--) { + kk = i; + list_insert_after(head,kk); + } + + int* length = n; + //On cherche le dernier élément de la liste + Element* last = list_search(head,length,compare); + //On le fait pointé sur la tête pour avoir réellement un liste chainée + last->next = head; + + //Affichage de la liste + display(head); + //Boucle pour l'ordre de suprression + for(int i =0; i<n; i++) { + + //Si "k" depasse "n" on lui soustrait "n" et on lui ajoute "i"(qui correspond au nombre d'éléments supprimés) + while(k > n) { + k = k - n + i; + } + //On supprime l'élément à la k-eme place moins i + head = delete_k(head, k - i); + //On augmente k de sa valeur de départ a chaque boucle + k += atoi(argv[2]); + } + } +} \ No newline at end of file diff --git a/joseph.exe b/joseph.exe new file mode 100644 index 0000000000000000000000000000000000000000..1a921245da6d6d3bb3b20ddad95a114102965370 Binary files /dev/null and b/joseph.exe differ diff --git a/joseph.o b/joseph.o new file mode 100644 index 0000000000000000000000000000000000000000..bdc613e042be2501a222e768b46c43b96e29b4e0 Binary files /dev/null and b/joseph.o differ diff --git a/makefile b/makefile new file mode 100644 index 0000000000000000000000000000000000000000..3ab6699d344f3903b0829d3b0991e6a17a1cb556 --- /dev/null +++ b/makefile @@ -0,0 +1,29 @@ +All: joseph matrix_compute pointer_sort + +joseph: circ_list.o joseph.o + gcc -o joseph circ_list.o joseph.o + +matrix_compute: matrix.o matrix_compute.o + gcc -o matrix_compute matrix.o matrix_compute.o + +pointer_sort: pointer_sort.o + gcc -o pointer_sort pointer_sort.o + +circ_list.o: circ_list.c + gcc -o circ_list.o -c circ_list.c + +joseph.o: joseph.c + gcc -o joseph.o -c joseph.c + +matrix.o: matrix.c + gcc -o matrix.o -c matrix.c + +matrix_compute.o: matrix_compute.c + gcc -o matrix_compute.o -c matrix_compute.c + + +pointer_sort.o: pointer_sort.c + gcc -o pointer_sort.o -c pointer_sort.c + +clean: + del /f /q *.o diff --git a/matrix.c b/matrix.c new file mode 100644 index 0000000000000000000000000000000000000000..fa60b0b92e58580b99147f9c931b4c09219db6c2 --- /dev/null +++ b/matrix.c @@ -0,0 +1,30 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stdbool.h> +#include "matrix.h" + +m_double* matrix_alloc(unsigned int row, unsigned int col){ + + if(row == 0 || col == 0){ + return NULL; + } + m_double* matrix = calloc(1,sizeof(m_double)); + double ** mat_ptr = malloc(row*col*sizeof(double)); + matrix->content = malloc(row*col*sizeof(double*)) + for (int i=0;i<li;i++) mat->content[i] = data+i*co; + return matrix; + +} + + + +m_double* matrix_transpose(m_double* matrix){ + + m_double transp = matrix_alloc(matrix->col,matrix->row); + for(int i=0;i<matrix->row;i++){ + for(int j=0;j<matrix->col;j++){ + transp[j][i] = matrix[i][j]; + } + } + +} \ No newline at end of file diff --git a/matrix.h b/matrix.h new file mode 100644 index 0000000000000000000000000000000000000000..4905544f7123c7376aa57c91749afbe7881f374e --- /dev/null +++ b/matrix.h @@ -0,0 +1,8 @@ +typedef struct m_double { + unsigned int row, col; + double** content; +} m_double; + +m_double* matrix_alloc(unsigned int row, unsigned int col); + +m_double* matrix_transpose(m_double* m); diff --git a/matrix.o b/matrix.o new file mode 100644 index 0000000000000000000000000000000000000000..4180cf6ac3e7f81eeca9ac7669e9928d8e04b74a Binary files /dev/null and b/matrix.o differ diff --git a/matrix_compute.c b/matrix_compute.c new file mode 100644 index 0000000000000000000000000000000000000000..dbbd85ecccc5d2448d1ec6789047642fe726d971 --- /dev/null +++ b/matrix_compute.c @@ -0,0 +1 @@ +int main(){} \ No newline at end of file diff --git a/matrix_compute.exe b/matrix_compute.exe new file mode 100644 index 0000000000000000000000000000000000000000..2c3ce2bb599db4eeeaaf55a5829244da5d48c2d6 Binary files /dev/null and b/matrix_compute.exe differ diff --git a/matrix_compute.o b/matrix_compute.o new file mode 100644 index 0000000000000000000000000000000000000000..8bdd7c1e0f37ce1dc7641608c1d1ebaaf04530c3 Binary files /dev/null and b/matrix_compute.o differ diff --git a/pointer_sort.c b/pointer_sort.c new file mode 100644 index 0000000000000000000000000000000000000000..72fa295b39e6a2a05ac5ad685c615a663e07ac04 --- /dev/null +++ b/pointer_sort.c @@ -0,0 +1,71 @@ +#include <stdio.h> +#include <stdbool.h> +#include <stdlib.h> + +//Fonction de Vérification d'une valeur dans un tableau +int check(int* tab[],unsigned int len, int n){ + + //On parcours + for(int i=0; i<len; i++){ + //Si la valeur est égale à une d'une tableau on retourne 1 + if(n==tab[i]){ + return 1; + } + } + //Sinon 0 + return 0; +} + +//Fonction de sort +int* sort(int tab[],unsigned int len){ + + //Tableau de pointeur(len-1 car on prendra argc en argument) + int* ptr_tab[len-1]; + //variable utile dans le processus + int sort; + + //Double boucle + for(int j=0; j<len-1; j++) { + //Initialisation + sort = 0; + + for (int i = 0; i < len-1; i++) { + //On vérifie d'abord si la valeur n'est pas déjà dans le tableau autrement on la passe + int v = check(ptr_tab,len-1,tab[i]); + if (v == 1) { + continue; + } + //Sort prend la première valeur valable du tableau + if(sort==0){sort = tab[i];} + + //Ensuite on compare avec chaque élément pour voir lequel est le plus petit + if (sort >= tab[i]) { + + //On pointe sur celui ci tant qu'on en trouve pas un autre encore plus petit + ptr_tab[j] = *(tab+i); + //Si on trouve un plus petit on remplace les valeurs + sort = tab[i]; + } + } + //Affichage des valeurs + printf("\n%d",ptr_tab[j]); + } + return ptr_tab; +} + + +int main(int argc, char *argv[]){ + + //Tableau qui contiendra les arguments + int tab[argc]; + + //Boucle (on commence à 1 pour ne pas prendre le nom du fichier dans nos arguments) + for(int i=1; i<argc; i++){ + //On transforme les char en int et on les entre dans le tableau + tab[i-1]=atoi(argv[i]); + } + //On sort les valeurs + int* ptr = sort(tab,argc); + + +} \ No newline at end of file diff --git a/pointer_sort.exe b/pointer_sort.exe new file mode 100644 index 0000000000000000000000000000000000000000..8d039c0d7d3fc7583840abc83733a9b2ef334fe1 Binary files /dev/null and b/pointer_sort.exe differ diff --git a/pointer_sort.o b/pointer_sort.o new file mode 100644 index 0000000000000000000000000000000000000000..c662c30c2fe50a7091d2b5d3f1830c3a71cce18c Binary files /dev/null and b/pointer_sort.o differ