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 :

tri dans une liste chainée.


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut tri dans une liste chainée.
    je suis un débutant en programmation en C. je suis sur un problème qui traite sur les listes chainées, en effet il faut ranger les éléments du champ val dans l'ordre croissant après leur saisie. j'ai joint a ce message le code source que j'ai saisi et j'espère ferment avoir une solution a mon problème. en fait après avoir compilé ce projet a l'exécution vous remarquerz qu'après la saisie des éléments, au moment de l'affichage c'est la même valeur du 1er minimum trouvé qui revient à chaque fois et je ne sais que faire. s'il vous plait c'est très urgent et important pour moi.

    types.h
    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
    #ifndef __TYPES_H
    #define __TYPES_H
       typedef struct Listes{
               int val;
               struct Listes *next;
               } Liste;
               typedef Liste *liste;
     
          liste ajouter(liste les);
         liste trier (liste la);    
            void afficher(liste la);   
     
     
     
     
    #endif
    trier.c
    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
    #include <stdlib.h>
    #include "types.h"
    #include <stddef.h>
     
    liste trier(liste la)
    {// ici on va ranger les elemants dans l'ordre croisssant avant de les afficher...
     
       liste temp, temp1, temp3;
       int min, a; 
       temp3=(liste)malloc(sizeof(Liste));
       temp1=(liste)malloc(sizeof(Liste));
       temp=la;
     
       while(temp!=NULL)
       {  min=temp->val;
         temp1=temp->next;           
     
         while(temp1!=NULL)
          {           
        if(min > temp1->val)
        {  temp3=temp1;      // le 3è tempraire me permet de savoir l'adresse de l'élement ou j'ai reperé le minimum pour faciliter l'échange
            min=temp3->val; }                
            temp1=temp1->next; } //a ce niveau je sors de la 2iem boucle
           a=temp->val; //echange des 2 elements...
           temp->val=min;
           temp3->val=a;       
     
           temp=temp->next;                        
            }          
     
            return la; }
    ajouter.c
    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
    #include <stdlib.h>
    #include "types.h"
    #include <stddef.h>
     
     
    liste ajouter(liste les)
    {   
       liste nouveau;
       liste temp;
       nouveau=(liste)malloc(sizeof(Liste));
      // nouveau=NULL;
        temp=les;
     
          printf("Valeur:\t");
          scanf("%d", &(nouveau->val));
          nouveau->next=NULL;
     
          if (les==NULL)
          { printf("Initialisation...\n");
            return nouveau;   }
     
          else {
     
              while(temp->next!=NULL)
               temp=temp->next;   
               temp->next=nouveau;
     
              return les; 
              }
              }
    afficher.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdlib.h>
    #include "types.h"
    #include <stddef.h>
     
    void afficher(liste la)
    {
         liste tem;
         tem=la;
     
         while(tem!=NULL)
         {   printf("%3d\t", la->val);
          tem=tem->next; 
          }
          }
    main.c
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include "types.h"
    #include <stddef.h>
     
    int main(int argc, char *argv[])
    {
        int a;
    liste l;
    l=(liste)malloc(sizeof(Liste)); 
    l=NULL;  
     
     printf("*******************    MENU    *******************\n");
     m: printf("\t\t1: Saisir des elements \n");
      printf("\t\t2: affiche les elements saisis \n");
       printf("\t\tAutre: SORTIE \n");
      printf("Votre choix:\t");
      scanf("%d", &a);
      switch (a) {
             case 1: { l=ajouter( l);
             goto m;
               break;
               }
             case 2: { l= trier(l);
                       afficher(l);
                       goto m;
                    break;
                    }  
       default : goto s;
       break;
    }
     
     
    s: system("PAUSE");	
        return 0;
    }

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    1- Remarques générales
    - le code est très mal présenté avec une indentation et un positionnement des { et } aléatoires. Cela ne facilite pas la lecture et ne donne pas envie de se plonger dans ce code
    - Pourquoi <stddef.h> est-il inclu dans tous ces fichiers ?

    2- main.c.
    - Ces goto sont à supprimer : ils ne sont absolument pas justifés. Faire un boucle do ou while
    - Le compilateur aurait dû signaler que les break ne seront jamais exécutés à cause des goto
    - Pourquoi y a t-il des blocs dans les case ?
    - A quoi sert l'allocation ci-dessous ? A faire une fuite mémoire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    liste l;
    l=(liste)malloc(sizeof(Liste)); 
    l=NULL;
    3-types.h :
    - tous les identificateurs commençant par deux _ (comme __TYPES_H) sont réservés pour un usage futur. Ils ne doivent donc pas être définis par le programmeur
    - Il n'est pas astucieux de masquer un pointeur par un typedef et surtout lorsque le nom du type obtenu est si voisin du type pointé :
    4- ajouter.c
    - ne compile pas : manque <stdio.h>
    - manque les tests de réussite de l'allocation

    5- afficher.c
    - Affiche toujours et uniquement le premier élément de la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         while(tem!=NULL)
         {
             printf("%3d\t", la->val);
             tem=tem->next;
          }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Le code de trier() est presque bon, mais il a un défaut vicieux : temp3 est mal initialisé.
    Si le minimum du sous-tableau restant à trier est en début du sous-tableau, donc en temp, alors la condition if(min > temp1->val) n'est jamais remplie et temp3 reste inchangé et garde la valeur qu'il avait avant.

    Le code suivant corrige ce défaut (avec des boucles for au lieu de boucles while pour varier les plaisirs)
    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
    void trier(liste la)
    {// ici on va ranger les elements dans l'ordre croisssant avant de les afficher.
       liste temp, temp1, temp3;
       int min;
       for(temp=la ; temp!=NULL ; temp=temp->next)
       {
         temp3=temp;
         min=temp->val;
         for(temp1=temp->next ; temp1!=NULL ; temp1=temp1->next)
         {
            if(min > temp1->val)
            {
               temp3=temp1; // le 3è temporaire est l'adresse de l'élement où se trouve le minimum
               min=temp3->val;
            }
         }
         temp3->val=temp->val; //echange des 2 elements...
         temp->val=min;
       }
    }
    A noter qu'il est inutile de retourner la : la tête de liste est inchangée par ce code. Seuls les données sont changées de place
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. suppression dans une liste chainée
    Par tomtom421 dans le forum C
    Réponses: 8
    Dernier message: 21/04/2007, 16h29
  2. Réponses: 10
    Dernier message: 08/12/2006, 02h18
  3. récupérer un objet dans une liste chainée
    Par marsuwhite dans le forum Langage
    Réponses: 4
    Dernier message: 05/06/2006, 14h05
  4. Réponses: 2
    Dernier message: 10/10/2005, 02h25

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