Liste doublement chainee

Fermé
kitana - 2 juin 2009 à 14:19
Brachior Messages postés 613 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 22 juin 2009 - 3 juin 2009 à 11:02
Bonjour, mon probleme a moi c'est la fonction de suppression dans une liste doublement chainee. a chaque que je fais appel a la fonction.Elle vide toute la liste.Pourriez vous m'aider a resoudre ce probleme svp

4 réponses

Jodu Messages postés 89 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 3 février 2010 14
2 juin 2009 à 14:22
Bonjour,

langage ? Description plus complète du problème ? J'ai rien compris moi
0
le langage est la programmation c. Au fait j'arrive pas a supprimer quelque elements de la liste. A chaque que je fais appel a la fonction , elle vide toute la liste. je ne sais quoi faire.
0
Jodu Messages postés 89 Date d'inscription mardi 5 février 2008 Statut Membre Dernière intervention 3 février 2010 14
2 juin 2009 à 14:50
Et si tu donnais ton code ?
0
voici le code la fonction suppression



element *suppression(element *debut, element *fin,int sup)
{

element *temp =debut;
if (temp!= NULL)
{
while(temp!=NULL)
{
if(temp->val==sup)
{
if(temp->apres==NULL)
{
printf("la liste a un seul element");
}
else if(temp->avant==NULL)
{
printf("la liste est vide");

}
else
{

}
free(temp);
}
else
temp=temp->apres;
}
}
}
0
pyschopathe Messages postés 1973 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
2 juin 2009 à 15:27
A quoi correspondent les paramètres de ta fonction ?
0
pyschopathe Messages postés 1973 Date d'inscription dimanche 2 mars 2008 Statut Membre Dernière intervention 22 mars 2010 135
2 juin 2009 à 15:27
A quoi correspondent les paramètres de ta fonction ?
0
Brachior Messages postés 613 Date d'inscription dimanche 21 octobre 2007 Statut Membre Dernière intervention 22 juin 2009 46
3 juin 2009 à 11:02
j'vois quelques problemes dans ton code
element *suppression(element *debut, element *fin,int sup){
	element *temp =debut;
	if (temp!= NULL){
		while(temp!=NULL){
			if(temp->val==sup){
				if(temp->apres==NULL){
					printf("la liste a un seul element");
				}
				else if(temp->avant==NULL){
					printf("la liste est vide");
				}
				else{}
				free(temp);
			}
			else
				temp=temp->apres;
		}
	}
}

jai supposé que debut et fin etait reciproquement le debut et la fin de ta liste
et que ta structure etait du style :
typedef struct _elt_{
	int val;
	struct _elt_ *avant,*apres;
}element;

si j'me trompe dit le moi ^^

en ce qui concerne le code,
	if (temp!= NULL){
		while(temp!=NULL){

pour moi le "if (temp!= NULL)" est de trop car ton while fait exactement le meme test
et avant de passer dans la fonction
je remarque qu'elle renvoie un pointeur sur element et qu'il n'y a pas de "return" dans ta fonction ...

dans la fonction,
tu supprimes un element sans raccrocher les autres,
donc si tu supprimes le 1er element, tu perds TOUTE ta liste =X
de plus tu fais une suite "if / else if" alors que dans l'exemple d'un seul element, les 2 sont vrais.
De plus les printf ne donne pas d'information juste.
Le fait de ne pas avoir de suivant ne signifie pas que l'element est seul Oo

voila le code que moi je ferai :
void suppression(element *debut, element *fin,int sup){
	element *temp =debut;
	while( temp ){ /* identique a temp != NULL */
		if( temp->val == sup ){
			if( temp-avant ){
				temp->avant->apres = temp->apres;
				/* si temp->apres est NULL,                   *
				 * alors le suivant de temp->avant sera NULL, *
				 * donc pas de soucis                         */
				if( !(temp->apres) ){ /* identique a temp->apres == NULL */
					fin = temp->avant;
					/* si temp etait la fin de liste,                *
					 * on dit que maintenant c'est l'element d'avant */
				}
			} 
			if( temp->apres ){
				temp->apres->avant = temp->avant;
				/* si temp->avant est NULL,                   *
				 * alors le suivant de temp->apres sera NULL, *
				 * donc pas de soucis                         */
				if( !(temp->avant) ){
					debut = temp->apres;
					/* si temp etait le debut de liste,              *
					 * on dit que maintenant c'est l'element d'apres */
				}
			}
			/* maintenant que les deux element avant et apres sont raccorchés, *
			 * on peut supprimer temp;                                         */
			free(temp);
			/* si tu ne veux supprimer qu'un element tu fais un "return;" ici        *
			 * sinon il supprimera en boucle tous les element ayant sup comme valeur */
		}
		else
			temp = temp->apres;
	}
}
0