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
| #Note: En C, la valeur SIZE_MAX est définie dans <limits.h> et vaut (size_t)-1
DEFINIR IndexNul SIZE_MAX
# Valeurs pour iSuivant:
# IndexNul équivaut à NULL
# iSuivant pointant sur lui-même indique que la structure n'est pas allouée
STRUCTURE chainon
int uneValeur
int uneAutreValeur
size_t iSuivant
FONCTION CreerEtInitialiserMemoirePartagee(size_t nElemsMax)
chainon[] memoire := CreerMemoirePartagee(nElemsMax * sizeof(chainon))
# On fait pointer chaque chainon sur lui-même pour dire "il n'est pas alloué"
POUR INDEX i DANS memoire
memoire[i] := {0,0, i}
RETOUR memoire
FONCTION EstAlloue(chainon[] memoire, size_t i)
RETOUR (memoire[i].iSuivant == i)
# Fonction d'allocation "naive" : On peut faire mieux question performance, mais bon...
FONCTION AllouerChainon(chainon[] memoire)
POUR INDEX i DANS memoire
SI !EstAlloue(memoire, i)
memoire[i].iSuivant := IndexNul
RETOUR i
FONCTION DesallouerChainon(chainon[] memoire, size_t i)
memoire[i].iSuivant := i
#--- fonctions pour la liste chainee---
FONCTION GetDernier(chainon[] memoire, size_t iPremier)
SI iPremier==IndexNul OU !EstAlloue(memoire, iPremier)
RETOUR IndexNul
size_t i := iPremier
TANT QUE memoire[i].iSuivant!=IndexNul
i := memoire[i].iSuivant
RETOUR i
FONCTION AjouterEnFinDeListe(chainon[] memoire, size_t iPremier, int uneValeur, int uneAutreValeur)
size_t iDernier := GetDernier(memoire, iPremier)
size_t iNouveau := AllouerChainon(memoire)
memoire[iNouveau] := {uneValeur, uneAutreValeur, IndexNul}
SI iDernier != IndexNul
memoire[iDernier].iSuivant := iNouveau
RETOUR iNouveau |
Partager