diff --git a/source_codes/sorted_lists/.gitignore b/source_codes/sorted_lists/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..eea418347ec18b704a33e23b698d5b162df88fd3 --- /dev/null +++ b/source_codes/sorted_lists/.gitignore @@ -0,0 +1,2 @@ +sorted_list_partiel +sorted_list_full diff --git a/source_codes/sorted_lists/Makefile b/source_codes/sorted_lists/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d7822ac93c5aaf6b38512758abde6dae01881871 --- /dev/null +++ b/source_codes/sorted_lists/Makefile @@ -0,0 +1,18 @@ +CC:=gcc +# SAN:=-fsanitize=address +CFLAGS:=-Wall -Wextra -pedantic -g $(SAN) +LDFLAGS:=-lm $(SAN) + +EXECS := $(shell find . -type f -iname '*.c' | sed 's/\.c//g') + +all: $(EXECS) + +$(EXECS): %: %.c + $(CC) $(CFLAGS) -o $@ $< $(LDFLAGS) + @echo $@ >> .gitignore + +.PHONY: clean all + +clean: + rm -f *.o $(EXECS) .gitignore + diff --git a/source_codes/sorted_lists/sorted_list_full.c b/source_codes/sorted_lists/sorted_list_full.c index 758000f9e1cb3f875ed4c688fdf040c463339d5f..0afad52fc80e721b07b6c425877394fdd3d64d21 100644 --- a/source_codes/sorted_lists/sorted_list_full.c +++ b/source_codes/sorted_lists/sorted_list_full.c @@ -1,110 +1,114 @@ -#include <stdio.h> -#include <stdlib.h> #include <assert.h> #include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> typedef struct _element { - int n; - struct _element* suivant; + int n; + struct _element *suivant; } element; -typedef element* liste; +typedef element *liste; // Crée une liste vide liste liste_creer() { - return NULL; + return NULL; } // Teste si la liste vide bool liste_est_vide(liste lst) { - return NULL == lst; + return NULL == lst; } // Retourne un pointeur sur l'élement avant l'emplacement d'insertion; -// ce pointeur est nul si la liste est vide ou si l'insertion est en tête de liste -element* position(liste lst,int val) { - element* pos = lst; - if (liste_est_vide(lst) || val <= lst->n) { - pos = NULL; - } else { - while (NULL != pos->suivant && val > pos->suivant->n) { - pos = pos->suivant; - } - } - return pos; +// ce pointeur est nul si la liste est vide ou si l'insertion est en tête de +// liste +element *position(liste lst, int val) { + element *pos = lst; + if (liste_est_vide(lst) || val <= lst->n) { + pos = NULL; + } else { + while (NULL != pos->suivant && val > pos->suivant->n) { + pos = pos->suivant; + } + } + return pos; } // Insère un élément dans la liste triée et retourne la liste mise à jour -liste liste_inserer(liste lst,int val) { - element* tmp = malloc(sizeof(element)); - tmp->n = val; - element* crt = position(lst,val); - if (NULL == crt) { // insertion dans une liste vide ou en tête de liste - tmp->suivant = lst; - lst = tmp; - } else { // insertion au milieu ou en fin de liste - tmp->suivant = crt->suivant; - crt->suivant = tmp; - } - return lst; +liste liste_inserer(liste lst, int val) { + element *tmp = malloc(sizeof(element)); + tmp->n = val; + element *crt = position(lst, val); + if (NULL == crt) { // insertion dans une liste vide ou en tête de liste + tmp->suivant = lst; + lst = tmp; + } else { // insertion au milieu ou en fin de liste + tmp->suivant = crt->suivant; + crt->suivant = tmp; + } + return lst; } // Extrait un élément avec la valeur <val> et retourne la liste mise à jour; -// la liste est inchangée si elle est initialement vide +// la liste est inchangée si elle est initialement vide // ou si la valeur est absente -liste liste_extraire(liste lst,int val) { - element *crt = lst, *prec = lst; - // boucle pour placer <val>: prec->n < val <= crt->n - while (NULL != crt && val > crt->n) { - prec = crt; - crt = crt->suivant; - } - // liste non-vide et <val> présente de la liste - if (NULL != crt && val == crt->n) { - if (crt == prec) { // extraction en début de liste - lst = lst->suivant; - } else { // extraction en milieu ou fin de liste - prec->suivant = crt->suivant; - } - free(crt); - } - return lst; +liste liste_extraire(liste lst, int val) { + element *crt = lst, *prec = lst; + // boucle pour placer <val>: prec->n < val <= crt->n + while (NULL != crt && val > crt->n) { + prec = crt; + crt = crt->suivant; + } + // liste non-vide et <val> présente de la liste + if (NULL != crt && val == crt->n) { + if (crt == prec) { // extraction en début de liste + lst = lst->suivant; + } else { // extraction en milieu ou fin de liste + prec->suivant = crt->suivant; + } + free(crt); + } + return lst; } // Retourne un pointeur sur l'élément qui contient <val> ou un pointeur nul // si la liste est vide ou la valeur absente -element* liste_recherche(liste lst,int val) { - // à compléter - return NULL; +element *liste_recherche(liste lst, int val) { + // à compléter + return NULL; } -// Imprime le contenu de la liste +// Imprime le contenu de la liste void print(liste lst) { - element* crt = lst; - while (NULL != crt) { - printf("%d ",crt->n); - crt = crt->suivant; - } + element *crt = lst; + while (NULL != crt) { + printf("%d ", crt->n); + crt = crt->suivant; + } } -int main(int argc, char** argv) { - liste lst = liste_creer(); - char str[20]; - do { - printf("Insert: "); - scanf("%s", str); - if (0 == strcmp("quit",str)) break; - lst = liste_inserer(lst,atoi(str)); - print(lst); - printf("\n"); - } while (true); - do { - printf("Extract: "); - scanf("%s", str); - if (0 == strcmp("quit",str)) break; - lst = liste_extraire(lst,atoi(str)); - print(lst); - printf("\n"); - } while (true); - return 0; +int main(int argc, char **argv) { + liste lst = liste_creer(); + char str[20]; + do { + printf("Insert: "); + scanf("%s", str); + if (0 == strcmp("quit", str)) + break; + lst = liste_inserer(lst, atoi(str)); + print(lst); + printf("\n"); + } while (true); + do { + printf("Extract: "); + scanf("%s", str); + if (0 == strcmp("quit", str)) + break; + lst = liste_extraire(lst, atoi(str)); + print(lst); + printf("\n"); + } while (true); + return 0; } diff --git a/source_codes/sorted_lists/sorted_list_partiel.c b/source_codes/sorted_lists/sorted_list_partiel.c index 773e80f39c19b6113d77280769456eb3868bf6ff..7934f8d7afbe494570ccb5a49d1f52be2b38b9a4 100644 --- a/source_codes/sorted_lists/sorted_list_partiel.c +++ b/source_codes/sorted_lists/sorted_list_partiel.c @@ -1,103 +1,107 @@ -#include <stdio.h> -#include <stdlib.h> #include <assert.h> #include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> typedef struct _element { - int n; - struct _element* suivant; + int n; + struct _element *suivant; } element; -typedef element* liste; +typedef element *liste; // Crée une liste vide liste liste_creer() { - return NULL; + return NULL; } // Teste si la liste vide bool liste_est_vide(liste lst) { - return NULL == lst; + return NULL == lst; } // Retourne un pointeur sur l'élement avant l'emplacement d'insertion; -// ce pointeur est nul si la liste est vide ou si l'insertion est en tête de liste -element* position(liste lst,int val) { - element* pos = lst; - if (liste_est_vide(lst) || val <= lst->n) { - pos = NULL; - } else { - while (NULL != pos->suivant && val > pos->suivant->n) { - pos = pos->suivant; - } - } - return pos; +// ce pointeur est nul si la liste est vide ou si l'insertion est en tête de +// liste +element *position(liste lst, int val) { + element *pos = lst; + if (liste_est_vide(lst) || val <= lst->n) { + pos = NULL; + } else { + while (NULL != pos->suivant && val > pos->suivant->n) { + pos = pos->suivant; + } + } + return pos; } // Insère un élément dans la liste triée et retourne la liste mise à jour -liste liste_inserer(liste lst,int val) { - element* tmp = malloc(sizeof(element)); - tmp->n = val; - element* pos = position(lst,val); - if (NULL == pos) { // insertion dans une liste vide ou en tête de liste - // à compléter - } else { // insertion au milieu ou en fin de liste - // à compléter - } - return lst; +liste liste_inserer(liste lst, int val) { + element *tmp = malloc(sizeof(element)); + tmp->n = val; + element *pos = position(lst, val); + if (NULL == pos) { // insertion dans une liste vide ou en tête de liste + // à compléter + } else { // insertion au milieu ou en fin de liste + // à compléter + } + return lst; } // Extrait un élément avec la valeur <val> et retourne la liste mise à jour; -// la liste est inchangée si elle est initialement vide +// la liste est inchangée si elle est initialement vide // ou si la valeur est absente -liste liste_extraire(liste lst,int val) { - element* prec = lst; - element* crt = lst; - // boucle pour placer <val>: prec->n < val <= crt->n - // à compléter - - // liste non-vide et <val> présente de la liste - if (NULL != crt && val == crt->n) { - if (crt == prec) { // extraction en début de liste - lst = lst->suivant; - } else { // extraction en milieu ou fin de liste - prec->suivant = crt->suivant; - } - free(crt); - } - return lst; +liste liste_extraire(liste lst, int val) { + element *prec = lst; + element *crt = lst; + // boucle pour placer <val>: prec->n < val <= crt->n + // à compléter + + // liste non-vide et <val> présente de la liste + if (NULL != crt && val == crt->n) { + if (crt == prec) { // extraction en début de liste + lst = lst->suivant; + } else { // extraction en milieu ou fin de liste + prec->suivant = crt->suivant; + } + free(crt); + } + return lst; } // Retourne un pointeur sur l'élément qui contient <val> ou un pointeur nul // si la liste est vide ou la valeur absente -element* liste_recherche(liste lst,int val) { - // à compléter - return NULL; +element *liste_recherche(liste lst, int val) { + // à compléter + return NULL; } -// Imprime le contenu de la liste +// Imprime le contenu de la liste void print(liste lst) { - //à compléter + //à compléter } -int main(int argc, char** argv) { - liste lst = liste_creer(); - char str[20]; - do { - printf("Insert: "); - scanf("%s", str); - if (0 == strcmp("quit",str)) break; - lst = liste_inserer(lst,atoi(str)); - print(lst); - printf("\n"); - } while (true); - do { - printf("Extract: "); - scanf("%s", str); - if (0 == strcmp("quit",str)) break; - lst = liste_extraire(lst,atoi(str)); - print(lst); - printf("\n"); - } while (true); - return 0; +int main(int argc, char **argv) { + liste lst = liste_creer(); + char str[20]; + do { + printf("Insert: "); + scanf("%s", str); + if (0 == strcmp("quit", str)) + break; + lst = liste_inserer(lst, atoi(str)); + print(lst); + printf("\n"); + } while (true); + do { + printf("Extract: "); + scanf("%s", str); + if (0 == strcmp("quit", str)) + break; + lst = liste_extraire(lst, atoi(str)); + print(lst); + printf("\n"); + } while (true); + return 0; }