diff --git a/TP4/.gitignore b/TP4/.gitignore new file mode 100644 index 0000000..fbdcb9a --- /dev/null +++ b/TP4/.gitignore @@ -0,0 +1,3 @@ +listeNonTriees +listeTriees +listeTrieesFichier diff --git a/TP4/Makefile b/TP4/Makefile new file mode 100644 index 0000000..a216135 --- /dev/null +++ b/TP4/Makefile @@ -0,0 +1,9 @@ +all: $(patsubst %.c,%,$(shell ls *.c)) + +%: %.c + clang -Wall -Wextra $< -o $@ + +.PHONY: all clean + +clean: + rm *.exe diff --git a/TP4/entree.txt b/TP4/entree.txt new file mode 100644 index 0000000..c7e894a --- /dev/null +++ b/TP4/entree.txt @@ -0,0 +1,17 @@ +41 +3 +29 +23 +37 +5 +59 +31 +17 +53 +11 +7 +43 +13 +19 +47 +2 diff --git a/TP4/listeNonTriees.c b/TP4/listeNonTriees.c new file mode 100644 index 0000000..ae3effa --- /dev/null +++ b/TP4/listeNonTriees.c @@ -0,0 +1,92 @@ +#include +#include +#include + +// 2.1.1 +struct Cellule { + struct Cellule* suiv; + int val; +}; +typedef struct Cellule Cellule; + +// 2.1.2 +Cellule* init_cellule(int val) { + Cellule* l; + l = malloc(sizeof(Cellule)); + l->suiv = NULL; + l->val = val; + return l; +} + +void ajout_tete(Cellule** l, int val) { + Cellule* p; + p = malloc(sizeof(Cellule)); + p->val = val; + p->suiv = *l; + *l = p; +} + +// 2.1.3 +void imprimer(Cellule* l) { + if (l == NULL) { + return; + } + while (l->suiv != NULL) { + printf("%d\n", l->val); + l = l->suiv; + } + printf("%d\n", l->val); +} + +// 2.1.4 +bool est_trie(Cellule* l) { + if (l == NULL) { + return true; + } + int temp; + while (l->suiv != NULL) { + temp = l->val; + l = l->suiv; + if (l->val < temp) { + return false; + } + } + return true; +} + +// 2.1.5 +void supprimer_tete(Cellule** l) { + Cellule* p; + p = (*l)->suiv; + free(*l); + *l = p; +} + +// 2.1.6 +void desallouer(Cellule** l) { + if (l == NULL) { + return; + } + desallouer(&(*l)->suiv); + free(*l); +} + +void desallouer2(Cellule** l) { + while ((*l)->suiv != NULL) { + supprimer_tete(l); + } + free(*l); +} + +int main() { + + // 2.1.7 + Cellule* l = init_cellule(42); + ajout_tete(&l, 43); + ajout_tete(&l, 40); + imprimer(l); + printf("Est triée : %d\n", est_trie(l)); + supprimer_tete(&l); + imprimer(l); + desallouer2(&l); +} diff --git a/TP4/listeTriees.c b/TP4/listeTriees.c new file mode 100644 index 0000000..0a71cb7 --- /dev/null +++ b/TP4/listeTriees.c @@ -0,0 +1,123 @@ +#include +#include +#include + +struct Cellule { + struct Cellule* suiv; + int val; +}; +typedef struct Cellule Cellule; + +Cellule* init_cellule(int val) { + Cellule* l; + l = malloc(sizeof(Cellule)); + l->suiv = NULL; + l->val = val; + return l; +} + +void ajout_tete(Cellule** l, int val) { + Cellule* p; + p = malloc(sizeof(Cellule)); + p->val = val; + p->suiv = *l; + *l = p; +} + +void imprimer(Cellule* l) { + if (l == NULL) { + return; + } + while (l->suiv != NULL) { + printf("%d\n", l->val); + l = l->suiv; + } + printf("%d\n", l->val); +} + +bool est_trie(Cellule* l) { + if (l == NULL) { + return true; + } + int temp; + while (l->suiv != NULL) { + temp = l->val; + l = l->suiv; + if (l->val < temp) { + return false; + } + } + return true; +} + +void supprimer_tete(Cellule** l) { + Cellule* p; + p = (*l)->suiv; + free(*l); + *l = p; +} + +void desallouer(Cellule** l) { + while ((*l)->suiv != NULL) { + supprimer_tete(l); + } + free(*l); +} + +// 2.2.1 +void inserer(Cellule** p, int val) { + Cellule* l = *p; + if (l == NULL) { + l = init_cellule(val); + return; + } + while (l->suiv != NULL && l->val < val) { + p = &l->suiv; + l = l->suiv; + } + if (l->val == val) { + return; + } + if (l->suiv == NULL) { + l->suiv = init_cellule(val); + } else { + ajout_tete(p, val); + } +} + +int main() { + // Création de la liste + Cellule* l = init_cellule(59); + ajout_tete(&l, 53); + ajout_tete(&l, 47); + ajout_tete(&l, 43); + ajout_tete(&l, 41); + ajout_tete(&l, 37); + ajout_tete(&l, 31); + ajout_tete(&l, 29); + ajout_tete(&l, 23); + ajout_tete(&l, 19); + ajout_tete(&l, 17); + ajout_tete(&l, 13); + ajout_tete(&l, 11); + ajout_tete(&l, 7); + ajout_tete(&l, 5); + ajout_tete(&l, 3); + ajout_tete(&l, 2); + if (!est_trie(l)) { + printf("C'est pas trié !\n"); + } + + // Test début, millieu et fin + inserer(&l, 0); + inserer(&l, 30); + inserer(&l, 70); + // Test redondance début, millieu et fin + inserer(&l, 2); + inserer(&l, 7); + inserer(&l, 59); + + imprimer(l); + + desallouer(&l); +} diff --git a/TP4/listeTrieesFichier.c b/TP4/listeTrieesFichier.c new file mode 100644 index 0000000..bec5f31 --- /dev/null +++ b/TP4/listeTrieesFichier.c @@ -0,0 +1,107 @@ +#include +#include +#include + +struct Cellule { + struct Cellule* suiv; + int val; +}; +typedef struct Cellule Cellule; + +Cellule* init_cellule(int val) { + Cellule* l; + l = malloc(sizeof(Cellule)); + l->suiv = NULL; + l->val = val; + return l; +} + +void ajout_tete(Cellule** l, int val) { + Cellule* p; + p = malloc(sizeof(Cellule)); + p->val = val; + p->suiv = *l; + *l = p; +} + +void imprimer(Cellule* l) { + if (l == NULL) { + return; + } + while (l->suiv != NULL) { + printf("%d\n", l->val); + l = l->suiv; + } + printf("%d\n", l->val); +} + +bool est_trie(Cellule* l) { + if (l == NULL) { + return true; + } + int temp; + while (l->suiv != NULL) { + temp = l->val; + l = l->suiv; + if (l->val < temp) { + return false; + } + } + return true; +} + +void supprimer_tete(Cellule** l) { + Cellule* p; + p = (*l)->suiv; + free(*l); + *l = p; +} + +void desallouer(Cellule** l) { + while ((*l)->suiv != NULL) { + supprimer_tete(l); + } + free(*l); +} + +void inserer(Cellule** p, int val) { + Cellule* l = *p; + if (l == NULL) { + l = init_cellule(val); + return; + } + while (l->suiv != NULL && l->val < val) { + p = &l->suiv; + l = l->suiv; + } + if (l->val == val) { + return; + } + if (l->suiv == NULL) { + l->suiv = init_cellule(val); + } else { + ajout_tete(p, val); + } +} + +int main(int argc, char* argv[]) { + if (argc != 2) { + printf("Usage : %s FICHIER_ENTREE\n", argv[0]); + return EXIT_FAILURE; + } + + FILE* fp; + fp = fopen(argv[1], "r"); + if (fp == NULL) { + printf("Impossible d'ouvrir le fichier %s.\n", argv[1]); + return EXIT_FAILURE; + } + + Cellule* l = init_cellule(42); + int val; + while (fscanf(fp, "%d", &val) != EOF) { + inserer(&l, val); + } + + imprimer(l); +}