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 :

Debutant besoin Aide liste chainé


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 17
    Par défaut Debutant besoin Aide liste chainé
    Bonjour
    Je suis un grand débutant en langage C, j'ai lu un peu partout les faqs sur les listes chainés mais je n'arrive pas a mettre en application
    Voici mon pb :
    gestion du bibliothèque de livre (avec quatre champs), ajout, suppression recherche, sauvegarde sur fichier
    ci-dessous mon prog mais il y a pleins d'erreurs, mon objectif est déjà de saisir un élément,
    En résumé je ne comprend pas grand chose
    Est ce que quelqu'un peux m'aider me guidé , me donner des explication sur comment on crée la liste et pourquoi on fait cela => typedef Element* liste;

    Merci de votre compréhension de votre aide


    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
    #include<stdio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    /* defintion de la structure avec les champs du catalogue*/	
    typedef struct Element {
    		char Titre;
    		char Auteur ;
    		char Editeur ;
    		char Numero;
    		struct Element *suivant;
    }Element;
     
     
    typedef Element* liste;
     
     
    //Initialisation des pointeur à NULL + taille de la liste a 0 //
     
    void initialisation (Liste *liste){
    		liste->debut = NULL;
    		liste->fin = NULL;
    		int taille = 0;
    }
     
    //Insertion dans liste vide//
     
    	/* insertion dans une liste vide */
     
    int ajouterEnTete (liste * liste){
     
    	char NV_Titre;
    	char NV_Auteur ;
    	char NV_Editeur ;
    	char NV_Numero;
     
    	// saisie des nouvelles valeurs//
       printf("\nEntrer le titre du livre : ");
       scanf("%s",NV_Titre);
       printf("Entrer le nom de l'auteur : ");
       scanf("%s",NV_Auteur);
       printf("\nEntrer l'éditeur du livre : ");
       scanf("%s",NV_Editeur);
       printf("Entrer le numero : ");
       scanf("%s",NV_Numero);
     
      /* On crée un nouvel élément */
     
      Element *nouveau_element = malloc(sizeof(Element));
     
     
      /* On assigne la valeur au nouvel élément */
     
      NV_Titre -> Titre ;
      NV_Auteur -> Auteur;
      NV_Editeur -> Editeur;
      NV_Numero -> Numero;
     
      nouveau_element->suivant = liste  ;// Le pointeur suivant pointera vers null parceque premier element
     
      return 0;
    }
     
     
    int main(){
     
     
     liste * liste = NULL;
     
     printf( "Ajouter Element.\n");
     initialisation (liste);
     ajouterEnTete(liste);
     
    }

  2. #2
    Membre confirmé
    Homme Profil pro
    BI Expert
    Inscrit en
    Décembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : BI Expert

    Informations forums :
    Inscription : Décembre 2005
    Messages : 181
    Par défaut
    première remarque:

    void initialisation (Liste *liste)
    int ajouterEnTete (liste * liste)

    liste et Liste, sachant que c est sensible à la casse, evites d'utiliser des identifiant différent de casse ca risque de te causé un conflit pour toi même!
    la preuve ci-dessus

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Par défaut
    deuxieme remarque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct Element {
    		char Titre;
    		char Auteur ;
    		char Editeur ;
    		char Numero;
    		struct Element *suivant;
    }Element;
    Le titre du livre ne fait qu'un caractère?
    Il serrait plus juste de faire un tableau de caractères ainsi l'utilisation de %s dans printf serait utile...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      /* On assigne la valeur au nouvel élément */
     
      NV_Titre -> Titre ;
      NV_Auteur -> Auteur;
      NV_Editeur -> Editeur;
      NV_Numero -> Numero;
    Depuis quand l'affectation en C est -> ?
    normalement tu devrais utilisé la fonction strncpy
    strncpy(nouveau_element->Titre, NV_Titre, taille de Titre);

  4. #4
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    pourquoi on fait cela => typedef Element* liste
    En général, c'est seulement pour simplifier et clarifier les écritures.
    Maintenant, tu pourras écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initialisation (liste *lis);
    plutot que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initialisation (Element **lis);
    Personnellement je ne suis pas fan de ce genre de pratique, car dans ton cas, ça cache les "*" de tes paramètres. Et quand tu codes, tu as en général besoin de savoir combien d'étoiles il y a... Mais bon...

    A mon avis, tu dois pas pouvoir compiler ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void initialisation (Liste *liste){
    		liste->debut = NULL;
    		liste->fin = NULL;
                             int taille =0;
    }
    Nulle part il est question dans ton code du champ "debut" ni de "fin". Declarer un entier (en fin de blocs en plus), taille pour ne pas lutiliser ensuite ne sert à rien....

    Tu pourrais écrire la fonction comme ceci :
    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
     
    typedef struct Element {
    		char Titre;
    		char Auteur ;
    		char Editeur ;
    		char Numero;
    		struct Element *suivant;
    }Element;
    typedef struct {
                         Element *debut;
                         Element *fin;
                         int taille;
    }Liste;
     
    void initialisation (Liste *lis){
    	            lis->debut = NULL;
                             lis->fin = NULL;
                             lis->taille = 0;
    }
    <...>
    int main(void){
       Liste lst;
       initialisation (&lst);
       return 0;
    }
    Ya encore plein d'erreurs dans ton code, pour y arriver faut que tu apprennes le C et l'algorithmique...

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je plussoie Climoo, le typedef apporte plus de confusion qu'autre chose et renforce l'illusion qu'un élément est une liste.

    Le code est beaucoup plus compréhensible quand on définit deux structures séparées liste et élément. Et ce, même quand la structure liste ne contient qu'un pointeur vers le premier élément.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 17
    Par défaut
    Merci de vos réponse je vais refaire un check et reviens vers vous
    encore une question les valeurs saisies je dois les passer toutes en arguement et apres faire la copy
    A+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 47
    Par défaut
    Fait moi plaisir,
    un module pour élément, avec les fonction initialise, affectation, suppression, ...
    un module pour les listes chainée avec ini, ajouter, ...
    et ton programme principal qui utilise ses modules, car on n'écrit pas une liste chainée juste pour un cas !!!! car c'est le gros bordel !!! Si tu veux utilisé ton programme avec interface gtk tu reecrit liste chainée??? car tu utilise stdio dans ton implantation de ta liste chainée... enfin c'est vraiment mal organisé...

    Et je ne comprend pas pourquoi tu utilises une liste chainée si tu dois stocké dans un fichier, qui comme la liste chainée a un accès séquentiel... J'aurai compris si c'etait dans un tableau et que tes données était ordonné ainsi tu aurais pu faire une recherche dichotomique, mais la ou est l'utilité???

    donc si c'est sur fichier, je vois plutot quelques choses comme ça
    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
     
    module gestion de la base de donnée
    importer 
    le module de gestion de fichier, stdio?
    le module de gestion des elements
    exporter
    // ajoute ajoute l'element e a la fin du fichier 
    procedure ajoute(e:Element)
    // supprime l'element e du fichier
    procedure supprime(e:Element)
    // recherche l'element e et retourne l'indice de l'element, retourne < 0 si pas trouvée 
    fonction recherche(e:Element): entier
    fin module
     
    module gestion element
    importer
    module de gestion des chaines de caractere
    exporter
    type element
    initialisation element
    affectation element
    comparaison element
    ...
    fin module
    tu utilise les fonctions exporter du module gestion element pour implanter le module de gestion de la base de donnée...
    dans le main tu demande se que tu veux faire: rechercher, ajouter, etc et tu récupère les données puis tu utilise le module element pour créer un element bien initialisé en luis passant tes données recuperer et tu passe cette element aux .procedures/fonctions (de gestion de la base de donnée...)en parametre.
    Enfin moi j'aurai fais quelque chose comme sa, apres si quelqu'un a de meilleur idée

Discussions similaires

  1. Besoin d'aide pour mon script sur les listes chainées
    Par narama87 dans le forum Débuter
    Réponses: 1
    Dernier message: 13/01/2011, 12h29
  2. Besoin d'aide listes chainées
    Par Nyromancer dans le forum Linux
    Réponses: 15
    Dernier message: 27/10/2010, 18h34
  3. [debutant] pb avec liste Chainée.
    Par FamiDoo dans le forum Débuter
    Réponses: 2
    Dernier message: 19/03/2006, 16h41
  4. [debutant] Besoin d'aide sur JDBC
    Par oOoOuuhmAn dans le forum JDBC
    Réponses: 2
    Dernier message: 12/02/2006, 19h35
  5. liste chainée et insertion en fin ou debut
    Par bonjour69 dans le forum C
    Réponses: 7
    Dernier message: 21/12/2005, 20h50

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