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 :

Linked list et structures


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut Linked list et structures
    Bonjour

    Je voudrais que mon programme puisse ajouter des mots grace a l'allocation dynamique, et a la linked list.
    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
    # include <stdio.h>
    # include <string.h>
    # include <stdlib.h>
     
    struct list  {
      char word [ 50 ];
      int ele;
      struct list * next;
      //struct list * prior;
      };
     
    void Printlist (struct list *);
     
    int main ( void )
    { int choice;
      struct list *start;
      start = (struct list *) malloc (sizeof (struct list));
      start->ele = 1;
     
    do {
        printf("\n\n\t 1.  Add a word");
        printf("\n\t 2.  Delete a word");
        printf("\n\t 3.  Search for and display");
        printf("\n\t 4.  Display data in queue order");
        printf("\n\t 5.  Quit");
        printf("\n\n\t Enter your choice : ");
        scanf("%i", & choice);
        start->next = (struct list *) malloc (sizeof(struct list));
     
        if ( choice == 1 ) {
          printf("\n\tEnter the word to add : ");
          scanf("%s", start->word);
         }
     
        if ( choice == 3 ) {
            Printlist ( start );
            }
     
        } while ( choice != 5 );
     
    return 0;
    }
     
    void Printlist (struct list * x)
    {
      while ( x != NULL ) {
            printf ("Element %i is : %s \n", x->ele, x->word);
            x = x->next;
            }
    }
    Je ne sais pas trop comment afficher les elements de la liste correctement de facon a ce que soit une liste numerotee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    element 1 is mot
    element 2 is mot2
    element 2 is mot3
    ...
    Merci

  2. #2
    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 virtuadrack Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void Printlist (struct list * x)
    {
      while ( x != NULL ) {
            printf ("Element %i is : %s \n", x->ele, x->word);
            x = x->next;
            }
    }
    Je ne sais pas trop comment afficher les elements de la liste correctement de facon a ce que soit une liste numerotee
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    element 1 is mot
    element 2 is mot2
    element 2 is mot3
    ...
    Avec un compteur ? Tu as une boucle, ça ne devrait être trop difficile...

  3. #3
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    J'ai regle le probleme du compteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Printlist (struct list * x)
    {
      int v = 1;
      while ( x != NULL ) {
            printf ("\n\tElement %i is : %s \n", v++, x->word);
            x = x->next;
            }
    }
    Mais j'ai toujours pas la suite de la liste quand la fonction Printlist est executee.

    L'output me donne que le dernier mot tape sans pour autant afficher les autres mots
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          Element 1 is : mot1 
          Element 2 is :
    Quelqu'un a des idees a ce sujet ?

  4. #4
    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 virtuadrack Voir le message
    J'ai regle le probleme du compteur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            printf ("\n\tElement %i is : %s \n", v++, x->word);
    Même si c'est techniquement possible, je déconseille formellement de mettre une opération unaire en tant que paramètre d'une fonction. En effet, le comportement dépend de l'implémentation et l'intention du programmeur est peu claire. Il est beaucoup plus clair de séparer les opérations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            printf ("\n\tElement %i is : %s \n", v, x->word);
            v++;
    Faire une chose à la fois, mais la faire bien. Si le compilateur veut optimiser le code produit, il le fera...
    Mais j'ai toujours pas la suite de la liste quand la fonction Printlist est executee.
    L'output me donne que le dernier mot tape sans pour autant afficher les autres mots
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          Element 1 is : mot1 
          Element 2 is :
    Quelqu'un a des idees a ce sujet ?
    Est-tu sûr que c'est l'adresse du début de la liste qui a été passée à la fonction ?

  5. #5
    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
    La liste est mal construite et mal initialisé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
      struct list *start, *p;
      start = malloc (sizeof (struct list));
      start->ele = 1;
           /* mettre start->next à NULL : pas de suivant */
       start->next = NULL
    ....   
       if ( choice == 1 )
       {
           /* insérer derriere le dernier, pas derriere start */
           /* Chercher le dernier*/
       for(p = start; p->next != NULL; p = p->next){}
           /* insérer derriere un nouvel élément */
       p->next = malloc (sizeof(struct list));
           /* mettre à jour les champs du nouvel élément */
       p->next->next = NULL;
       p->next->ele = p->ele+1; /* ?? ou autre chose, je ne peux pas deviner le rôle de ele */
          /* Ajouter le mot à l'avant dernier*/
       printf("\n\tEnter the word to add : ");
       scanf("%s", p->word);
       }
    A noter que le dernier n'a pas de mot stocké (on a créé une cellule d'avance parce que celle pointée par start est créée sans être initialisée d'un mot, ce qui facilite peut être la tâche mais n'est pas terrible. Il faudra y penser pour la destruction d'un mot) et il faut en tenir compte pour l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Printlist (struct list * x)
    {
      int v = 1;
      while (x->next != NULL )
     {
        printf ("\n\tElement %i is : %s \n", v++, x->word);
        x = x->next;
      }
    }

  6. #6
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Par défaut
    Merci pour les corrections, mais il y a un bug.

    Quand j'ajoute 3 mots par exemple a la liste, l'output me rajoute une ligne
    je crois bien qu'il y a un probleme d'allocation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      start = malloc ( sizeof (struct list));
      start->next = NULL;
    J'ai essaye de mettre start = NULL, mais il y a une Seg Fault quand le choix 1 est execute.

    Quelqu'un saurait regle ce probleme ?

  7. #7
    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
    Quel est actuellement le code que tu utilises ?

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

Discussions similaires

  1. liste chainée & structure
    Par hunter99 dans le forum C
    Réponses: 8
    Dernier message: 10/12/2006, 16h31
  2. les listes chaineés(structures)
    Par snakemetalgear dans le forum C
    Réponses: 18
    Dernier message: 14/11/2006, 18h09
  3. Récupération d'une liste de structures Oracle via Java
    Par MagikMarcel dans le forum Langage
    Réponses: 2
    Dernier message: 29/06/2006, 16h34
  4. Réponses: 7
    Dernier message: 18/04/2006, 17h44
  5. liste et structure
    Par dinver dans le forum C
    Réponses: 5
    Dernier message: 28/11/2005, 09h38

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