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 chainée en c


Sujet :

C

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2020
    Messages : 13
    Points : 11
    Points
    11
    Par défaut liste chainée en c
    Bonjour j'ai fait une fonction qui doit créer et renvoyer une liste chaînée contenant les entiers de 1 à n dans l'ordre croissant , sauf que quand je l'affiche la liste est vide et je ne comprend pas pourquoi !

    voici mon 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>
     
     
     
    typedef struct tcell{
        int valeur;
        struct tcell *suivant;
    }tcell;
     
    typedef tcell *tliste;
     
     
    void affiche (tliste liste)
    {
     
        if(liste==NULL){
            printf("\n la liste est vide\n");
     
        }
        else{
     
            while(liste!= NULL)
            {
                printf("\n%d\n",liste->valeur);
                liste=liste->suivant;
            }  
        }
    }
     
    tliste suite1n(int n)
    {
        tliste l=NULL;
        int i=0;
        for(i=n;i>0;i--)
        {
            tcell *cellule=malloc(sizeof(tcell));
            cellule->valeur=i;
            printf("\nla valeur de la cellule est %d\n",cellule->valeur);
            cellule->suivant=l;             
        }
     
        affiche(l);
        return l;
     
    }
     
     
     
     
    int main(int argc, char *argv[])
     
    {  
        int n;
        sscanf(argv[1],"%d",&n);
     
        suite1n(n);
        return 0;
    }

    merci d'avance pour votre aide :)

  2. #2
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    4 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 4 225
    Points : 9 497
    Points
    9 497
    Par défaut
    Ton problème est trivial

    Tu crées 1 maillon mais jamais tu ne le chaînes avec les autres : ce sont tous des maillons "orphelins".
    Il faut faire à 1 moment dans ta fonction suite1n, l = cellule;.

    Sinon tes noms de variables sont mauvais et tu caches 1 pointeur derrière 1 typedef. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct s_cell {
        int value;
        struct s_cell* next;
    } t_cell;
     
    typedef t_cell* t_one_list;

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2020
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    d'accord merci beaucoup pour votre aide, par contre je ne comprends pas pourquoi vous dites que mes noms de variables sont mauvaises ?

  4. #4
    Expert éminent
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    juillet 2013
    Messages
    4 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : juillet 2013
    Messages : 4 225
    Points : 9 497
    Points
    9 497
    Par défaut
    Citation Envoyé par e5mm100 Voir le message
    pourquoi vous dites que mes noms de variables sont mauvaises ?
    au temps pour moi tu as préfixé avec t au lieu de t_.

    Mais par exemple :
    • void affiche (tliste liste) : affiche ici se rapporte à ta structure. En programmation objet, on dit que c'est 1 méthode. Et les verbes doivent être à l'infinitif afficher. Donc void list_display(tliste liste)
    • tliste suite1n(int n) : même remarque, mais ici c'est plus 1 constructeur. Donc tliste list_create_suite1n(int n)
    • tliste suite1n(int n) : ici n est le maximum de ta suite. D'autant plus que max doit être positif. Donc tliste suite1n(size_t max).
    • tliste l=NULL; : ici l est plutôt le premier maillon. Donc tliste head=NULL; ou tliste first_node=NULL;
    • il y a l'anglais vs le français. L'anglais se prête mieux pour le codage : adjectif toujours en premier, verbe court, ...

    Donc voila , c'est peut-être de la pinaille, cela s'appelle les conventions de codage (ou "coding style" en anglais) mais lorsque tu vas revenir sur ton code dans quelque temps, tes i, j, l, n, affiche te feront 1 nœud au cerveau.
    En programmation agile, on dit que le code doit être "self documented".

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    10 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 10 410
    Points : 28 299
    Points
    28 299
    Billets dans le blog
    1
    Par défaut
    Bonjou
    Citation Envoyé par e5mm100 Voir le message
    par contre je ne comprends pas pourquoi vous dites que mes noms de variables sont mauvaises ?
    On ne cache jamais une étoile derrière un type. L'étoile est un élément primordial du C. Le cacher par peur ou incompréhension n'a pour effet que de rendre le code illisible. Au bout de 2 semaines on revient dans le code on ne sait plus qui est pointeur et qui ne l'est pas.
    Et en plus ça ne le masque qu'à un niveau.
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
    	t_one_list toto;
    	fct(&toto);
    }
     
    void fct(t_one_list *x) {...}
    Et voilà, l'étoile est revenue. Mais en plus on ne voit qu'une étoile alors qu'en réalité le pointeur "x" est un pointeur double (il en contient réellement deux). A partir de là, c'est le crash assuré.

    Ici un exemple complet de liste chainé: https://pyqt.developpez.com/telechar.../Liste-chainee.
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2020
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2020
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjou

    On ne cache jamais une étoile derrière un type. L'étoile est un élément primordial du C. Le cacher par peur ou incompréhension n'a pour effet que de rendre le code illisible. Au bout de 2 semaines on revient dans le code on ne sait plus qui est pointeur et qui ne l'est pas.
    Et en plus ça ne le masque qu'à un niveau.
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main() {
    	t_one_list toto;
    	fct(&toto);
    }
     
    void fct(t_one_list *x) {...}
    Et voilà, l'étoile est revenue. Mais en plus on ne voit qu'une étoile alors qu'en réalité le pointeur "x" est un pointeur double (il en contient réellement deux). A partir de là, c'est le crash assuré.

    Ici un exemple complet de liste chainé: https://pyqt.developpez.com/telechar.../Liste-chainee.


    merci pour votre raiponce, dans ce cas là c'est mon prof qui nous a conseiller de cacher l'étoile par ce que les étoiles ça fait peur aux élèves et les doubles étoiles n'en parlons pas, mais je prend note de ce que vous m'avez dit pour les programmes que je fait à la maison

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    10 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 10 410
    Points : 28 299
    Points
    28 299
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par e5mm100 Voir le message
    dans ce cas là c'est mon prof qui nous a conseiller de cacher l'étoile par ce que les étoiles ça fait peur aux élèves et les doubles étoiles n'en parlons pas
    Oui, c'est pas nouveau de lire "le prof nous a conseillé de le cacher". Sauf qu'un prof de C ça apprend le C, tout le C !!! Ca apprend l'étoile, sa signification, sa manipulation, ça ne dit pas "ok ça vous fait peur donc on le cache". Surtout que comme je l'ai dit, le cacher n'enlève rien aux précautions à prendre (l'étoile existe toujours) mais justement empêche de prendre ces précautions (on ne la voit plus).
    J'imagine un prof de math qui dirait "ouais la multiplication c'est trop dur, vaut mieux faire une suite d'addition à la place"...
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

+ 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