/* Liste chainée en C, avec posibilité de supprimer une maille precise.
*
*/
#include <stdlib.h>
typedef struct _maille {
struct _maille *maille_precedente;
/* struct _maille *maille_suivante;*/
int truc;//donnée de la maille
} _maille;
/* Rajoute une maille à la fin de la chaine */
void rajouter(_maille **maille, int truc)
{
_maille *nouvelle_maille = malloc(sizeof(_maille));
if(!nouvelle_maille) return;
/* initialise les données */
nouvelle_maille->truc = truc;
nouvelle_maille->maille_precedente = *maille;
// nouvelle_maille->maille_suivante = NULL;
// (**maille)->maille_suivante = nouvelle_maille; /* marche pas, mais pas grave */
*maille = nouvelle_maille; /* met à jour le pointeur */
}
/* Supprime une maille de la chaine */
void supprimer(_maille **chaine, int id)
{
if(!*chaine) return;
if(id>=nombre(chaine)) return;
_maille *intermediere; /* contiendra la maille à supprimer */
_maille *derniere = *chaine; /* contient la maille qui suit celle à supprimer */
/* si c'est la derniere maille */
if(id == nombre(*chaine)-1)
{
intermediere =(*chaine)->maille_precedente;
free(*chaine);
*chaine = intermediere;
return ;
}
derniere->maille_precedente = (*chaine)->maille_precedente;
/* on cherche la maille qui suit celle a supprimer */
int i;
for(i=nombre(chaine); i>id+2; i--)
{
derniere = derniere->maille_precedente;
}
/* la maille qu'il faudra supprimer */
intermediere = derniere->maille_precedente;
/* met a jour le pointer "maille_precedente" de la
maille qui la suit avec celle qui la precede */
derniere->maille_precedente = intermediere->maille_precedente;
/* fuck la maille a supprimer*/
free(intermediere);
}
/* Detrui la chaine */
void detruire(_maille **chaine)
{
_maille *maille_intermediere;
while(*chaine)
{
maille_intermediere = (*chaine)->maille_precedente;
free(*chaine);
*chaine = maille_intermediere;
}
}
/* Retourne le nombre de maille(s) de la chaine */
int nombre(_maille *chaine)
{
unsigned int nombre = 0; /* et non j'ai pas foutu ton register sp00k */
while(chaine)
{
chaine = chaine->maille_precedente;
++nombre;
}
return nombre;
}
/* Retourne la valeur de "truc" d'une maille de la chaine */
int utiliser(_maille *chaine, int id)
{
if(!chaine) return 0;
if(id>=nombre(chaine)) return 0;
_maille *maille_correspondante;
maille_correspondante->maille_precedente = chaine;
int i;
/* remarque: il faut que la boucle s'arrete à la maille supperieur, en sachant
que les mailles et les id de 0 à x */
for(i=nombre(chaine); i>id+1; i--)
{
maille_correspondante = maille_correspondante->maille_precedente;
}
return maille_correspondante->maille_precedente->truc;
}
int main(int argc, char *argv[])
{
_maille *chaine = NULL;
rajouter(&chaine, 11);
rajouter(&chaine, 22);
rajouter(&chaine, 33);
printf("Il y a %i maille(s) dans la chaine\n", nombre(chaine));
printf("Le \"truc\" de la maille 1: %i\n", utiliser(chaine, 0));
printf("Le \"truc\" de la maille 2: %i\n", utiliser(chaine, 1));
printf("Le \"truc\" de la maille 3: %i\n", utiliser(chaine, 2));
supprimer(&chaine, 1);
printf("Il y a %i maille(s) dans la chaine\n", nombre(chaine));
printf("Le \"truc\" de la maille 1: %i\n", utiliser(chaine, 0));
printf("Le \"truc\" de la maille 2: %i\n", utiliser(chaine, 1));
detruire(&chaine);
return EXIT_SUCCESS;
}