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


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Supprimer un élément d'une liste
    Bonjour, je n'arrive pas à voir ce qui na vas pas dans la construction de ma procédure; si vous pouviez me filer un coup de main ça serait sympas.

    Le but est de supprimer un élément dans une liste si celui si est présent.

    Voici les structure de base
    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
    #define taille 20
     
    typedef struct ELEMENT
     {
       int valeur;
        char nom[taille];
     }ELEMENT;
     
    typedef struct etc3
     {
      ELEMENT val;
      struct etc3 * prec;
      struct etc3 * suiv;
     }cellule;
     
    typedef struct etlcd
     {
      cellule * courant; 
     }c2;
    typedef c2 * LDC;
     
    typedef LDC itLDC; /*renommage de LDC*/


    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
    void supprimer_element(itLDC *L,ELEMENT e)
    {
    	begin(L);
    	if((*L)->courant !=NULL)
    	{
    		if(search((*L),e)==1)/*si l'élément est présent au moins une fois*/
    		{
    			begin(L);
    			while(hasNext(*L))
    			{/*on cherche un élément avec un nom et un prix similaire*/
    				if(hasPrevious(*L))/*si ce n'est pas le premier élément*/
    				{
    					if((e.valeur == (*L)->courant->val.valeur) && (strcmp(e.nom,(*L)->courant->val.nom)==0))
    					{
    						(*L)->courant->prec->suiv=(*L)->courant->suiv;
    						(*L)->courant->suiv->prec=(*L)->courant->prec;
    						free((*L)->courant);
    					}
    					next(L);
    				}
    				else /*si c'est le premier élément*/
    				{
    					if((e.valeur == (*L)->courant->val.valeur) && (strcmp(e.nom,(*L)->courant->val.nom)==0))
    					{
    						(*L)->courant=(*L)->courant->suiv;
    						free((*L)->courant->prec);
    						(*L)->courant->prec=NULL;
    					}	
                                           next(L);
    				}
    			}
    			if((e.valeur == (*L)->courant->val.valeur) && (strcmp(e.nom,(*L)->courant->val.nom)==0))
    			{/*si c'est le dernier élément*/
    				if(hasPrevious(*L))/*si ce n'est pas le premier élément*/
    				{
    					(*L)->courant=(*L)->courant->prec;
    					free((*L)->courant->suiv);
    					(*L)->courant->suiv=NULL;
    				}
    				else/*si c'est le seul élément*/
    				{
    					free((*L)->courant);
    					(*L)->courant=NULL;
    				}
    			}
    		}
    	}
    }
    A noter que les fonctions utilisées dans cette procédure fonctionne.
    search renvoie un entier 1 ou 0 si l'élément en présent ou pas.
    hasPrevioux et hasNext envoie 1 ou 0 si l'élément possède un élément précédent ou suivant.
    next passe à l'élément suivant.


    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je pense tu devrais faire une fonction séparée SupprimerElementCourant(), appelée par ta fonction.
    Et aussi une fonction int ElementEgal(ELEMENT const *e1, ELEMENT const *e2), pour comparer deux éléments.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Oui ce serait pratique en effet, mais s'agissant de la question "finale" de mon exo je dois simplement ré-utiliser des fonctions que l'on a déjà réalisé. Donc je préfère ne pas modifier dans la forme...la dernière fois que j'ai pris ce genre d'initiative; la prof a aussi pris des initiatives sur ma note si vous voyez ce que je veux dire :d


    EDIT:


    J'ai rajouté en rouge un next(L) que j'avais oublié dans le code qui me faisait prendre une boucle infini.

    La fonction marche désormais dans tous les cas; sauf lorsqu'il s'agit de supprimer le premier élément de la liste que ce soit le seul ou non, je prend une erreur de segmentation.

    Le chaînage ne me semble pourtant pas mauvais.

  4. #4
    Expert confirmé Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 619
    Points : 4 350
    Points
    4 350
    Par défaut
    As-tu vérifié (avec un printf ou un débuggeur si tu utilises un EDI) les valeurs que prennent (*L)->courant, (*L)->courant->prec, (*L)->courant->suiv aux différents endroits du bout de code ci-dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if((e.valeur == (*L)->courant->val.valeur) && (strcmp(e.nom,(*L)->courant->val.nom)==0))
    					{
    						(*L)->courant->prec->suiv=(*L)->courant->suiv;
    						(*L)->courant->suiv->prec=(*L)->courant->prec;
    						free((*L)->courant);
    					}
    Sinon j'ai l'impression que tu te compliques beaucoup la vie.

    Quel est l'intérêt de search ? Si il trouve ton élément, ben tu va reparcourir la liste pour le trouver une deuxième fois (alors que tu as déjà trouvé l'élément, avec search).
    Si l'élément n'est pas dans la liste, le while(hasNext(*L)) garantit que tu vas parcourir toute la liste (sauf le dernier élément), exactement ce que fait search pour te dire qu'il n'a pas trouvé l'élément

    PS : Sur un autre registre, je trouve bizarre que tu créés une structure pour l'élément courant (qui va changer), plutôt que de faire une structure pour la tête de la liste, et balader un pointeur vers une cellule pour l'élément courant.

    Edit : Vu que tu as un next(L) dans ton if et dans ton else, tu peux le sortir du if-then-else, ça fait une ligne de code en moins, donc moins de chances d'erreurs.
    http://www.traducteur-sms.com/ On ne sait jamais quand il va servir, donc il faut toujours le garder sous la main

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Edit : Vu que tu as un next(L) dans ton if et dans ton else, tu peux le sortir du if-then-else, ça fait une ligne de code en moins, donc moins de chances d'erreurs.
    Je plussois

    Pour le reste; ouai je suis bien d'accord je refais ce que j'ai fait avec search pour trouver l'élément ce qui ets stupide...le soucis c'est que lorsque l'on m'a donné le prototype de search je n'avais pas le choix et je ne pouvais pas récupérer l'élément; j'étais obligé de la faire comme cela, ce qui la rend un peu inutile pour la suite vu qu'il faut recopier la majorité de son code...malgré tout, je ne peux pas modifier ça, sinon je ne respecte plus mon sujet

    Merci.

Discussions similaires

  1. supprimer un élément d'une liste avec erase
    Par jane40 dans le forum Débuter
    Réponses: 12
    Dernier message: 24/01/2009, 12h26
  2. Réponses: 7
    Dernier message: 23/04/2008, 10h21
  3. Réponses: 12
    Dernier message: 04/03/2007, 11h43
  4. Réponses: 3
    Dernier message: 25/10/2006, 19h08
  5. Supprimer des éléments d'une liste
    Par espadon1 dans le forum Langage
    Réponses: 2
    Dernier message: 31/05/2006, 15h08

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