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 :

liste simplement chainée


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 24
    Points
    24
    Par défaut liste simplement chainée
    bonjour mon but est de créer une liste chainée de noms et les placer a l'ordre alphabétique ;sonc j'ai la tete de la chaine et le pointeur suiv et prec pour placer la structure (element) dans son emplacement , jusqu'ici j'ai pu l'insérer au début et au milieu , mais quand je veux placer un nom a la fin ça beug , regardez le code
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
     typedef struct p{
         char nom[10];
         struct p *suivant;
    }element;
    insertion(element **tete,char*mot )
    {
     int cmp=0;
    element *suiv=*tete,*pred=NULL;
    element *nv=(element*)malloc(sizeof(element));
    //initialisation
    strcpy(nv->nom,mot);nv->suivant=NULL;
    // si la chaine est vide
      if (*tete==NULL){*tete=nv;}  //sinon
      else
      {
         printf("----------------\n");
          while(strcmp(suiv->nom,mot)<0 && suiv!=NULL)
            {
             pred=suiv;
             suiv=suiv->suivant;
            }
              //insertion au debut
             if(pred==NULL){nv->suivant=*tete;*tete=nv;printf("insertion au debut\n");}
             else
                {
                 if(suiv==NULL){printf("insertion a la fin ");}//pred->suivant=nv;nv->suivant=NULL;} //si on est a la fin
                 else
                   {
                     printf("au milieu \n");
                     pred->suivant=nv;nv->suivant=suiv;
                   }
     
                }
     
      }
    }
    int main(void)
    {
     int i;
     char ph[10] ;
     element *tete=NULL,*po;
      for(i=0;i<10;i++)
      {
         printf("\n entrer un nom   :  ");
         gets(ph);
         insertion(&tete,ph);
         printf("\n la liste est \n  ");
          po=tete;
         while(po!=NULL)
          {
             printf("%s   ",po->nom);
             po=po->suivant;
          }
      }
     
    }

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Bonjour,
    "ca beug" (ou pour être exact, ca bug ou ca bogue) n'est pas un symptome valide.

    Quel est ton symptome? Qu'en penses-tu?


    Cela dit, sans regarder ton code, si ton problème c'est l'ajout au bout, c'est probablement parce que tu vas "une fois trop loin".
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    autres points, en regardant ton code:

    ph[10], c'est trop petit, un nom de plus de 9 lettre, c'est possible.
    Tu utilises gets, donc ton code est dangereux. il faut utiliser autre chose (fgets, par exemple)

    po, ph, nv et p ne sont pas des noms valables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct element{
         char nom[10];
         struct element *suivant;
    }element;
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour pour ma part, pourquoi la fonction insertion à tel été écrite avec un ** ?pourquoi opté pour cette forme ? quand on peut faire simple ?.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 24
    Points
    24
    Par défaut merci pour les réponses
    le but ici n'est pas question d'écrire simple ou pas mais justement pourquoi l'insertion à la fin ne marche pas ;
    autrement je veux savoir ou est l'erreur que j'ai faite . merci pour votre aides

  6. #6
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Oui, monseigneur l'idée n'est pas d'écrire de la manière la plus simple comme vous le souhaitiez voir mettre toutes les instructions sur une même ligne mais, ce n'est pas également à nous bénévole de trouver le bogue à votre place il existe un outil très bien conçu qui s'appelle un débogueur vous connaissez ?
    bref, l'algorithme de la fonction insertion est à revoir surtout la ligne 20 à vous de faire le nécessaire monseigneur.
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  7. #7
    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 a une anomalie grave :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(strcmp(suiv->nom,mot)<0 && suiv!=NULL)...
    Si suiv == NULL alors suiv->nom plante.

    Il faut se souvenir que pour l'opérateur && ( et aussi pour ||) l'ordre d'évaluation de ses opérandes est fixé : celui de gauche avant celui de droite et que si l'évaluation de l'opérande de gauche permet de déterminer la valeur de l'expression, celui de droite n'est pas évalué.

    Donc ceci n'est pas équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(suiv!=NULL && strcmp(suiv->nom,mot)<0)...
    et ne plante pas si suiv == NULL
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 24
    Points
    24
    Par défaut merci beaucoup diogene et a tous les intervenants
    sambia , je m'excuse si je vous ai offensé , c'était pas mon but , car tu as parlé de la simplicité alors que je cherchais ou j'ai fait l'erreur . finalement diogene je te remercie amplement , c résolu . merci encore a tous els intervenants pour l'aide précieuse que vous apportez aux débutants . bonne soirée

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Ta première erreur, c'est de ne pas avoir fait simple...
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2014
    Messages : 18
    Points : 24
    Points
    24
    Par défaut je ne peux pas
    c la seule méthode simple que j'ai pu faire , je sais pas faire simple si vous avez un lien ou vous pouvez m'expliquer comment faire simple , je vous serait reconnaissant . merci encore une fois

  11. #11
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour

    Citation Envoyé par débutant_01 Voir le message
    sambia , je m'excuse si je vous ai offensé , c'était pas mon but , car tu as parlé de la simplicité alors que je cherchais ou j'ai fait l'erreur
    J'ai fait référence a la simplicité pour la lisibilité du code mais aussi son algorithme et au final, sans te dire pourquoi ça ne marche pas car c'est avant tout à toi de faire le nécessaire, je tes indiquer la ligne 20 de ton code source ( chez moi c'est le cas chez les autres ?) qui est la ligne correspondant à la remarque de @diogene
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Bonjour pour ma part, pourquoi la fonction insertion à tel été écrite avec un ** ?pourquoi opté pour cette forme ? quand on peut faire simple ?.
    Il y a des gens pour qui l'insertion dans une liste chaînée via chainon**, c'est la manière simple. Le pointeur de pointeur pointe naturellement sur le pointeur qu'on va devoir modifier (et ainsi on n'a pas besoin d'un test spécial pour la tête de liste).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fusion de deux liste simplement chainée
    Par mdh12 dans le forum Débuter
    Réponses: 6
    Dernier message: 14/01/2010, 19h23
  2. Tri d'une pile avec liste simplement chainée
    Par thecabbages dans le forum C
    Réponses: 3
    Dernier message: 17/12/2009, 21h08
  3. question liste simplement chainée
    Par american dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 15/03/2009, 21h45
  4. Réponses: 3
    Dernier message: 25/10/2006, 19h08
  5. Liste simplement chainée
    Par sorry60 dans le forum C
    Réponses: 54
    Dernier message: 29/11/2005, 22h05

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