All pastes #249345 Raw Edit

Something

public text v1 · immutable
#249345 ·published 2006-11-15 18:06 UTC
rendered paste body
/* 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;
}