/* Liste chainée en C, avec posibilité de supprimer une maille precise. * */ #include 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; }