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 :

Créer une structure de donnée capable d’accueillir les données sous forme d’une liste chaînée


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 Créer une structure de donnée capable d’accueillir les données sous forme d’une liste chaînée
    Bonjour à tous,

    J'essaye de créer une liste à partir d'un fichier texte que voici :

    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
    Daenerys
    10
    #
    Jon
    12
    #
    Rhaegar
    5
    #
    Joffrey
    8
    #
    Lyanna
    78
    #
    Sansa
    1
    #
    Arya
    3
    #
    Gregor
    30
    #
    Ramsay
    32
    #
    Aerys
    51
    #
    Robb
    14
    #
    Petyr
    27
    #
    Cersei
    28
    #
    Jorah
    34
    #
    Stannis
    41
    #
    Sandor
    10
    #

    je dois créer à partir de ce fichier une liste qui contiendra le nom associé à son nombre

    Je but sur un point :
    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>
    #include "liste.h"
    #define TAILLE_MAX 100
     
    int main(int argc, char *argv[])
    {
     
        Liste *maListe = initialisation();
     
        int etat = 1;
     
        int compteur = 1;
     
     
        FILE * file = NULL;
        // Ouvrir un fichier
     
        char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
        char tableau[TAILLE_MAX] = "";
     
        file = fopen("tab2d.txt","r");
     
        if(file != NULL)
        {
            while( etat != NULL)
            {
     
                etat = fgets(chaine,TAILLE_MAX,file);
     
                if(chaine[strlen(chaine)-1] == '\n')
                {
                    chaine[strlen(chaine)-1] = '\0';
                }
                else{
                    while(getc(file) != '\n');
                }
                printf("%s\n",chaine);
     
                if(chaine == "#")
                {
                    printf("Voila la fin d'un element\n");
                }
     
     
                compteur += 3;
     
     
            }
     
     
            fclose(file);
        }
        else
        {
            printf("Error! \n");
        }
        return 0;
    }
    La ligne 40 de mon second code n'est jamais executé pourtant dans la lecture du fichier j'ai bien '#' , donc je comprend pas pourquoi chaine n'est jamais égal à '#'

    Si vous voyez merci

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Ligne 40 tu tentes de comparer un pointeur avec une chaîne de caractères !

    • Soit tu compares le contenu de l'adresse pointée par "chaine" avec la valeur ascii de la lettre # comme ceci chaine [0] == '#',
    • soit tu utilises strcmp (); pour comparer la chaîne entière comme ceci strcmp (chaine, "#") == 0.

  3. #3
    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
    Ok merci ,

    en continuant le programme j'ai voulu prendre une autre approche

    Chaque élément de la liste sera constitué du nom et de nombre qui se trouve dans le fichier(cfr : premier post)

    Il y aura donc 16 élément dans ma liste chaînée simple

    Je crée tout d'abord une structure qui définit chaque Élément de la liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct Element Element;
     
    struct Element
    {
        char chaine_nom[TAILLE];
        char chaine_nombre[TAILLE];
     
        Element *suivant;
    };
    et une structure pour le contrôle de cette liste

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct Liste Liste;
     
    struct Liste
    {
        Element *premier;
    };
    Je crée ensuite une fonction qui aura pour but d'initialiser la liste en question :

    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
    Liste *initialisation()
    {
        Liste *liste = malloc(sizeof(*liste));
        Element *element = malloc(sizeof(*element));
     
        if(liste == NULL || element == NULL)
        {
            exit(0);
        }
     
        element->chaine_nom[0] = 0;
        element->chaine_nombre[0] = 0;
        element->suivant = NULL;
        liste->premier = element;
     
        return liste;
     
    }
    Et aprés une fonction qui aura pour but d'insérer un élement dans 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
    void insertion(Liste *liste,char a, char b)
    {
        /* Création du nouvel élément */
        Element *nouveau = malloc(sizeof(*nouveau));
        if (liste == NULL || nouveau == NULL)
        {
            exit(EXIT_FAILURE);
        }
        nouveau->chaine_nom[0] = a;
        nouveau->chaine_nombre[0] = b;
     
        /* Insertion de l'élément au début de la liste */
        nouveau->suivant = liste->premier;
        liste->premier = nouveau;
    }
    La fonction qui se charge d'afficher 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
    17
    void afficherListe(Liste *liste)
    {
        if (liste == NULL)
        {
            exit(EXIT_FAILURE);
        }
     
        Element *actuel = liste->premier;
     
        while (actuel != NULL)
        {
            printf("%c -> ", actuel->chaine_nom[0]);
     
            actuel = actuel->suivant;
        }
        printf("NULL\n");
    }
    et voici mon main :

    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
    int main(int argc, char *argv[])
    {
     
        Liste *maListe = initialisation();
     
        int etat = 1;
     
        int compteur = 0;
     
     
        FILE * file = NULL;
        // Ouvrir un fichier
     
        char chaine[TAILLE_MAX] = ""; // Chaîne vide de taille TAILLE_MAX
        char tableau[TAILLE_MAX] = "";
        char chaine1[TAILLE_MAX] = "";
        char chaine2[TAILLE_MAX] = "";
     
        file = fopen("tab2d.txt","r");
     
        if(file != NULL)
        {
            while( etat != NULL)
            {
     
     
                etat = fgets(chaine,TAILLE_MAX,file);
     
                etat = fgets(chaine1,TAILLE_MAX,file);
     
                etat = fgets(chaine2,TAILLE_MAX,file);
     
                insertion(maListe,chaine,chaine1);
     
     
     
                if(chaine[strlen(chaine)-1] == '\n')
                {
                    chaine[strlen(chaine)-1] = '\0';
                }
                else{
                    while(getc(file) != '\n');
                }
     
            }
     
            afficherListe(maListe);
     
     
            fclose(file);
        }
        else
        {
            printf("Error! \n");
        }
        return 0;
    }
    Ma fonction insertion et/ou d'affichage n'est pas correct mais je vois pas à quel niveau merci et bonne journée

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 : 12 833
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par woshou Voir le message
    Ma fonction insertion et/ou d'affichage n'est pas correct mais je vois pas à quel niveau
    De ce que je lis, ces deux fonctions sont correctes (désolé j'ai pas eu le temps de tester). Il y a juste ce
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Element *nouveau = malloc(sizeof(*nouveau));
        if (liste == NULL || nouveau == NULL)
        {
            exit(EXIT_FAILURE);
        }
    qui me déplait fortement. Déjà parce que si "liste" est NULL tu as alloué "nouveau" pour rien et surtout parce qu'on n'est pas obligé de quitter le programme si la fonction est appelée pour rien. Suffit juste de quitter la fonction et le programme continue de fonctionner.

    Sinon je crois que l'erreur de situe dans "initialisation()". Car initialiser la liste c'est juste mettre son premier élément à NULL, pas de créer un élément vide.

    De plus, rien ne t'oblige à allouer la liste. La liste étant dans le main(), elle peut très bien être une variable classique et non un pointeur alloué.

    Donc la fonction deviendrait ceci
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void *initialisation(liste *l) {
        if (l== NULL) return;
        l->premier=NULL;
    }

    Et tu l'utiliserais au choix de l'une des deux façons suivantes
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main() {
        liste L1;
        initialisation(&L1);
     
        liste *L2=malloc(sizeof(*L2))
        intialisation(L2);
        ...
        free(L2);
    }

    Et si tu nommais tes types "t_xxx" (exemple "t_liste") on verrait mieux la différence entre un nom de type et un nom de variable).
    Mon Tutoriel sur la programmation «Python»
    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
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    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
    Bonjour merci pour votre feed back ,

    même avec vos indications j'obtiens tjrs rien en console ,

    j'ai fais une modification dans la fonction affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void afficherListe(Liste *liste)
    {
     
        Element *actuel = liste->premier;
     
        while (actuel != NULL)
        {
            printf("%s %s\n -> ", actuel->chaine_nom[0],actuel->chaine_nombre);
     
            actuel = actuel->suivant;
        }
        printf("NULL\n");
    }
    Voilà si jamais quelqu'un a le temps de tester mon code ça serait sympa

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Une chtite question au passage .

    Pourquoi chaine_nombre dans ta structure Element ?
    Puisque c'est un nombre autant le déclarer comme tel. Ca t'évite la manipulation d'une chaîne et des risques de fuite mémoire et autres joyeusetés .

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par woshou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void afficherListe(Liste *liste)
    {
     
        Element *actuel = liste->premier;
     
        while (actuel != NULL)
        {
            printf("%s %s\n -> ", actuel->chaine_nom[0],actuel->chaine_nombre);
     
            actuel = actuel->suivant;
        }
        printf("NULL\n");
    }
    actuel->chaine_nom[0] pointe sur quoi ? Lorsque tu auras répondu à cette petite question tu auras la solution à ton problème .

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2019, 20h29
  2. Réponses: 18
    Dernier message: 14/09/2015, 19h22
  3. Réponses: 4
    Dernier message: 29/11/2013, 07h56
  4. [POO] Créer une structure de données
    Par zulot dans le forum Langage
    Réponses: 10
    Dernier message: 15/08/2006, 12h51
  5. Comment créer une structure de donnée dynamiquement ?
    Par Beaunico dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 09h34

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