-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoutils.c
146 lines (116 loc) · 3.2 KB
/
outils.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <stdlib.h>
#include <time.h>
#include "outils.h"
float* MEMOIRE_TRI;
Uint8* MEMOIRE_TRI_2;
Int ALEATOIRE;
void echanger(Coup* tab, int i, int j)
{
Coup temp = tab[i];
tab[i] = tab[j];
tab[j] = temp;
}
char init_outils()
{
MEMOIRE_TRI = malloc(sizeof(float) * (NB_MAX_COUPS_POSSIBlES + 1));
MEMOIRE_TRI_2 = malloc(sizeof(Uint8) * (NB_MAX_COUPS_POSSIBlES + 1));
ALEATOIRE = 1000 * clock();
return (MEMOIRE_TRI != NULL && MEMOIRE_TRI_2 != NULL);
}
void free_outils()
{
free(MEMOIRE_TRI);
free(MEMOIRE_TRI_2);
}
void maj_aleat()
{
Int big_premier = (Int) BIG_PREMIER;
ALEATOIRE = (ALEATOIRE * ALEATOIRE + 1) % big_premier;
}
float nb_aleat(float b_inf, float b_sup)
{
/*
renvoie un nombre aleatoire compris entre 'b_inf' et 'b_sup'
*/
Int big_premier = (Int) BIG_PREMIER;
maj_aleat();
return b_inf + (b_sup - b_inf) * (((float) ALEATOIRE) / big_premier);
}
char bit_aleat()
{
/*les bonnes proprietes statistiques de cette fonction ont ete verifiees*/
maj_aleat();
return ALEATOIRE & 1;
}
char allouer_noeud(Noeud* a_allouer, int taille)
{
int i;
a_allouer->liste_coups = malloc(sizeof(Uint8) * (taille + 1));
a_allouer->liste_fils = malloc(sizeof(Noeud) * taille);
if (a_allouer->liste_coups == NULL || a_allouer->liste_fils == NULL) return FAILURE;
for (i = 0; i < taille; i++) {
a_allouer->liste_fils[i].profondeur = -1;
a_allouer->liste_coups[i] = i;
}
a_allouer->liste_coups[taille] = FIN_LISTE_COUPS;
a_allouer->profondeur = 0;
return SUCCESS;
}
void liberer_arbre(Noeud* pere)
{
int i;
if (pere->profondeur < 0) return;
//les deux conditions des for devraient etre equivalentes grace a la ligne ci dessus...
for (i = 0; pere->liste_coups[i] != FIN_LISTE_COUPS; i++) {//for (i = 0; i < pere->profondeur; i++) {
liberer_arbre(pere->liste_fils + i); //pere->liste_coups[i] != FIN_LISTE_COUPS &&
}
if (pere->profondeur >= 0) {
free(pere->liste_coups);
free(pere->liste_fils);
}
pere->profondeur = -1;
}
void tri_fusion(float* tab, int taille, Uint8* a_modif)
{
/*
trie tab par ordre decroissant
les elements de a_modif sont modifies en parallele, mais n'ont aucune influence sur le tri
*/
int a = 0, b = 0, i = 0, dim, dim2;
Uint8 *tab_bis2;
float *tab_bis;
if (taille < 2) return;
dim = taille >> 1; dim2 = taille - dim;
tab_bis = tab + dim;
tab_bis2 = a_modif + dim;
tri_fusion(tab, dim, a_modif);
tri_fusion(tab + dim, dim2, tab_bis2);
while (a < dim && b < dim2)
{
if (tab[a] < tab_bis[b])
{
MEMOIRE_TRI[i] = tab_bis[b];
MEMOIRE_TRI_2[i++] = tab_bis2[b++];
}
else
{
MEMOIRE_TRI_2[i] = a_modif[a];
MEMOIRE_TRI[i++] = tab[a++];
}
}
while (a < dim)
{
MEMOIRE_TRI_2[i] = a_modif[a];
MEMOIRE_TRI[i++] = tab[a++];
}
while (b < dim2)
{
MEMOIRE_TRI_2[i] = tab_bis2[b];
MEMOIRE_TRI[i++] = tab_bis[b++];
}
for (i = 0; i < taille; i++)
{
a_modif[i] = MEMOIRE_TRI_2[i];
tab[i] = MEMOIRE_TRI[i];
}
}