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
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 33
    Points
    33
    Par défaut Suppression dans une liste chainée
    Bonsoir a tous,
    J'aimerais supprimer un mot contenu dans une liste simplement chainée de mots.
    j'ai procédé ainsi :
    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
    while((i<6))
        {
            if(v[i]!='*')
                {
                    while(p!=NULL){
                    strcpy(motchaine, p->val);
                    mot=motchaine;
                    temp = exist(motchaine, v[i]);
     
                    if(temp ==-1)//caractere inexistant
                        {
     
                            supprimer(&p, mot);
                        }
                        else
                        p = p->suivant;
                }
                }
     
        i++;
        }
    La fonction supprimer est la suivante :
    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
    Liste* _supprimer(Liste* l, char* s)
    {
        Liste* res;
        if(l == NULL)
            return NULL;
        if(strcmp(s,l->val) == 0)
        {
            res = _supprimer(l->suivant,s);
            free(l);
        }
        else
        {
            res = l;
            l->suivant = _supprimer(l->suivant,s);
        }
        return res;
    }
     
    void supprimer(Liste** L,char* s)
    {
        *L = _supprimer(*L,s);
    }
    Mais ca me supprime toute la liste.
    Je crois que mon probleme reside dans la boucle while, j'ai pourtant essayé de la modifier ... mais en vain .

  2. #2
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    voila la fonction exist aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int exist(char s[], char c)
    {
            unsigned int i;
            for (i = 0; s[i] != '\0'; i++) {
                    if (s[i] == c) {
                            return i;
                    }
            }
            return -1;
    }
    Je peut garantir que ces fonctions (supprimer, _supprimer et exist) sont exactes.
    Reste avec le programme appelant ...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    tu veux supprimer un mot que tu lui donnes ?
    donc s'il y est plusieurs fois, tu supprime les deux.
    enfin, si j'ai bien compris.

    tu strcmp list->next->value avec s,
    si ça match;
    list ->next = list->next->next
    et faut que tu gardes un pointeur temporaire histoire de pouvoir free list->next.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    en faite ta fonction supprimer est fausse, parce qu'il faut que tu duplique (puis free) un element de ta liste, et pas le pointeur vers ta liste.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Non Nemesis, en fait la liste ne contient qu'une seule occurence du mot.
    Pour mieu m'explique, ca consiste a un jeu "Motus en C" et je fait la version Humain Vs Cpu.
    Quand c'est au tour du CPU, j'ai songé a un algorithme qui a chaque itération, supprime les mots qui ne contiennent pas le caractere trouvé :
    exple : le mot recherché : stylo
    Essai : st***
    Dans ce cas je doit supprimer tous les mots de la liste qui ne contiennent pas le 't', et en supprimant petit a petit il ne me restera qu'un seul mot et c'est bel et bien le mot recherché.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    dans ce cas, strncmp, et tu compare n caracteres, ce qui match pas, tu le vire de la liste

  7. #7
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Bon j'ai retrouvé mon probleme Merci nemesis encore pour ton aide !
    En faite c'est tout bete !
    c'est la ligne a supprimer et tout ira bien.
    (dire que les profs ont toujours raison ...)

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    pas de soucis, mais n'oublie pas de free l'element que tu vire de ta liste

  9. #9
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Merci Nemesis mais en faisant free ca bloque tout !

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    tu fais un pointeur pour garder l'adresse de l'element que t'as supprimer, et tu le free avant de finir ta fonction

  11. #11
    Nouveau membre du Club
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    Points : 33
    Points
    33
    Par défaut
    Merci Nemesis ,

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

Discussions similaires

  1. probleme suppression dans une liste chainée
    Par Ganondorf dans le forum Débuter
    Réponses: 7
    Dernier message: 06/10/2010, 19h02
  2. 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
  3. suppression dans une liste chainée
    Par tomtom421 dans le forum C
    Réponses: 8
    Dernier message: 21/04/2007, 16h29
  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