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 :

Bibliothèque de listes chainées


Sujet :

C

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut Bibliothèque de listes chainées
    Bonjour,
    j'ai codé une petite bibliothèque pour la gestion des listes chainées et j'aurai voulue savoir si tout marché bien, pas de bug caché ou d'erreur de programmation... Voivi le code:
    list.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
    typedef struct _list
    {
      struct _list *prev;
      struct _list *next;
      void *data;
    } list;
     
    list *list_append( list *, void * );
    list *list_remove( list *, const void * );
    list *list_next( list * );
    list *list_prev( list * );
    list *list_first( list * );
    list *list_last( list * );
    void list_free( list * );
    size_t list_length( list * );
    list.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
    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    #include <stdio.h>
    #include <stdlib.h>
    #include "list.h"
     
    list *list_append( list *l, void *data )
    {
    list *m;
    /* --- --- */
      m = malloc( sizeof( *m ) );
      if( m == NULL )
      {
        fprintf( stderr, "Memoire insufisante\n" );
        list_free( l );
        exit( EXIT_FAILURE );
      }
      m->data = data;
      if( l == NULL )
      {
        m->prev = m->next = NULL;
        l = m;
      }
      else
      {
        l = list_last( l );
        m->prev = l;
        m->next = NULL;
        l->next = m;
      }
    /* --- --- */
    return( list_first( l ) );
    }
     
    list *list_remove( list *l, const void *lost_data )
    {
    list *p, *n;
    /* --- --- */
      if( l == NULL )
        return( NULL );
      p = l->prev;
      n = l->next;
      lost_data = l->data;
      free( l );
      p->next = n;
      n->prev = p;
    /* --- --- */
    return( list_first( l ) );
    }
     
    list *list_next( list *l )
    {
    /* --- --- */
      if( l == NULL )
        return( NULL );
    /* --- --- */
    return( l->next );
    }
     
    list *list_prev( list *l )
    {
    /* --- --- */
      if( l == NULL )
        return( NULL );
    /* --- --- */
    return( l->prev );
    }
     
    list *list_first( list *l )
    {
    /* --- --- */
      if( l == NULL )
        return( NULL );
      while( l->prev != NULL )
        l = l->prev;
    /* --- --- */
    return( l );
    }
     
    list *list_last( list *l )
    {
    /* --- --- */
      if( l == NULL )
        return( NULL );
      while( l->next != NULL )
        l = l->next;
    /* --- --- */
    return( l );
    }
     
    void list_free( list *l )
    {
    list *p;
    /* --- --- */
      l = list_last( l );
      while( l != NULL )
      {
        p = list_prev( l );
        free( l );
        l = p;
      }
      l = NULL;
    /* --- --- */
    return;
    }
     
    size_t list_length( list *l )
    {
    int n = 0;
    /* --- --- */
      l = list_first( l );
      while( l != NULL )
      {
        n++;
        l = list_next( l );
      }
    /* --- --- */
    return( n );
    }
    Merci.

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bonsoir,
    A première vue rien ne me choque, cette implémentation en vaut une autre

    On a eu la même idée en lisant les topics je vois

    Les pages sources vont avoir foison de listes chaînées

    Cependant, ça manque un peu de commentaires tout ça

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Bibliothèque de listes chainées
    Citation Envoyé par gege2061
    j'ai codé une petite bibliothèque pour la gestion des listes chainées et j'aurai voulue savoir si tout marché bien, pas de bug caché ou d'erreur de programmation... Voici le code:
    Ca a l'air pas mal. J'ai pas compris comment fonctionne list_remove(). A quoi sert le 2 eme parametre ?
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    ... En effet l'expression " lost_data = l->data; " modifie simplement la valeur du pointeur lost_data, mais l'utilisateur de la fonction ne peut pas la récupérer.... je veux dire, c'est comme faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void func(int i)
    {
         i = 2;
    }
    Ici le paramètre réel ne change pas de valeur, seul le paramètre formel i change de valeur.

    Si tu veux que l'appelant de list_remove récupère le pointeur data qui était stocké dans l'élément à retirer, il faut que tu modifie un pointeur, en demandant un double pointeur comme argument:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    list *list_remove( list *l, const void **lost_data ) 
    {
    ...
    if (lost_data != NULL) *lost_data = l->data;
    ...
    }
    A condition bien sûr que j'aie compris ce que tu voulais faire.
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Bravo Rolka, je pense que c'est effectivement ce qu'il veut faire, mais dans ce cas, l'argument lost_data n'a pas besoin d'être const

  6. #6
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Caine
    Bravo Rolka, je pense que c'est effectivement ce qu'il veut faire, mais dans ce cas, l'argument lost_data n'a pas besoin d'être const
    j'ai l'habitude de mettre const tout ce qui peut l'être ;-) (sauf si c'est débile comme const void** const lost_data comme argument)
    Ici, const void** lost_data signifie que **lost_data ne peut pas être modifié, et çà, çà me paraît tout à fait logique, car la fonction n'est pas censée avoir le droit de modifier les données sur lesquelles pointait le membre data.
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  7. #7
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    La donnée d'accord, mais le pointeur void * doit être changé
    Hors dans le cas de
    Je ne suis pas sûr de qui est la constante exactement
    [edit]
    Non c'est bon, le const semble bien s'appliquer à la donnée pointée du void **, ta méthode est correcte.

    Mais, là où je m'interroge sur le code original, c'est sur le test à NULL de lost_data !
    [/edit]

  8. #8
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Rq: j'ai édité mon message.

    Citation Envoyé par Caine
    La donnée d'accord, mais le pointeur void * doit être changé
    Hors dans le cas de
    Je ne suis pas sûr de qui est la constante exactement
    Là c'est l'expression "**Data" qui est constante.

    Quelques autres possibilités:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const void * const * Data // **Data constant, et *Data aussi
    void * const * Data // On peut modifier **Data, mais pas *Data
    void ** const Data // On peut tout modifier sauf Data
    Or dans notre cas on veut modifier le pointeur " *data_lost ".
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  9. #9
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Caine
    là où je m'interroge sur le code original, c'est sur le test à NULL de lost_data !
    Pareil, je ne réfléchis pas, c'est du code réflexe:
    on on écris *lost_data, donc je vérifie si lost_data est bien différent de NULL... Sinon plantage au cas où il est NULL... C'est possible, imagine que l'utilisateur ne souhaite pas récupérer le pointeur ? Il pourra alors passer la valeur NULL en toute sécurité
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  10. #10
    mat.M
    Invité(e)
    Par défaut
    j'ai l'habitude de mettre const tout ce qui peut l'être
    const est un mot clé du C++ , pas du C si je ne me trompe ?

    Sinon pour faire dans la facilité , si le compilateur de l'initiateur de ce post supporte le C++ il peut utiliser la STL

  11. #11
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par mat.M
    j'ai l'habitude de mettre const tout ce qui peut l'être
    const est un mot clé du C++ , pas du C si je ne me trompe ?
    Non, const est standard en C... C++ l'étend aux classes et aux fonctions membres, mais çà existe aussi en C... Tiens le prototype de la focntion strcpy par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *strcpy(char *dest, const char *src);
    Citation Envoyé par mat.M
    Sinon pour faire dans la facilité , si le compilateur de l'initiateur de ce post supporte le C++ il peut utiliser la STL
    Yavait pas un brin de C++ dans ce thread .... Restons dans le C
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  12. #12
    mat.M
    Invité(e)
    Par défaut
    Tiens le prototype de la focntion strcpy par exemple:
    oui mais d'où obtiens-tu ce prototype ????
    Dans une aide pour ....C++ ( genre MSDN ) qui couvre aussi le C ??
    Est-ce que Kernigan et Ritchie parlent-ils de "const" dans leur ouvrage de programmation du C ?? ( "Le Langage C" )

  13. #13
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    ce n'est qu'un exemple, const C'EST du C standard un point c'est tout, qu'est-ce que tu veux que je te dise ? j'ai n'ai pas la norme mais j'ai le dernier draft paper accessible gratuitement et çà parle de const partout....

    Et ce prototype est tiré de la "C runtime library référence" de mon compilo, avec préicisions "C ANSI" (C89 pour mon compilo, donc çà fait quand même bien longtemps).

    Qu'est-ce qu'il te faut de plus, qu'Emmanuel confirme ??? Et bien va voir ses sources (http://emmanuel-delahaye.developpez.com/clib.htm) et tu verras aussi du const là où il faut... une interview de K&R peut-être ?
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    mat.M >> si tu te souviens des prototypes de fonctions du C de K&R c'était ça par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    main(argc, argv)
    int argc;
    char *argv[];
    Il n'était pas question de const char *.
    Je viens de voir sur un site que const existe depuis la norme ANSI.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mat.M
    Tiens le prototype de la focntion strcpy par exemple:
    oui mais d'où obtiens-tu ce prototype ????
    Dans la norme ou dans n'importe quel fichier d'aide pour compilateur C 'ANSI'.
    Est-ce que Kernigan et Ritchie parlent de "const" dans leur ouvrage de programmation du C ?? ( "Le Langage C" )
    Pas dans l'édition originale, car 'const' (comme 'void') n'existe que depuis la normalisation du C (ANSI 1989, ISO 1990). Ce mot clé est décrit dans le Kernighan et Ritchie ed.2. Il serait temps de se mettre à jour... On en est à C99...
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut

    Prenons les choses dans l'ordre:
    Cependant, ça manque un peu de commentaires tout ça
    C'est l'un de mes principaux défauts!
    J'ai pas compris comment fonctionne list_remove(). A quoi sert le 2 eme parametre ?
    C'est pour que l'utilisateur puisse récupérer son pointer sur les données misent dans la liste.
    Pareil, je ne réfléchis pas, c'est du code réflexe:
    on on écris *lost_data, donc je vérifie si lost_data est bien différent de NULL... Sinon plantage au cas où il est NULL... C'est possible, imagine que l'utilisateur ne souhaite pas récupérer le pointeur ? Il pourra alors passer la valeur NULL en toute sécurité
    Moi non plus sur ce coup la j'ai pas réfléchie!

    Merci de votre aide.

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gege2061
    Cependant, ça manque un peu de commentaires tout ça
    C'est l'un de mes principaux défauts!
    Ca ne me gène pas si le code est clair, ce qui, dans l'ensemble, est le cas ici.
    J'ai pas compris comment fonctionne list_remove(). A quoi sert le 2 eme parametre ?
    C'est pour que l'utilisateur puisse récupérer son pointer sur les données misent dans la liste.
    Dans ce cas, il faut soit retourner le pointeur, soit passer l'adresse du pointeur. Rien de tout cela n'est fait ici.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Dans ce cas, il faut soit retourner le pointeur
    Je ne peut pas, je retoune déjà la nouvelle liste.
    Citation Envoyé par Emmanuel Delahaye
    soit passer l'adresse du pointeur.
    Je vais rectifier, merci.

  19. #19
    mat.M
    Invité(e)
    Par défaut
    ce n'est qu'un exemple, const C'EST du C standard un point c'est tout, qu'est-ce que tu veux que je te dise ? j'ai n'ai pas la norme mais j'ai le dernier draft paper accessible gratuitement et çà parle de const partout....
    eh oh du calme !
    Les autres personnes ont démontré AVEC CALME (emannuel et Trap D ) que const existait depuis C99

  20. #20
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mat.M
    Les autres personnes ont démontré AVEC CALME (emannuel et Trap D ) que const existait depuis C99
    Hum... C90. Je veux bien rester calme, mais pas indéfiniment!
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. bibliothèque C liste chainée
    Par youp_db dans le forum Linux
    Réponses: 3
    Dernier message: 15/05/2008, 18h05
  2. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  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