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
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    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
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    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
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  7. #7
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    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
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 60
    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