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 :

les listes chaineés(structures)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 75
    Par défaut les listes chaineés(structures)
    salut,j'essaye de comprendre le principe des listes chaineés j'ai quelque informations mais je prefere ne pas chercher sur les sites la maniere dont faire une liste chaineé sans la comprendre donc je vien de faire une liste chaineé et une fonction pour la parcourir et l'afficher voici le 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
    #include <stdlib.h>
    #include <stdio.h>
    struct test
    {
     int i;
     int c;
     struct test *suiv;
    };
    void main()
    {
     void affiche(struct test *list);
     FILE *fi;
     int c;
     struct test *nouveau;
     struct test *premier;
     nouveau=premier;
     if((fi=fopen("C:\\test.txt","r"))==NULL) {printf("err.ouv.fich"); getchar(); return(1);}
     while(c!=EOF)
     {
      c=fscanf(fi,"%d %d",&(nouveau->i),&(nouveau->c));
      nouveau=nouveau->suiv;
      nouveau=(struct test *)malloc(sizeof(struct test));
     }
     free(nouveau);
     nouveau=NULL;
     fclose(fi);
     affiche(premier);
     getchar();
    }
    void affiche(struct test *list)
    {
     struct test *temp;
     temp=list;
     while(temp!=NULL)
     {
      printf("%d %d\n",temp->i,temp->c);
      temp=temp->suiv;
     }
    }
    malheureusement sa marche pas sa ce compile bien mais quand je l'execute sa affiche juste les deux premiers nombre decimaux et puis sa envoie l'erreur du genre "le programme a rencontré un probleme et doi fermer 'envoyer','ne pas envoyer'".
    veuillez decouvrir l'erreur plz .
    merci d'avance.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nouveau=nouveau->suiv;
    nouveau=(struct test *)malloc(sizeof(struct test));
    Ça ne peut pas marcher, ça...
    De plus, tu n'initialises pas suiv à NULL, donc ça peut pointer sur n'importe quoi et ça fait planter l'affichage...

    PS: Pas de cast au retour de malloc() en C. Cela n'est nécessaire qu'en C++.
    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.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 75
    Par défaut
    si tu vx dire que le dernier pointeur doi pointer sur NULL bah je le fais
    free(nouveau);
    nouveau=NULL;
    fclose(fi);
    sinon explique toi bien ecris la syntaxe.

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    On peut voir comment tu initialises premier.

  5. #5
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    personellement pour une liste chainée j'utilise 2 types de structure
    la liste en elle meme, et une structure "sentinelle"

    la structure "sentinelle" est seulement la pour pointer sur le premier element de ma liste (bien sur on peux ajouter des trucs dedans, comme l'element courant ...).
    ça me permet de simplifier le code et l'utilisation de la liste.

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 75
    Par défaut
    mais ou est precisement les fautes,bien sur ya des fautes ca je le sais mais j'arrive pas a les localiser.
    je donne la valeur de premier a nouveau:
    nouveau=premier;
    pour que nouveau fasse le travail et premier garde la premier liste.
    enfin...c ce que je pense

  7. #7
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par snakemetalgear
    mais ou est precisement les fautes,bien sur ya des fautes ca je le sais mais j'arrive pas a les localiser.
    je donne la valeur de premier a nouveau:
    nouveau=premier;
    pour que nouveau fasse le travail et premier garde la premier liste.
    enfin...c ce que je pense
    Oui biensur tu initialises nouveau avec premier mais où est-ce que tu initialises premier ? Tu a un probléme d'affichage de ta liste et dans ton code on voit que tu demandes d'afficher la liste 'premier' et pas nouveau...

    Il te faut te documenter d'abord sur les listes chainées

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par snakemetalgear
    salut,j'essaye de comprendre le principe des listes chaineés j'ai quelque informations mais je prefere ne pas chercher sur les sites
    <...>
    malheureusement sa marche pas sa ce compile bien mais quand je l'execute sa affiche juste les deux premiers nombre decimaux et puis sa envoie l'erreur du genre "le programme a rencontré un probleme et doi fermer 'envoyer','ne pas envoyer'".
    veuillez decouvrir l'erreur plz .
    Ton code est beaucoup trop complexe pour tester la notion de listes chainées. Il est plein d'erreurs et c'est normal.

    Je propose de commencer par des choses simples, avec des définitions statiques, on verra plus tard comment on fait du dynamique.

    1- Définir une structure noeud

    Celle ci permet de lier les éléments entre eux selon le principe 'pointer sur le suivant'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct node
    {
       struct mode *p_next;
    };
    Ce qui est le strict minimum, mais n'est pas très utile si il n'y a pas au moins une donnée. Par exemple un pointeur sur une chaine littérale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    struct node
    {
       /* chainage */
       struct mode *p_next;
     
       /* donnees */
       char const *s;
    };
    Le dernier noeud de la liste pointe sur NULL. L'adresse du premier est précieusement conservée, sinon, on ne sait pas où la liste démarre.

    2 - Définir des noeuds statiquement.

    Rien de plus simple. Il suffit de créer, par exemple 3 instances, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       struct node a = {NULL, "Hello"};
       struct node b = {NULL, "world"};
       struct node c = {NULL, "wild"};
    Il est d'usage que par défaut, le pointeurs de chainages soient à NULL, ça évite les comportements erratiques.

    3 - Créer une liste

    Mettons que l'on veuille former une liste composée, dans l'ordre, des mots "Hello" puis "world".

    Il suffit de créer les chainages adéquates :
    et voila.

    4 - Afficher le contenu de la liste

    Maintenant, on peut parcourir la liste et afficher le contenu :

    On défini un pointeur qui va pointer sur chacun des éléments.
    il commence par désigner a :
    on peut alors afficher la donnée :
    ensuite, il suffit de modifier le pointeur pour qu'il pointe sur le neud suivant :
    et voilà révélé le grand secret des listes chainées.
    Est-on en fin de liste ?
    non, alors on peut afficher la donnée :
    et on recommence. On se doute bien qu'un boucle va pouvoir automatiser tout ça, s'arrêter quand p vaudra NULL etc.

    Je te laisse faire. On doit obtenir
    Hello world
    5 - Insérer un élément

    C'est là toute la puissance de la liste chainée : l'insertion. Il suffit en fait de jouer sur les chainages :

    On a : a -> b ->NIL et on veut a -> c -> b -> NIL
    Pour ça
    1 - On fait pointer c sur b : on a donc : a -> b -> NIL, c-> b -> NIL
    2 - On fait pointer a sur c : a -> c -> NIL, c -> b -> NIL, ce qui fait bien a -> c -> b -> NIL.

    Ce qui se code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       c.p_next = &b; /* 1 - */
       a.p_next = &c; /* 2 - */
    Avec la même méthode de lecture que précédemment, on doit obtenir maintenant :
    Hello wild world
    Je te laisse faire les essais...

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

Discussions similaires

  1. Problème Listes chainées Structure contenant
    Par loco_info dans le forum C
    Réponses: 3
    Dernier message: 17/05/2007, 13h08
  2. Toujours les listes chainées
    Par KindPlayer dans le forum C
    Réponses: 2
    Dernier message: 26/02/2007, 10h00
  3. liste chainée & structure
    Par hunter99 dans le forum C
    Réponses: 8
    Dernier message: 10/12/2006, 16h31
  4. des questions sur les listes chainées
    Par hunter99 dans le forum C
    Réponses: 13
    Dernier message: 05/12/2006, 22h51
  5. les listes chainées
    Par najwWa dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2006, 19h09

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