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
| #include <assert.h>
/* Cette fonction écrit dans le buffer de manière circulaire.
Arrivée à la fin, elle repart de zéro. */
void write_to_buf(
int *buf, /*[out] Buffer dans lequel écrire*/
size_t n, /*[in] Taille du buffer*/
size_t *pi, /*[in/out] Index d'écriture dans le buffer. Avant et après l'appel, il indique le prochain endroit où la fonction écrira. */
int val /*[in] Valeur à écrire. */
)
{
/* Lit l'index */
size_t i = *pi;
assert(i < n);
/* Ecrit dans le buffer */
buf[i] = val;
/* Incrémente l'index */
i++;
if(i==n)
i = 0;
assert(i < n);
/* Met à jour */
*pi = i;
}
int sll_get_five_before_Last(sll_s const *pc_sll) {
/* create temp table that will hold only the last 5 values
temp look like after 6 values that we have gone through; lets says the values from 1 to 6
temp = {6,2,3,4,5}
when we go throw the 7th value of the list temp look like
temp = {6,7,3,4,5} */
int temp[5] = {0, 0, 0, 0, 0};
size_t i = 0;
if(pc_sll) {
/* Utiliser un pointeur local,
cela permet au pointeur de liste d'être const */
item_s const * pc_l = pc_sll->p_start->next;
while(pc_l != NULL) {
//add the last value from our List to the temp array
write_to_buf(temp, 5, &i, pc_l->value);
pc_l = pc_l->next;
}
/* Là, i est l'index du prochain endroit où la fonction aurait écrit.
Donc, l'index du plus vieux entier du buffer, celui que l'on veut. */
return temp[i];
} else {
return 0; /* N'utiliser NULL que pour les pointeurs */
}
} |
Partager