Liste doublement chainee

kitana -  
Brachior Messages postés 616 Statut Membre -
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
A voir également:

4 réponses

Jodu Messages postés 91 Statut Membre 14
 
Bonjour,

langage ? Description plus complète du problème ? J'ai rien compris moi
0
kitana
 
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 91 Statut Membre 14
 
Et si tu donnais ton code ?
0
kitana
 
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 2053 Statut Membre 135
 
A quoi correspondent les paramètres de ta fonction ?
0
pyschopathe Messages postés 2053 Statut Membre 135
 
A quoi correspondent les paramètres de ta fonction ?
0
Brachior Messages postés 616 Statut Membre 46
 
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