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 :

Listes chainées en C


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 11
    Par défaut Listes chainées en C
    Bonjour a tous,

    Voila, je viens d’implémenter les listes chainées en C, j'aimerai avoir vos avis. Je donne juste le module ou est le code qui concerne les listes.

    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
    #include <stdlib.h>
    #include <stdio.h>
    #include "list.h"
     
    struct Cell
    {
        int integer;
        struct Cell *next;
    };
     
    struct LinkedList
    {
        struct Cell *first;
        struct Cell *it;
    };
     
    void createListe(struct LinkedList *list) /* Initialise la list */
    {
        list->first = NULL;
        list->it = NULL;
    }
     
    void deleteListe(struct LinkedList *list)
    {
        list->it = list->first;
        struct Cell *temp;
     
        while((list->it)->next != NULL)
        {
            temp = (list->it)->next;
            free(list->it);
            list->it = temp;
        }
     
        free(list->it);
     
        list->it = NULL;
        list->first = NULL;
    }
     
    void incrementIt(LinkedList *list)
    {
        list->it = (list->it)->next;
    }
     
    void push(struct LinkedList *list, int x)
    {
        struct Cell *p = malloc(sizeof(struct Cell));
     
        p->next = list->first; // First vaut NULL si la list est vide
        p->integer = x;
     
        list->first = p;
        list->it = p;
    }
     
    void printList(struct LinkedList *list)
    {
        list->it = list->first;
     
        if(list->it == NULL)
            printf("<empty>");
     
        while(list->it != NULL)
        {
            printf("%d ", (list->it)->integer);
            list->it = (list->it)->next;
        }
     
        printf("\n");
    }
    En faite la ou j’ai un doute c'est sur l'utilisation des doubles flèches, notamment parce que j’en utilise 2 dans une même expression.

    Je declare ma liste comme ceci:
    Et je fais aussi un typdef dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct LinkedList LinkedList;
    Merci d'avance.

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Pourquoi LinkedList ?
    Ca ert just à garder le pointeur sur le 1er élément, dans quel intérêt ?

    Ton programme doit garder en permanence un pointeur sur le 1er élément dans la chaine. Style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(){
    struct Cell *first;
    struct Cell *chaine;
     
    // tu initiales ta chaine (en gros tu crées le 1er élément) puis
    first = chaine;
     
    // tu bosses avec le pointeur chaine qui se déplace et quand tu veux lister la chaine tu repars de first
     
    // attention first est en "lecture seule" et ne doit jamais se déplacer
    }

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 11
    Par défaut
    Dans la structure LinkedList, ya effectivement un pointeur sur le premier élément et aussi une clé qui est placer selon le besoin. La clé que j'appelle it(rateur).

    Après l’intérêt de mettre les deux variables dans une structure et que je peut faire des appels de fonction du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    push(maList, 7);
    printList(maList);
    , par exemple.

    Ou alors la fonction ajouterApresCle() que j'ai pas encore implémentée qui est simplement appeler comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ajouterApresCle(maListe);

  4. #4
    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
    Pourquoi LinkedList ?
    Ca ert just à garder le pointeur sur le 1er élément, dans quel intérêt ?
    Pour la clarté du code, encapsuler ce pointeur dans une structure est bénéfique. De plus, cela permet éventuellement de compléter la définition de la liste avec d'autres informations (pointeur de queue, nombre d'éléments, ici un itérateur,...)

    Par contre, la liste doit être déclarée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LinkedList list;
    createListe(&list); // MAIS ne crée pas la liste !
    ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    LinkedList * createListe() /* crée et initialise la list */
    {
      LinkedList * list= malloc(sizeof *list);
      if(list != NULL)
      {
        list->first = NULL;
        list->it = NULL;
      }
      return list;
    }
    ...
    LinkedList *list = createListe();
    et la récupération de la mémoire allouée est faite dans deleteListe() par un free(list) à la fin.

    Le coup de l'itérateur n'est pas terrible à cause des modifications implicites et inattendues (comme dans printList()) qui le rendront difficile à utiliser de façon fiable.

    j’ai un doute c'est sur l'utilisation des doubles flèches
    Pas de problèmes et inutile de sur-parenthèser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list->it = list->it->next;

  5. #5
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    oups. J'avais mis une analyse foireuse !!! (meesage supprimé)

    Ok j'ai compris le principe.
    J'ai été perturbé par la fonction push. J'ai plus l'habitude de push_back.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 11
    Par défaut
    Le coup de l'itérateur n'est pas terrible à cause des modifications implicites et inattendues (comme dans printList()) qui le rendront difficile à utiliser de façon fiable.
    A quel niveau dans printList() ?

    Sinon merci pour les precisions

  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
    Citation Envoyé par samos2 Voir le message
    A quel niveau dans printList() ?

    Sinon merci pour les precisions
    L'utilisateur pense utiliser cet itérateur pour se déplacer et se positionner lui-même dans la liste.
    Tu utilises ton itérateur pour parcourir la liste afin de l'afficher ce qui détruit sa valeur inutilement et l'utilisateur a maintenant un itérateur à NULL. C'est un comportement inattendu et inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void printList(LinkedList *list)
    {
        struct Cell *it = list->first;
        if(it == NULL)
            printf("<empty>");
        while(it != NULL)
        {
            printf("%d ", it->integer;
            lit = it->next;
        } 
        printf("\n");
    }
    Le problème est sans importance dans deleteListe() puisque de toute façon la liste est détruite.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 11
    Par défaut
    Ok ça marche. Merci pour ton aide diogene.

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  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