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ées fonction initialisation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 23
    Par défaut Liste chainées fonction initialisation
    Bonjour en lisant un cours sur le C , plus particulièrement le chapitre sur les listes chaînes

    je ne comprends pas un point :

    Tout d'abord on créer une structure qu'on reutiliserat à chaque fois qu'on veut créer un élément de la liste voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct Element Element;
    struct Element
    {
    int nombre;
    Element *suivant;
    };
    Ensuite on créer une structure Liste qui nous servira une seul fois pour savoir ou se trouve le premier élément de la liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     typedef struct Liste Liste;
    struct Liste
    {
    Element *premier;
    };
    Enfin on créer une fonction qui aura pour but de créer la structure de contrôle et le premier élément de la liste

    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
    Liste *initialisation()
    {
    Liste *liste = malloc(sizeof(*liste));
     
    Element *element = malloc(sizeof(*element));
     
    if (liste == NULL || element == NULL)
    {
    exit(EXIT_FAILURE);
    }
    element->nombre = 0;
    element->suivant = NULL;
    liste->premier = element;
     
    return liste;
    }
    Dans la ligne 3 du dernier code

    on créer un pointeur de type Liste qu'on appelle liste et on alloue à ce pointeur un nombre d’octets et c'est le paramètre de sizeof que je ne comprends pas "*liste" c'est un pointeur , mais qui pointe vers quoi , puisque je suis justement entrain de le définir ...c'est un peux flou à ce niveau là

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    sizeof est un opérateur, il doit être suivi d'un type entre parenthèse ou d'une expression.
    Dans le premier cas, on obtient la taille du type. Exemple : sizeof(char) ===> 1
    Dans le second l'expression n'est pas évaluée, le sizeof va s'intéresser au type de l'expression en en donner la taille mais ne va pas l’exécuter. Exemple : long i=0; printf("%d\t" , sizeof( i = 1+1 ) ); printf("%d\n" , i ); va afficher 8 0 car l'expression du sizeof va trouver la taille de i donc 8, et ici à aucun moment i n'est modifié, il vaut donc toujours 0!

  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    PS : peux-tu éditer tes codes pour supprimer tous les astérisques

    Citation Envoyé par woshou Voir le message
    C'est le paramètre de sizeof que je ne comprends pas "*liste" c'est un pointeur , mais qui pointe vers quoi
    Documentation de sizeof en anglais (<- lien cppreference)

    En gros, sizeof va retourner le nombre d'octets, qu'on va donner à malloc pour que ce dernier puisse allouer un "morceau de mémoire"

    Et sizeof a 2 fonctionnements
    • Soit avec un type. Dans ton cas, on peut faire malloc( sizeof(struct Liste) )
    • Soit avec une expression. Ici c'est l'expression *liste. Il faut déférencer le pointeur pour avoir la taille de notre structure (struct Liste) sinon on aurait la taille d'un pointeur (4 ou 8 octets)

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 23
    Par défaut
    Soit avec une expression. Ici c'est l'expression *liste. Il faut déférencer le pointeur pour avoir la taille de notre structure (struct Liste) sinon on aurait la taille d'un pointeur (4 ou 8 octets)

    Merci pour les différentes réponse!

    C'est plus clair , mais ça veut dire quoi déférencer le pointeur ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Déférencer c'est accéder à la donnée pointée.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2017
    Messages : 23
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Déférencer c'est accéder à la donnée pointée.
    et la donnée pointée ici c'est "struct Liste " ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Dans ce cas il n'y a de donnée en particulier (le cas très particulier de l'opérateur sizeof). On ne s'intéresse qu'au type de la donnée.
    Oui, ici liste est un struct Liste*, donc *liste est un struct Liste.

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

Discussions similaires

  1. liste chainée fonction pour afficher la liste
    Par kazuo7 dans le forum Débuter
    Réponses: 3
    Dernier message: 11/03/2016, 14h17
  2. listes chainés ( fonction supprimer)
    Par rockkornman dans le forum C
    Réponses: 4
    Dernier message: 13/05/2009, 11h24
  3. Liste chainée: Fonction d'affichage
    Par mayalabeille dans le forum C
    Réponses: 9
    Dernier message: 28/04/2007, 15h32
  4. Réponses: 10
    Dernier message: 08/12/2006, 02h18
  5. Réponses: 1
    Dernier message: 16/06/2006, 16h12

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