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 :

Algo de tri par liste chainée


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut Algo de tri par liste chainée
    Bonjour a tous , voici le probleme : je dois faire un programme triant une liste de nombre de 10 caracteres (caracteres car s'exprime dans n'importe quelle base).
    C'est une liste chainée. Voila le principe :

    nombres a trier :

    48081 97342 90287 90583 53202 65215 48801

    premiere etape :
    On cherche tous les nombres qui se terminent par 0, on les mets dans le seau 0.Dans cette etape , le seau 0 est vide car il n y apas de nombres se terminant par 0

    ensuite on chertche les nombres qui se terminent par 1, on les met dans le seau 1. Donc 48081 et 48801 sont dans ce seau.

    et ainsi de suite jusqu au seau 9

    On relie ces seaux entre eux dans l ordre, on obtient la liste triée par le dernier nombre :

    48081 48801 97342 53202 90583 65215 90287

    On recommence avec l avant dernier nombre et ainsi de suite jusqu a obtenit la liste triée entierement.

    La representation des seaux est fait par un tableau ou le nombre de lignes = la 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
    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
    liste tri(liste l,int b)
    {
        int i,j,longueur;//i designe un caractere des nombres, 
        liste A[b]; //Ce tableau represente les "seaux"
        element *e; //Pour parcourir la liste l
        element *f; //Pour parcourir la liste dont le 1er element est designe par A[j]
     
        longueur=calcullongueur(longueur,l);
     
        for (i=longueur-1;i>0;i=i-1)
        {
            for (j=0;j<b;j=j+1)
            {
                A[j]=NULL;  //on mets a NULL le tableau de seaux
            }
     
            e=l;
            while (e !=NULL)
            {
                element *nouv;  
                nouv=(element*)malloc(sizeof(element)); //on cree un nouvelle elemnt a ajouter dans la liste designz par A[j] 
                memcpy(nouv->valeur,e->valeur,11*sizeof(char)); //on prends la valeur de e pour la copier dans A[j]
                nouv->suivant=NULL;
     
                if (e->valeur[i]=='a')
                j=10;
                else if (e->valeur[i]=='b')
                j=11;
                else if (e->valeur[i]=='c')
                j=12;
                else if (e->valeur[i]=='d')
                j=13;
                else if (e->valeur[i]=='e')
                j=14;
                else if (e->valeur[i]=='f')
                j=15;
                else
                j=e->valeur[i];
     
                if (A[j] != NULL)
                {
                    f=A[j];
                    while (f->suivant != NULL)
                        f=f->suivant;
                    f->suivant=nouv;
                }
                else  
                {
                    memcpy(A[j]->valeur,e->valeur,11*sizeof(char));
                    A[j]->suivant=NULL;
                }
                e=e->suivant;
            }
            // a partir d'ici on ecrase les valeurs de la liste l 
            e=l;
            j=0;
            while (e!=NULL)
            {
                while (A[j]=NULL)
                      j=j+1;
                f=A[j];
                memcpy(e->valeur,f->valeur,11*sizeof(char)); 
                while (f->suivant !=NULL)
                {
                   f=f->suivant;
                   e=e->suivant;
                   memcpy(e->valeur,f->valeur,11*sizeof(char));
                } 
                j=j+1;           
            }
        }    
        return l;
    }
    Comprends pas ... si vous avez des questions ... je vous serais tres reconnaissant !

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    J ai ouvlie de dire que le programme quittait jsute au debut apres le premier e=e->suivant

  3. #3
    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
    Je n'ai pas tout compris mais tu as une erreur au moins ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    liste tri(liste l,int b)
    {
        int i,j,k,longueur;
        liste A[b];
        element *e;
        element *f;
     
        e=l;
        longueur=strlen(e->valeur); // <= ici e peut être NULL, donc c'est peut-être là ton problème
    Je ferais plutôt ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        e=l;
        longueur=0;
        while (e !=NULL)
        {
              k=strlen(e->valeur);
              if (k>longueur)
              {
                 longueur=k;
              }
              e=e->suivant;
        }
    Il serait intéressant que tu donnes aussi la structure element.
    "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

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 271
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct elem {
                        char valeur[11];
                        struct elem *suivant;
                        }element;
    typedef element* liste;
    Voila voila, je vais deja essayer avec ce que tu m as dis , merci !

Discussions similaires

  1. Tri de liste chainée par sélection
    Par adrian07 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/06/2010, 10h01
  2. tri une liste chainée
    Par dharkan dans le forum Débuter
    Réponses: 3
    Dernier message: 09/03/2010, 14h37
  3. Tri sur liste chainée
    Par SevSof dans le forum C
    Réponses: 16
    Dernier message: 27/05/2007, 00h45
  4. quel est le meilleur algo de tri de liste ?
    Par sony351 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 24/07/2005, 02h00
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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