Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Nadi Tomeh
SDA
Commits
bbb8c671
Commit
bbb8c671
authored
Nov 20, 2021
by
Barbier
Browse files
Version 2
parent
3b4dc716
Pipeline
#4654
passed with stage
in 6 seconds
Changes
3
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
C/arraylist.c
deleted
100644 → 0
View file @
3b4dc716
#include "arraylist.h"
#include<stdio.h>
#include<stdlib.h>
arraylist_t
*
arraylist_create
(){
arraylist_t
*
res
=
(
arraylist_t
*
)
malloc
(
sizeof
(
arraylist_t
)
);
res
->
data
=
(
int
*
)
malloc
(
sizeof
(
int
)
*
4
);
res
->
capacity
=
4
;
res
->
size
=
0
;
return
res
;
}
void
arraylist_destroy
(
arraylist_t
*
a
){
if
(
a
!=
NULL
){
if
(
a
->
data
!=
NULL
)
free
(
a
->
data
);
free
(
a
);
}
}
char
arraylist_append
(
arraylist_t
*
a
,
int
x
){
char
memory_allocation
=
FALSE
;
if
(
a
!=
NULL
){
if
(
arraylist_do_we_need_to_enlarge_capacity
(
a
)
){
memory_allocation
=
TRUE
;
arraylist_enlarge_capacity
(
a
);
}
a
->
data
[
a
->
size
++
]
=
x
;
}
return
memory_allocation
;
}
char
arraylist_pop_back
(
arraylist_t
*
a
){
char
memory_reduction
=
FALSE
;
if
(
a
!=
NULL
&&
a
->
size
>
0
){
if
(
arraylist_do_we_need_to_reduce_capacity
(
a
)
){
memory_reduction
=
TRUE
;
arraylist_reduce_capacity
(
a
);
}
a
->
size
--
;
}
return
memory_reduction
;
}
int
arraylist_get
(
arraylist_t
*
a
,
int
pos
){
if
(
a
!=
NULL
&&
pos
>
0
&&
pos
<
a
->
size
){
return
a
->
data
[
pos
];
}
printf
(
"Wrong parameter pos=%d or NULL list"
,
pos
);
return
-
1
;
}
size_t
arraylist_size
(
arraylist_t
*
a
){
return
(
a
!=
NULL
)
?
a
->
size
:
-
1
;
}
size_t
arraylist_capacity
(
arraylist_t
*
a
){
return
(
a
!=
NULL
)
?
a
->
capacity
:
-
1
;
}
char
arraylist_do_we_need_to_enlarge_capacity
(
arraylist_t
*
a
){
return
a
->
size
==
a
->
capacity
?
TRUE
:
FALSE
;
}
void
arraylist_enlarge_capacity
(
arraylist_t
*
a
){
a
->
capacity
*=
2
;
a
->
data
=
(
int
*
)
realloc
(
a
->
data
,
sizeof
(
int
)
*
a
->
capacity
);
}
char
arraylist_do_we_need_to_reduce_capacity
(
arraylist_t
*
a
){
return
(
a
->
size
<=
a
->
capacity
/
4
&&
a
->
size
>
4
)
?
TRUE
:
FALSE
;
}
void
arraylist_reduce_capacity
(
arraylist_t
*
a
){
a
->
capacity
/=
2
;
a
->
data
=
(
int
*
)
realloc
(
a
->
data
,
sizeof
(
int
)
*
a
->
capacity
);
}
C/arraylist.h
deleted
100644 → 0
View file @
3b4dc716
#ifndef __ARRAYLIST_H
#define __ARRAYLIST_H
#define FALSE 0
#define TRUE 1
#include <stddef.h>
/**
Tableau dynamique d'entiers.
*/
typedef
struct
arraylist_s
{
// Pointeur vers la zone de mémoire où les entiers seront stockées.
int
*
data
;
// Taille réelle, ou capacité de stockage, du tableau.
size_t
capacity
;
// Nombre d'éléments stockés dans le tableau.
size_t
size
;
}
arraylist_t
;
/**
Fonction d'initialisation d'un tableau dynamique.
Complexité en temps/espace, pire et meilleur cas : O(1)
@return Un pointeur sur un tableau dynamique nouvellement alloué.
*/
arraylist_t
*
arraylist_create
();
/**
Fonction de libération de la mémoire occupée par un tableau dynamique.
Complexité en temps/espace, pire et meilleur cas : O(1)
@param a est un pointeur vers l'espace mémoire que la fonction va libérer.
*/
void
arraylist_destroy
(
arraylist_t
*
a
);
/**
Ajoute une valeur dans le tableau.
Complexité en temps/espace, pire cas : O(size)
Complexité en temps/espace, meilleur cas : O(1)
Complexité amortie : O(1)
@param a est le tableau auquel on souhaite ajouter une valeur.
@param x est la valeur que l'on souhaite ajouter.
@returns VRAI si le tableau a été agrandit, FAUX sinon
*/
char
arraylist_append
(
arraylist_t
*
a
,
int
x
);
/**
Supprime la dernière valeur du tableau.
Complexité en temps, pire cas : O(size)
Complexité en temps, meilleur cas : O(1)
Complexité amortie : O(1)
@param a est le tableau auquel on souhaite ajouter une valeur.
@returns VRAI si le tableau a été réduit, FAUX sinon
*/
char
arraylist_pop_back
(
arraylist_t
*
a
);
/**
Renvoie la valeur située à la position donnée par l'utilisateur.
Complexité en temps/espace, pire cas : O(1)
@param a est un pointeur vers un tableau.
@param pos est la l'indice de la case on l'utilisateur veut connaître la valeur.
@returns la valeur située à la position donnée par l'utilisateur.
*/
int
arraylist_get
(
arraylist_t
*
a
,
int
pos
);
/**
Renvoie le nombre d'éléments stockés dans le tableau.
Complexité en temps/espace, pire cas : O(1)
@param a est un pointeur vers un tableau.
@returns le nombre d'éléments stockés dans le tableau.
*/
size_t
arraylist_size
(
arraylist_t
*
a
);
/**
Renvoie la capacité de stockage du tableau.
Complexité en temps/espace, pire cas : O(1)
@param a est un pointeur vers un tableau.
@returns la capacité de stockage du tableau.
*/
size_t
arraylist_capacity
(
arraylist_t
*
a
);
/**
Cette fonction détermine la règle selon laquelle un espace mémoire plus grand sera alloué ou non.
@param a est un pointeur vers un tableau.
@returns VRAI si le tableau doit être agrandi, FAUX sinon.
*/
char
arraylist_do_we_need_to_enlarge_capacity
(
arraylist_t
*
a
);
/**
Cette fonction augmente la capacité du tableau.
@param a est un pointeur vers un tableau.
*/
void
arraylist_enlarge_capacity
(
arraylist_t
*
a
);
/**
Cette fonction détermine la règle selon laquelle un espace mémoire plus petit sera alloué ou non.
@param a est un pointeur vers un tableau.
@returns VRAI si le tableau doit être réduit, FAUX sinon.
*/
char
arraylist_do_we_need_to_reduce_capacity
(
arraylist_t
*
a
);
/**
Cette fonction réduit la capacité du tableau.
@param a est un pointeur vers un tableau.
*/
void
arraylist_reduce_capacity
(
arraylist_t
*
a
);
#endif
C/main.c
deleted
100644 → 0
View file @
3b4dc716
#include<stdio.h>
#include <time.h>
#include<stdlib.h>
#include "arraylist.h"
#include "analyzer.h"
int
main
(
int
argc
,
char
**
argv
){
int
i
;
// Tableau dynamique.
arraylist_t
*
a
=
arraylist_create
();
// Analyse du temps pris par les opérations.
analyzer_t
*
time_analysis
=
analyzer_create
();
// Analyse du nombre de copies faites par les opérations.
analyzer_t
*
copy_analysis
=
analyzer_create
();
// Analyse de l'espace mémoire inutilisé.
analyzer_t
*
memory_analysis
=
analyzer_create
();
// Mesure de la durée d'une opération.
struct
timespec
before
,
after
;
clockid_t
clk_id
=
CLOCK_REALTIME
;
// utilisé comme booléen pour savoir si une allocation a été effectuée.
char
memory_allocation
;
for
(
i
=
0
;
i
<
1000000
;
i
++
){
// Ajout d'un élément et mesure du temps pris par l'opération.
clock_gettime
(
clk_id
,
&
before
);
memory_allocation
=
arraylist_append
(
a
,
i
);
clock_gettime
(
clk_id
,
&
after
);
// Enregistrement du temps pris par l'opération
analyzer_append
(
time_analysis
,
after
.
tv_nsec
-
before
.
tv_nsec
);
// Enregistrement du nombre de copies efféctuées par l'opération.
// S'il y a eu réallocation de mémoire, il a fallu recopier tout le tableau.
analyzer_append
(
copy_analysis
,
(
memory_allocation
)
?
i
:
1
);
// Enregistrement de l'espace mémoire non-utilisé.
analyzer_append
(
memory_analysis
,
arraylist_capacity
(
a
)
-
arraylist_size
(
a
));
}
// Affichage de quelques statistiques sur l'expérience.
fprintf
(
stderr
,
"Total cost: %Lf
\n
"
,
get_total_cost
(
time_analysis
));
fprintf
(
stderr
,
"Average cost: %Lf
\n
"
,
get_average_cost
(
time_analysis
));
fprintf
(
stderr
,
"Variance: %Lf
\n
"
,
get_variance
(
time_analysis
));
fprintf
(
stderr
,
"Standard deviation: %Lf
\n
"
,
get_standard_deviation
(
time_analysis
));
// Sauvegarde les données de l'expérience.
save_values
(
time_analysis
,
"../plots/dynamic_array_time_c.plot"
);
save_values
(
copy_analysis
,
"../plots/dynamic_array_copy_c.plot"
);
save_values
(
memory_analysis
,
"../plots/dynamic_array_memory_c.plot"
);
// Nettoyage de la mémoire avant la sortie du programme
arraylist_destroy
(
a
);
analyzer_destroy
(
time_analysis
);
analyzer_destroy
(
copy_analysis
);
analyzer_destroy
(
memory_analysis
);
return
EXIT_SUCCESS
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment