Compare commits

...

2 commits

Author SHA1 Message Date
Geoffrey Frogeye 5dbf29e0cd TP4 Réorganisation 2017-03-14 11:20:11 +01:00
Geoffrey Frogeye 7e86d5ff5b TP4 Corrections 2017-03-14 10:58:40 +01:00
6 changed files with 191 additions and 340 deletions

4
TP4/.gitignore vendored
View file

@ -1,3 +1 @@
listeNonTriees
listeTriees
listeTrieesFichier
questions

View file

@ -1,17 +1,34 @@
41
3
29
23
37
5
59
31
17
53
11
7
43
13
19
47
2
5
-3
-37
-41
-2
-47
59
47
-59
-11
-31
43
-53
41
53
-43
31
-7
-13
3
-5
-19
7
-23
19
11
-17
37
17
23
29
-29

View file

@ -1,92 +0,0 @@
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
// 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);
}

View file

@ -1,123 +0,0 @@
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
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);
}

View file

@ -1,107 +0,0 @@
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
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);
}

158
TP4/questions.c Normal file
View file

@ -0,0 +1,158 @@
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
// 2.1.1
struct Cellule {
struct Cellule* suiv;
int val;
};
typedef struct Cellule Cellule;
// 2.1.2
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) {
while (l != NULL) {
printf("%d\n", l->val);
l = l->suiv;
}
}
// 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
// Méthode itérative
void desallouer(Cellule** l) {
Cellule* next;
Cellule* current = *l;
while (current != NULL) {
next = current->suiv;
free(current);
current = next;
}
}
// Méthode itérative, réutilise supprimer_tete
void desallouer2(Cellule** l) {
if (*l == NULL) {
return;
}
while ((*l)->suiv != NULL) {
supprimer_tete(l);
}
free(*l);
}
// Méthode réccursive
void desallouer3(Cellule** l) {
if (*l == NULL) {
return;
}
desallouer(&(*l)->suiv);
free(*l);
}
// 2.2.1
void inserer(Cellule** p, int val) {
Cellule* l = *p;
if (l == NULL) {
ajout_tete(p, val);
return;
}
while (l->suiv != NULL && l->val < val) {
p = &l->suiv;
l = l->suiv;
}
if (l->val == val) {
return;
} else if (l->val < val) {
p = &l->suiv;
}
ajout_tete(p, val);
}
// 2.2.2
Cellule* lire_fichier(FILE * fp) {
Cellule* l = NULL;
int val;
while (fscanf(fp, "%d", &val) != EOF) {
inserer(&l, val);
}
return l;
}
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("Mode test de la partie 2.1.\n");
printf("(pour tester la partie 2.2, utilisez : %s FICHIER_ENTREE)\n", argv[0]);
// 2.1.7
Cellule* l = NULL;
ajout_tete(&l, 42);
ajout_tete(&l, 40);
ajout_tete(&l, 43);
imprimer(l);
printf("Est triée : %d\n", est_trie(l));
supprimer_tete(&l);
imprimer(l);
printf("Est triée : %d\n", est_trie(l));
desallouer(&l);
} else {
printf("Mode test de la partie 2.2.\n");
printf("(pour tester la partie 2.1, utilisez : %s)\n", argv[0]);
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 = lire_fichier(fp);
fclose(fp);
imprimer(l);
if (est_trie(l)) {
printf("La liste est correctement triée.\n");
} else {
printf("Erreur: La liste n'est pas correctement triée.\n");
return EXIT_FAILURE;
}
desallouer(&l);
}
return EXIT_SUCCESS;
}