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 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396
|
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
//structure de données pour les instructions
typedef struct s_instruction
{
int cle;
char *valeur;
}instruction;
//les instructions sont contenus dans une liste
typedef struct s_liste_instruction
{
instruction *p_instruction;
int nbre_instruction; //compteur du nombre d'instruction...
}liste_instruction;
//mon constructeur doit me retourner une liste de listes d'instructions (voir l'exemple donné)
typedef struct s_liste_liste_instruction
{
liste_instruction *p_liste_instruction;
int nbre_liste_instruction; //compteur du nombre de liste d'instructions
}liste_liste_instruction;
//spécifications
//initialise une instruction simple avec sa clé et sa valeur
instruction initialise_instruction(int, char*);
//liberer une liste d'instruction
void liberer_liste_instruction(liste_instruction*);
//liberer une liste de liste d'instruction
void liberer_liste_liste_instruction(liste_liste_instruction*);
//affiche une instruction
void affiche_instruction(instruction);
//affiche une liste d'instructions
void affiche_liste_instruction(liste_instruction*);
//affiche une liste de liste d'instructions
void affiche_liste_liste_instruction(liste_liste_instruction*);
//ajouter une instrction à une liste d'instruction
void *ajouter_instruction_liste_instruction(liste_instruction*, instruction);
//ajouter une liste d'instrction à une liste de liste d'instruction
void *ajouter_liste_instruction_liste_liste_instruction(liste_liste_instruction*, liste_instruction*);
//initialiser une liste d'instructions
liste_instruction *initialiser_liste_instruction(void);
//convertis une instruction en instruction clé
instruction convertisseur(instruction, int);
//initialiser une liste de liste d'instructions
liste_liste_instruction *initialiser_liste_liste_instruction(void);
//mon constructeur de liste de liste d'instructions
//prend en entrée une liste de liste d'instructions vide, et fournira la liste finale en sortie
//prend en entrée la liste de liste d'instruction que j'utilise pour construire la liste de liste d'instructions finale
//prend en entrée un entier (clé), qui me permettra à la fin si je veux de donner la position de chaque instruction dans la liste
//prend en entrée un entier (la longueur de simulation) pour limiter la taille de chaque liste de ma liste de listes d'instructions
void *contructeur(liste_liste_instruction*, liste_liste_instruction*, int, int);
//retourne une nouvelle liste de liste d'instructions,
//lorsq'on a enlever la premiere instruction d'ne liste de la liste des listes
liste_liste_instruction *nouvelle_liste_liste_instruction(liste_liste_instruction*, liste_instruction*);
//retourne une nouvelle liste en éliminant le premier élément
liste_instruction *nouvelle_liste(liste_instruction*);
//retourne une liste de listes d'instruction en nelevant une liste d'instrctions données
void *enlever_liste_liste_liste_instruction(liste_liste_instruction*, liste_instruction*);
//ajouter une liste de liste d'instruction a une liste de liste d'instructions
void *ajouter_liste_liste_instruction_liste_liste_instruction(liste_liste_instruction*, liste_liste_instruction*);
//implémentation
//convertis une instruction en instruction clé
instruction convertisseur(instruction ins, int r)
{
instruction instruc;
instruc.cle = r;
instruc.valeur = ins.valeur;
return instruc;
}
//initialise une instruction avec sa clé et sa valeur
instruction initialise_instruction(int cle, char *valeur)
{
instruction instr;
instr.cle = cle;
instr.valeur = valeur;
return instr;
}
//initialiser une liste d'instructions
liste_instruction *initialiser_liste_instruction()
{
liste_instruction *li = (liste_instruction*)malloc(sizeof(liste_instruction));
if(li == NULL)
{
printf("initialisation d'une liste d'instruction impossible");
}
else
{
li->nbre_instruction = 0;
li->p_instruction = NULL;
}
return li;
}
//initialiser une liste de liste d'instructions
liste_liste_instruction *initialiser_liste_liste_instruction()
{
liste_liste_instruction *lli = (liste_liste_instruction*)malloc(sizeof(liste_liste_instruction));
if(lli == NULL)
{
printf("initialisation d'une liste de liste d'instruction impossible");
}
else
{
lli->nbre_liste_instruction = 0;
lli->p_liste_instruction = NULL;
}
return lli;
}
//ajouter une instrction à une liste d'instruction
void *ajouter_instruction_liste_instruction(liste_instruction *li, instruction ins)
{
instruction *l = (instruction*)realloc(li->p_instruction, (li->nbre_instruction +1)*sizeof(instruction));
if(l!=NULL)
{
li->p_instruction = l;
l[li->nbre_instruction] = ins;
li->nbre_instruction++;
}
else
{
printf("ajout d'une instruction à une liste d'instruction impossible");
}
return l;
}
//ajouter une liste d'instrction à une liste de liste d'instruction
void *ajouter_liste_instruction_liste_liste_instruction(liste_liste_instruction *lli, liste_instruction *li)
{
liste_instruction *l = (liste_instruction*)realloc(lli->p_liste_instruction, (lli->nbre_liste_instruction +1)*sizeof(liste_instruction));
if(l!=NULL)
{
lli->p_liste_instruction = l;
l[lli->nbre_liste_instruction] = *li;
lli->nbre_liste_instruction++;
}
else
{
printf("ajout d'une liste_instruction à une liste de liste d'instruction impossible");
}
return l;
}
//ajouter une liste de liste d'instruction a une liste de liste d'instructions
void *ajouter_liste_liste_instruction_liste_liste_instruction(liste_liste_instruction *ll1, liste_liste_instruction *ll2)
{
int i;
for(i=0; i<ll2->nbre_liste_instruction; i++)
{
ajouter_liste_instruction_liste_liste_instruction(ll1, &ll2->p_liste_instruction[i]);
}
return ll1;
}
//liberer une liste d'instruction
void liberer_liste_instruction(liste_instruction *li)
{
if(li != NULL)
{
free(li->p_instruction);
free(li);
}
}
//liberer une liste de liste d'instruction
void liberer_liste_liste_instruction(liste_liste_instruction *lli)
{
if(lli != NULL)
{
free(lli->p_liste_instruction);
free(lli);
}
}
//affiche une liste d'instructions
void affiche_liste_instruction(liste_instruction *linstr)
{
int i;
if(linstr != NULL)
{
for(i=0; i<linstr->nbre_instruction; i++)
{
affiche_instruction(linstr->p_instruction[i]);
}
}
else
{
printf("impossible d'afficher une liste sans éléments");
}
}
//affiche une liste de liste d'instructions
void affiche_liste_liste_instruction(liste_liste_instruction *llinstr)
{
int i,j;
if(llinstr != NULL)
{
for(i=0; i<llinstr->nbre_liste_instruction; i++)
{
for(j=0; j<llinstr->p_liste_instruction[i].nbre_instruction; j++)
{
//affiche_liste_instruction(llinstr->p_liste_instruction[i].p_instruction);
affiche_instruction(llinstr->p_liste_instruction[i].p_instruction[j]);
}
printf("\t");
}
}
else
{
printf("impossible d'afficher une liste de liste sans éléments");
}
}
//affiche une instruction
void affiche_instruction(instruction instr)
{
printf(instr.valeur);
}
//mon constructeur de liste de liste d'instructions
//prend en entrée/sortie la liste de liste d'instructions
//prend en entrée la liste d'instruction que j'utilise pour construire la liste de liste d'instructions
//prend en entrée un entier (clé), qui me permettra à la fin si je veux de donner la position de chaque instruction dans la liste
//prend en entrée un entier (la longueur de simulation) pour limiter la taille de chaque liste de ma liste de listes d'instructions
//la lfli (liste finale des listes d'instructions est initialisée à vide au début
//lli est la liste des listes d'instruction sur laquelle on va travailler
//r est initialisé à 0,et s'incrémente chaque fois qu'on ajoute une instruction à une liste
//d est initialisé sur la longeur max des listes q'on veut obtenir (ici 5, d'après l'exemple). On le décrémente donc chaque fois
//qu'on ajoute une instruction
void *contructeur(liste_liste_instruction *lfli, liste_liste_instruction *lli, int r, int d)
{
int k;
for(k=0; k<lli->nbre_liste_instruction; k++)
{
if(lli->p_liste_instruction[k].nbre_instruction == 0)
{
enlever_liste_liste_liste_instruction(lli, &lli->p_liste_instruction[k]);
}
}
if(d == 0)
{
return lfli;
}
else
{
liste_liste_instruction *llaux = initialiser_liste_liste_instruction();
int i;
for(i=0; i<lli->nbre_liste_instruction; i++)
{
liste_liste_instruction *llinter = initialiser_liste_liste_instruction();
liste_instruction *l1 = initialiser_liste_instruction();
instruction ins = convertisseur(lli->p_liste_instruction[i].p_instruction[0],r);
ajouter_instruction_liste_instruction(l1, ins);
ajouter_liste_instruction_liste_liste_instruction(llinter, l1);
contructeur(llinter, nouvelle_liste_liste_instruction(lli, &lli->p_liste_instruction[i]), r+1, d-1);
ajouter_liste_liste_instruction_liste_liste_instruction(llaux, llinter);
}
ajouter_liste_liste_instruction_liste_liste_instruction(lfli, llaux);
return lfli;
}
}
//retourne une nouvelle liste de liste d'instructions,
//lorsq'on a enlever la premiere instruction d'ne liste de la liste des listes
liste_liste_instruction *nouvelle_liste_liste_instruction(liste_liste_instruction *lli, liste_instruction *li)
{
if(li->nbre_instruction == 0)
{
enlever_liste_liste_liste_instruction(lli, li);
return lli;
}
else
{
int i;
for(i=0; i<lli->nbre_liste_instruction; i++)
{
if(lli->p_liste_instruction[i].p_instruction == li->p_instruction)
{
liste_instruction *linter = initialiser_liste_instruction();
linter = nouvelle_liste(li);
lli->p_liste_instruction[i] = *linter;
}
}
return lli;
}
}
//retourne une nouvelle liste en éliminant la première instrction de la liste
liste_instruction *nouvelle_liste(liste_instruction *li)
{
liste_instruction *l = initialiser_liste_instruction();
int i;
for(i=0; i<li->nbre_instruction - 1; i++)
{
ajouter_instruction_liste_instruction(l,li->p_instruction[i+1]);
}
return l;
}
//retourne une liste de listes d'instruction en nelevant une liste d'instrctions données
void *enlever_liste_liste_liste_instruction(liste_liste_instruction *lli, liste_instruction *li)
{
int i = 0;
while(lli->p_liste_instruction[i].p_instruction != li->p_instruction)
{
i++;
}
for(int j=i; j<lli->nbre_liste_instruction; j++)
{
lli->p_liste_instruction[j] = lli->p_liste_instruction[j+1];
}
lli->nbre_liste_instruction--;
return lli;
}
//fonction principale
int main()
{
instruction ins1 = initialise_instruction(0,"a");
instruction ins2 = initialise_instruction(0,"b");
instruction ins3 = initialise_instruction(0,"c");
instruction ins4 = initialise_instruction(0,"d");
instruction ins5 = initialise_instruction(0,"e");
liste_instruction *li1 = initialiser_liste_instruction();
ajouter_instruction_liste_instruction(li1, ins1);
ajouter_instruction_liste_instruction(li1, ins2);
ajouter_instruction_liste_instruction(li1, ins3);
liste_instruction *li2 = initialiser_liste_instruction();
ajouter_instruction_liste_instruction(li2, ins4);
ajouter_instruction_liste_instruction(li2, ins5);
printf("\n la première liste d'instruction est \n");
affiche_liste_instruction(li1);
printf("\n la deuxième liste d'instruction est \n");
affiche_liste_instruction(li2);
liste_liste_instruction *lli = initialiser_liste_liste_instruction();
ajouter_liste_instruction_liste_liste_instruction(lli, li1);
ajouter_liste_instruction_liste_liste_instruction(lli, li2);
printf("\n la liste de listes d'instructions initiale (lli) est \n");
affiche_liste_liste_instruction(lli);
/*printf("\n la nouvelle liste de la première liste d'instruction est \n");
affiche_liste_instruction(nouvelle_liste(li1));
printf("\n la nouvelle nouvelle liste de la première liste d'instruction est \n");
affiche_liste_instruction(nouvelle_liste(nouvelle_liste(li1)));*/
//enlever_liste_liste_liste_instruction(lli,li2);
//printf("\n la nouvelle liste de listes d'instructions initiale (lli) après enleve li2 est \n");
//printf("\n la nouvelle liste de listes d'instructions initiale (lli) portant sur la première liste est \n");
//affiche_liste_liste_instruction(nouvelle_liste_liste_instruction(lli, li1));
printf("\n initialisation de la liste finale de la liste de listes d'instructions qu'on veut obtenir \n");
liste_liste_instruction *lfli = initialiser_liste_liste_instruction();
printf("\n appel du constructeur \n");
contructeur(lfli, lli, 0, 5);
printf("\n la liste finale possède %d listes \n", lfli->nbre_liste_instruction);
printf("\n les listes de la liste finale sont \n");
affiche_liste_liste_instruction(lfli);
printf("\n");
liberer_liste_instruction(li1);
liberer_liste_instruction(li2);
liberer_liste_liste_instruction(lli);
liberer_liste_liste_instruction(lfli);
} |
Partager