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 :

Supprimer un élément d'une liste triée


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Par défaut Supprimer un élément d'une liste triée
    Bonjour,

    Cela fait quelques jours que j'essaie de supprimer un élément d'une liste triée en le passant par paramètre, mais cela ne fonctionne pas (au lieu de ça, la liste entière est supprimée). Voici ce que j'ai fait :


    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
    void annulerReservation(reservation*& listeReservation, reservationFichier uneReservation, livre *listeLivres, abonne *unAbonne, int & numeroAbonneAnnule, char isbnAnnule[20])
    {
     
    	reservation* precedent = listeReservation;
     
    	livre * livreAnnule;
    	livreAnnule = chercherIsbn(listeLivres, isbnAnnule);
     
    	abonne * abonneAnnule;
    	abonneAnnule = chercherAbonne(unAbonne, numeroAbonneAnnule);
     
    	if(precedent == NULL && strcmp(livreAnnule -> isbn , isbnAnnule) == 0)
    	{
    		listeReservation = NULL;
    		delete precedent;
    		return;
    	}
     
    	while(precedent != NULL && precedent ->quiAReserve != abonneAnnule && precedent ->quelLivre != livreAnnule)
    		precedent = precedent->reservSuivAbonne;
     
    	if(precedent == NULL) return;
    	 precedent = precedent->reservSuivAbonne;
    	delete precedent;
    	precedent = NULL;
    }
    Merci d'avance

  2. #2
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    Afin de pouvoir t'apporter une réponse correcte, il serait mieux que tu précises comment sont définis tes types reservation, reservationFichier, livre, abonne. Bon à la limite, pas besoin de ces derniers. Mais comment as tu construit ta liste. Donnes au moins la définition de reservation qui semble être ta liste.

    Ensuite rien que le premier argument de ta fonction semble montrer que tu ne sais pas trop trop ce que tu fais. En tout cas, cela peut sembler douteux.
    Tu passes une référence d'un pointeur vers ta liste. Donc je ne peux rien dire tant que je ne connais pas la représentation que tu as choisie d'une liste mais inexorablement, tu as des chances de détruire ta liste si tu ne manipules pas bien cette référence.

    Pourquoi ne pas avoir utilisé la STL? (et std:list<T>)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    A priori, tu ne fais pas les choses dans le bon ordre...

    Pour supprimer un élément d'une liste, il faut,
    - trouver l'élément (en parcourant la liste)
    - le sortir de la liste, en raccrochant celui qui le précéde à celui qui le suit (et inversement si c'est une liste doublement chainée, ce qui ne semble pas être ton cas)
    - éventuellement, détruire l'élément (ce n'est pas toujours nécessaire)

    Dans une liste simplement chainée, cela veut dire que quand tu parcours la liste, en cherchant l'élément à supprimer, tu dois conserver un pointeur sur l'élément précédent.

    C'est ce que tu fais dans ton exemple, mais ici, on dirait que tu testes l'élément précédent au lieu de l'élément qui t'intéresse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(precedent != NULL && precedent ->quiAReserve != abonneAnnule && precedent ->quelLivre != livreAnnule)
    Et ici, j'ai l'impression que tu mélanges l'élément précédent, et l'élément en cours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    precedent = precedent->reservSuivAbonne;
    delete precedent;
    devrait être quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    adetruire=precedent->suivant;
    precedent->suivant=adetruire->suivant;
    delete adetruire;
    Attention : il restera un cas particulier à gérer. Celui où l'élément à supprimer est le premier (et donc n'a pas de précédent).

    @Extrem_Voyageur: le pointeur sur premier élément, c'est la façon "C" de représenter une liste simplement chaînée. Son paramètre

    reservation*& listeReservation

    est une référence sur un pointeur de début, donc une référence sur liste...

    Francois
    Dernière modification par Invité ; 31/10/2011 à 00h46.

  4. #4
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    @Extrem_Voyageur: le pointeur sur premier élément, c'est la façon "C" de représenter une liste simplement chaînée. Son paramètre
    Oui fcharton, j'ai compris cela et son code. Mais je voulais l'amener à détailler toutes ses structures pour lui montrer qu'il ne fait pas les choses très proprement, je me suis mal exprimé et voulait juste lui faire comprendre qu'il avait sûrement passer son pointeur à NULL et que par conséquent que son pointeur sur sa liste était invalide.
    Cela dit, maintenant tu lui as très bien détaillé les choses, et il devrait être capable de rectifier la situation et faire attention à ses pointeurs sur les éléments précédent (et suivant dans le cas d'une doublement chaînée).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Par défaut
    Bonjour,

    Ça semble mieux fonctionner. Il ne supprime pas toute la liste au complet, mais un élément en particulier.

    Merci pour votre aide

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 23/04/2008, 10h21
  2. Réponses: 12
    Dernier message: 04/03/2007, 11h43
  3. Réponses: 3
    Dernier message: 25/10/2006, 19h08
  4. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08
  5. Recherche d'un élément dans une liste triée (vitesse)
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/05/2006, 09h23

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