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 :

les redondances en listes chainées?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut les redondances en listes chainées?
    bonsoir tout le monde

    j ai un probleme et je suis besoin de l aide

    comment faire un programme en langage c qui elimine les redondances a partir d une liste chainée?

    merci d' avance pour votre aide

    bonne nuit

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tu n'es pas sur le bon forum (il y a un forum sur le Langage C, ou éventuellement sur l'Algorithmique), par ailleurs "redondance" est un terme un peu vague en informatique. Veux-tu dire les doublons ? Et dans ce cas ne comptes-tu comme doublon que des éléments identiques qui se suivent ou n'importe quels éléments identiques, même s'il ne sont pas consécutifs ?
    Reformule ta question et va la poster dans le bon forum, tu recevras sans doute très rapidement une réponse.

    --
    Jedaï

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    bsr tous

    merci pour vous jedai

    ma qestion etait :dans une liste chainée j ai des élément qui se repetent alors comment faire pour eliminer cette repetition ?
    j'espere que m a question est maintenant claire .

    merci d'avance pour votre aide.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tu peux la trier éventuellement puis éliminer les doublons, mais c'est surtout au moment de la création de la liste qu'il faut opérer, c-a-d tu n'insères un élément que s'il n'est pas déjà présent dans la liste, fais une insertion dans un ordre croissant par exemple.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    Citation Envoyé par Trap D
    Tu peux la trier éventuellement puis éliminer les doublons, mais c'est surtout au moment de la création de la liste qu'il faut opérer, c-a-d tu n'insères un élément que s'il n'est pas déjà présent dans la liste, fais une insertion dans un ordre croissant par exemple.

    n y a-t-il pa une autre façon de le faire pour une liste déja criée?sans la triée
    j ai ponsé qu il fallait avoir 3 pointeur un qui parcoure la liste un precedentet un tempant de fason que j initialise le tmp a la tete de la liste et je parcoure la liste a l aide de par et pred et a chaque fois que la valeur de la cellule est egale à la valeur de tmp je supprime la cellule et j incremante le tmp
    je n sait pa si c est comme ça ke se fait mai en tout ca ça ne veu pa marcher.

    pour vous

  6. #6
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Oui, on peut aussi faire comme celà, si j'ai bien compris ce que tu écris, mais ce sera forcément très long, en O(n^2) n étant le nombre d'éléments de la liste.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par milouky
    comment faire un programme en langage c qui elimine les redondances a partir d une liste chainée?
    Problème d'algorithme. La redondance est une plaie qui doit être traitée en amont, c'est à dire au moment de l'ajout d'un donnée nouvelle. Pour ça, on commence pas vérifier si elle est présente dans la liste. Si elle existe, on met à jour ou on ne fait rien.

    Si le mal est fait, le mieux est de recréer une liste en déplaçant les éléments de l'ancienne à la nouvelle, un par un et testant les doublons à chaque fois. Si un élément est en double, il est détaché et détruit.

  8. #8
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Est-ce que tu es obligé d'utiliser une liste ? Tu peux pas utiliser un arbre rouge-noir à la place, par exemple ?

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2007
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 293
    Par défaut
    j'avais fait ce code pour résoudre un problème de multiplication de 2 polynomes,

    à un moment je devais supprimer les noeuds de même degré, tu pourras probablement t'en inspirer, il est commenté donc tu comprendras facilement je pense.



    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    typedef struct noeud noeud_s;
    /* structure d'un monome */
    struct noeud
    {
       /* Coefficient d'un monome */
       float coefficient;
       /* Degre d'un monome */
       int degre;
       /* stocke l'adresse du noeud suivant */
       noeud_s *p_suivant;
    };
     
     
    /* --------------------------------------------------------------------------
       supprimer_noeud ()
       --------------------------------------------------------------------------
       Role : supprime un noeud a la position p
       -------------------------------------------------------------------------- */
    void supprimer_noeud (noeud_s *p_liste, noeud_s *p_position)
    {
       /* on declare un pointeur pour stocker l'adresse du noeud precedent */
       noeud_s *p_precedent = p_liste;
     
       /* On parcours la liste a la recherche du noeud precedent */
       while (p_precedent->p_suivant != NULL)
       {
          if (p_precedent->p_suivant == p_position)
          {
             /* Si on a trouver le noeud precedent la position p on effectue la
                suppression */
             /* Le noeud precedent pointe sur le noeud suivant */
             p_precedent->p_suivant = p_position->p_suivant;
             /* On libere le noeud courant */
             free (p_position);
             /* Le traitement effectue, on sort */
             break;
          }
          else
          {
             /* Sinon on se deplace vers la droite pour chercher le precedent */
             p_precedent = p_precedent->p_suivant;
          }
       }
    }
     
    /* --------------------------------------------------------------------------
       fusionner_noeuds ()
       --------------------------------------------------------------------------
       Role : Dans le polynome resultat cette fonction fusionne 2 noeuds ayant le
              même degre (en sommant leur coefficient) et supprime le noeud le plus
              a droite a l'aide de supprimer_noeud ()
       -------------------------------------------------------------------------- */
    void fusionner_noeuds (noeud_s *p_liste)
    {
       /* On declare 2 pointeurs temporaires pour parcourir la liste */
       noeud_s *p_tmp1 = p_liste->p_suivant;
       noeud_s *p_tmp2;
       /* pointeur de sauvegarde d'adresse */
       noeud_s *p_tmp3;
     
       while (p_tmp1 != NULL)
       {
          /* On compare le degre d'un noeud avec le degre de ceux qui le suivent */
          p_tmp2 = p_tmp1->p_suivant;
     
          while (p_tmp2 != NULL)
          {
             if (p_tmp1->degre == p_tmp2->degre)
             {
                /* Si les monomes ont meme degre, on les fusionne en additionnant leur
                   coefficient*/
                p_tmp1->coefficient+= p_tmp2->coefficient;
                /* La fusion implique la suppression du noeud le plus a droite,
                   on sauvegarde avant l'adresse du noeud suivant le noeud a
                   supprimer pour pouvoir continuer le traitement */
                p_tmp3 = p_tmp2->p_suivant;
                supprimer_noeud (p_liste, p_tmp2);
                p_tmp2 = p_tmp3;
             }
             else
             {
                /* Sinon on avance de la chaine pour continuer le traitement */
                p_tmp2 = p_tmp2->p_suivant;
             }
          }
     
          /* On a comparer le degre d'un monome avec tous les monomes qui le suivent,
             on avance dans la chaine */
          p_tmp1 = p_tmp1->p_suivant;
       }
    }

  10. #10
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 5
    Par défaut
    c y est ca marche voila le code de la fonction
    je ne sais pas si
    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
     
    ptrcellule *eleminerod(ptrcellule *liste)
     {
         ptrcellule *par1,*par2;
         ptrcellule  *tmp;
         par1=liste;
         int i,j,l,pos;
     
    l=calcullong(liste);
    /*c est une fonction ke j ai et ki calcule la langueur d une liste*/
     
      for(i=1;i<=l;i++)
        {
           par2=par1->suiv;
     
     
                 for(j=i+1;j<=l;j++)
                    {
                       if(par2->val==par1->val)
                         {
                             pos=j;
                             liste = suprimerpos(liste,pos);
    /*suppression fonction ki supprime une position de la liste*/
                             return eleminerod(liste);
                          }
     
                        else
                            par2=par2->suiv;
                     }
     
             par1=par1->suiv;
     
        }
    return liste;
    }
    si vous avez des remarques ca serai gentille de votre part.

  11. #11
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Tu peux te passer ET des indices ET de la longueur de la liste ET de la récursivité :

    En ajoutant un paramètre prec qui est l'élément précdent de celui que tu élimines (à moins que tu aies une liste doublement chaînée).


    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
     
    ptrcellule *eleminerod(ptrcellule *liste)
     {
         ptrcellule *par1=NULL,*par2=NULL;
         ptrcellule  *tmp=NULL, *prec=NULL;
     
       par1 = liste ;
     
       while ( par1 != NULL )
         {
             par2=par1->suiv ; 
             prec = par1 ;
     
             while ( par2 != NULL )
                {
                    tmp = par2->suiv ;
     
                    if (par2->val == par1->val)
                      {
                          prec->suiv = par2->suiv ;
     
                          /* libère ce qui il y a à libérer dans par2 */
                          /* puis libère par2 */
                      }
                    else
                         prec = par2 ;
     
                    par2 = tmp ;
                }                
     
             par1=par1->suiv; 
        }
     
    return liste;
    }

Discussions similaires

  1. les listes chaines en c++ builder
    Par touf213 dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/07/2007, 18h06
  2. Toujours les listes chainées
    Par KindPlayer dans le forum C
    Réponses: 2
    Dernier message: 26/02/2007, 10h00
  3. des questions sur les listes chainées
    Par hunter99 dans le forum C
    Réponses: 13
    Dernier message: 05/12/2006, 22h51
  4. les listes chaineés(structures)
    Par snakemetalgear dans le forum C
    Réponses: 18
    Dernier message: 14/11/2006, 18h09
  5. les listes chainées
    Par najwWa dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2006, 19h09

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