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 :

trier une liste


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 208
    Par défaut trier une liste
    salut,

    je veux trier une liste chaine

    j'essaye avec le code suivant mais il est incorecte

    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
     
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    typedef struct noeud
    {
    int info;
    struct noeud *suivant;
    }noeud;
     
    typedef struct
    {noeud *tete;
    }list;
     
     
     
    void trier(list *l)
    {
    noeud *precedent=l->tete;
    noeud *parcour=precedent->suivant;
    int temp,min;
    while(precedent!=NULL)
    {
     min=precedent->info;
     while(parcour!=NULL)
     {
     if(parcour->info<min)
     min=parcour->info;
     parcour=parcour->suivant;
     }
    if(precedent->info!=min)
    {
    temp= precedent->info;
    precedent->info=min;
    min=temp;
    }
    precedent=precedent->suivant;
    }
    }


    merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Novembre 2008
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 208
    Par défaut
    je pense qu'on dois declarer le min de type noeud *



    voila le code complet

    mais le probleme suppose toujour a la fonction trier

    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    typedef struct noeud
    {
    int info;
    struct noeud *suivant;
    }noeud;
     
    typedef struct
    {noeud *tete;
    }list;
     
    void init(list *l)
    {
    l->tete=NULL;
    }
     
     
     
     
    void insertion_fin(list *l,int y)
    {
    noeud *e;
    e=(noeud*)malloc(sizeof(noeud));
    noeud *parcour =l->tete;
    e->info=y;
    e->suivant=NULL;
    if(l->tete==NULL)
    {
    l->tete=e;
    }
    else
    {
    while(parcour->suivant!=NULL)
    {
    parcour=parcour->suivant;
    }
    parcour->suivant=e;
    }
    }
     
     
     
     
     
    void trier(list *l)
    {
    noeud *precedent=l->tete;
    noeud *parcour=precedent->suivant;
    int temp,min;
    while(precedent!=NULL)
    {
    min=precedent->info;
    while(parcour!=NULL)
    {
    if(parcour->info<min)
    min=parcour->info;
    parcour=parcour->suivant;
    }
    if(precedent->info!=min)
    {
    temp= precedent->info;
    precedent->info=min;
    min=temp;
    }
    precedent=precedent->suivant;
    }
    }
     
    void afficher(list l)
    {
    noeud *parcour =l.tete;
    while(parcour!=NULL)
    {
    printf("%7d",parcour->info);
    parcour=parcour->suivant;
    }
     
    }
     
     
     
     
    void main()
    {
    list l;
    int n,vi;
    init(&l);
    printf("donnez le nombre des noeuds a inserer :");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
    printf("donnez une valeur : ");
     
    scanf("%d",&v);
    insertion_fin(&l,v);
    }
    trier(&l);
    afficher(l);
     
    getch();
    }

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Deux problèmes
    - sur le principe : tu mémorises le minimum mais pas où il se trouve. Alors tu ne peux faire l'échange entre les valeurs de la première cellule du sous-tableau et de celle qui contient le minimum.
    min devrait donc être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    noeud *min ;
    int temp;
    while(precedent!=NULL)
    {
       min=precedent;
    ...
    La comparaison devenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parcour->info < min->info
    - tu oublies de replacer le pointeur parcour(s) au début du sous-tableau à traiter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while(precedent!=NULL)
    {
       min=precedent;
       parcour=precedent->suivant;       
       while(parcour!=NULL)
       {
          if(parcour->info<min->info) min=parcour;
          parcour=parcour->suivant;
       }
       if(precedent->info!=min->info)
       {
          // procéder à l'échange
       }
    ....
    Sinon :

    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    noeud *parcour=precedent->suivant; // plante si la liste est vide
    - main renvoie toujours un int pas void

    - Il faut respecter l'indentation du code sinon il est illisible

    - Si l'insertion se fait toujours en fin, il est commode que la structure décrivant la liste comporte un pointeur sur le début de la liste et un pointeur sur le dernier élément de la liste.

    - Il est logique de passer à afficher() un pointeur, comme pour les autres fonctions, plutôt que la structure elle même

Discussions similaires

  1. Trier une liste chainée.
    Par gregb34 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 21/05/2006, 22h05
  2. Trier une liste de dossiers et de fichiers
    Par steveleg dans le forum Langage
    Réponses: 2
    Dernier message: 07/04/2006, 16h54
  3. trier une list
    Par elekis dans le forum C++
    Réponses: 4
    Dernier message: 23/03/2006, 12h01
  4. [c#] Trier une liste de nombres liés.
    Par Joad dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/05/2005, 11h17
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

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