A voir également:
- Liste doublement chainee
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Site dangereux liste - Guide
- Voir liste d'amis facebook - Guide
4 réponses
Bonjour,
langage ? Description plus complète du problème ? J'ai rien compris moi
langage ? Description plus complète du problème ? J'ai rien compris moi
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.
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;
}
}
}
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;
}
}
}
j'vois quelques problemes dans ton code
jai supposé que debut et fin etait reciproquement le debut et la fin de ta liste
et que ta structure etait du style :
si j'me trompe dit le moi ^^
en ce qui concerne le code,
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 :
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;
}
}