IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

suppression dans une liste chainée


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut suppression dans une liste chainée
    Bonjour à tous!

    je vous expose mon problème:
    j'ai une liste doublement chainée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct strListe{
    	char car;
    	struct strListe *suivant;
    	struct strListe *precedent;
    }liste;
    et je ne parviens pas à faire une fonction de suppression d'un élément.
    voici ce que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Supprimer(liste **victime){
    	if((*victime)->precedent!=NULL)
    		(*victime)->precedent->suivant=(*victime)->suivant;
    	if((*pvictime)->suivant!=NULL)
    		(*victime)->suivant->precedent=(*victime)->precedent;
    	free(**victime);
    	return;
    }
    mais cette fonction supprime toute la liste, du debut jusqu'à l'élément passé en paramètre ... et je ne trouve pas mon erreur
    pourriez-vous me l'indiquer? (oui j'ai cherché avant de poster, non je ne demande pas la solution toute faite )

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    tu t'es mélangé les pinceaux, tu as mis une variable qui doit être ta liste (*pvictime) et en plus tu n'as pas besoin des double pointeurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Supprimer(liste *victime){
    	if(victime->precedent!=NULL)
    	    victime->precedent->suivant=victime->suivant;
     
    	if(victime->suivant!=NULL)
    	    victime->suivant->precedent=victime->precedent;
     
    	free(victime);
    	return;
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    oui mais la, c'est visual studio qui n'est pas content...
    HEAP[test.exe]: Invalid Address specified to RtlFreeHeap( 00330000, 003301A0 )
    Windows a déclenché un point d'arrêt dans test.exe.

    Cela peut être dû à une défaillance du tas et indique un bogue dans test.exe ou l'une des DLL chargées.

    La fenêtre Sortie peut contenir des informations de diagnostic supplémentaires
    un problème avec le free()?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    non mais ça dépend comment cette fonction est appelée..

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    je l'ai appelée avec Supprimer(ptr); (ptr pointe vers un des elements de la liste (celui à supprimer (-; ) ).

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    montre ton code, là on sait rien...

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    le voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include<stdio.h>
     
    typedef struct strListe{
    	char car;
    	struct strListe *suivant;
    	struct strListe *precedent;
    }liste;
     
    liste* GoDebut(liste* ptr){
    	if(ptr!=NULL)
    		while(ptr->precedent!=NULL)
    			ptr=ptr->precedent;
    	return ptr;
    }
    liste* GoFin(liste* ptr){
    	if(ptr!=NULL)
    		while(ptr->suivant!=NULL)
    			ptr=ptr->suivant;
    	return ptr;
    }
    void Supprimer(liste *victime){
    	if(victime->precedent!=NULL)
    		victime->precedent->suivant=victime->suivant;
     
    	if(victime->suivant!=NULL)
    		victime->suivant->precedent=victime->precedent;
     
    	free(victime);
    	return;
    }
    void AfficherListe(liste* ptr){
    	ptr=GoDebut(ptr);
    	while(ptr->suivant!=NULL){
    		printf("%c",ptr->car);
    		ptr=ptr->suivant;
    	}
    	printf("%c",ptr->car);
    	return;
    }
    liste* AddFinListe(liste* ptr, char caractere){
    	liste* new_cellule=(liste*)malloc(sizeof(liste));
    	if (new_cellule==NULL){
    		printf("\nErreur: impossible de creer une nouvelle cellule\n");
    		return ptr;
    	}
    	new_cellule->car=caractere;
    	new_cellule->precedent=ptr;
    	new_cellule->suivant=NULL;
    	if(ptr==NULL)
    		return new_cellule;	
    	ptr=GoFin(ptr);
     
    	if(ptr!=NULL)
    		ptr->suivant=new_cellule;
     
    	return ptr;
    }
     
    void main(){
    	liste *test=NULL,*ptr=NULL;
     
    	test=AddFinListe(test,'a');
    	test=AddFinListe(test,'b');
    	test=AddFinListe(test,'c');	
     
    	ptr=GoDebut(test);
    	Supprimer(ptr);
    	AfficherListe(test);
     
    	system("pause");
    }
    merci de prendre le temps de m'aider

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    ben tu écrases tes pointeurs, quand tu appelles AddFinListe..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void main(){
    	liste *test=NULL,*ptr=NULL, *elt=NULL;
     
    	test=AddFinListe(test,'a');
    	elt=AddFinListe(test,'b');
    	elt=AddFinListe(test,'c');	
     
    	ptr=GoDebut(test);
    	Supprimer(ptr);
    	AfficherListe(test);
     
    	system("pause");
    }

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    à toi et pour moi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression dans une liste chainée
    Par dazwy dans le forum C
    Réponses: 10
    Dernier message: 27/12/2011, 16h32
  2. probleme suppression dans une liste chainée
    Par Ganondorf dans le forum Débuter
    Réponses: 7
    Dernier message: 06/10/2010, 19h02
  3. Suppression d'un élément dans une liste chainée
    Par jbarreau-mainson dans le forum Débuter
    Réponses: 1
    Dernier message: 06/05/2009, 15h49
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25
  5. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo