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 :

Gestion dynamique de la mémoire : Liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 benjiprog
    Si j'ai bien compris il faut que j'affecte l'adresse de mon nouvel élement (nom) au dernier (pointeur suivant) non?
    Oui.

  2. #2
    Membre éclairé Avatar de benjiprog
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Par défaut
    J'ai affecté l'adresse de mon nouvel élement (nom) à mon pointeur (suivant) seulement les noms et ages saisies au clavier ne s'affiche pas y'a t'il un problème dans ma fonction d'affichage?

    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
     
    #include <stdio.h> 
    #include <conio.h> 
    #include <string.h> 
    #include <stdlib.h> 
    #define LG 10 
     
    struct element{               /*Déclaration de la structure*/ 
           char nom[LG+1]; 
           int age; 
           struct element *suivant;  /*Pointeur sur l'élément suivant*/ 
           }; 
     
    void creation (struct element * *);  /*Prototype des fonctions*/ 
    void affiche (struct element *);    
     
    int main (void) 
    { 
        struct element *fiche; 
     
        creation(&fiche);      
        affiche(fiche); 
     
        getch (); 
        return (0); 
    } 
     
                /*********Fonction de création de liste chainée**********/ 
    void creation (struct element * *adr) 
    { 
         char nom[LG+1]; 
         int age; 
         struct element *courant;   /*Pointeur pour l'échange de valeur et réservation mémoire*/ 
     
         printf ("Entrer un nom vide pour terminer\n\n"); 
         *adr=NULL;                /*Initialisation du tout début de liste*/ 
         while (1)                      
        { 
             printf ("Nom :"); 
             gets(nom); 
             if (!strlen(nom)) break;        /*Sortie de boucle si nom vide*/ 
             printf ("Age :"); 
             scanf ("%d",&age); 
             getchar(); 
             courant=(struct element *)malloc (sizeof(struct element));   /*réservation mémoire*/ 
             strcpy(courant->nom,nom);  
             courant->age=age;          
             courant->suivant=(struct element *)&nom;        
     
         } 
    } 
     
               /*******Fonction d'affichage de la liste chainée******/ 
    void affiche (struct element *point) 
    { 
         printf ("\n\tNOM\tAGE\n\n"); 
         while (point)        
         { 
             printf ("%12s",point->nom);      
             printf ("%7d\n",point->age);      
             point=point->suivant;      
         } 
    }

  3. #3
    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
    courant->suivant=(struct element *)&nom;
    ben ça, c'est tellement stupide que je me demande comment tu as pu avoir une idée pareille.
    Dans une liste chaînée, le pointeur "suivant" ne peut pointer que sur deux choses:
    1) Une autre structure élément (le suivant dans la liste)
    2) NULL (si l'élément en question est le dernier, NULL indique qu'il n'y a pas d'élément après)
    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.

  4. #4
    Membre éclairé Avatar de benjiprog
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 302
    Par défaut
    ben ça, c'est tellement stupide que je me demande comment tu as pu avoir une idée pareille.
    Oui enfin je suis pas aussi callé que toi en C, bref j'arrive pas a afficher les données dans le même ordre que je les aient saisies si vous avez une solution simple (svp) je suis ouvert merci d'avance.

  5. #5
    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
    Eh bien en fait, tu as trois choix possibles:
    1°) Tu lie les éléments en ordre inverse (assez simple à faire, mais ici il tu veux le même ordre)
    2°) Tu maintiens un pointeur vers le dernier élément de la liste pour rajouter à la fin
    3°) Tu maintiens un pointeur de pointeur, plus compliqué

    Un petit exemple pour le 2:
    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
    void creation (struct element * *pt_pt_premier)
    {
    	char nom[LG+1];
    	int age;
    	struct element *pt_nouveau=NULL;   /*Pointeur pour l'échange de valeur et réservation mémoire*/
    	struct element *pt_dernier=NULL;
    	char *pt_ligne=NULL; /* pointeur vers le \n à enlever */
     
    	*pt_pt_premier=NULL;	/*Initialisation du tout début de liste*/
    	pt_dernier=NULL;
     
    	printf ("Entrer un nom vide pour terminer\n\n");
    	while(1)
    	{
    		printf ("Nom :");
    		fgets(nom, LG+1, stdin);/*gets() est une fonction trop dangereuse et ne devrait pas exister*/
    		/* Retire le \n du nom */
    		pt_ligne=strchr(nom, '\n');
    		if(pt_ligne)
    			*pt_ligne='\0';
    		if (!strlen(nom))
    			break;        /*Sortie de boucle si nom vide*/
    		printf ("Age :");
    		scanf ("%d",&age);
    		getchar();
    		/* Création d'un nouvel élément de la liste */
    		/* (en C, le cast du retour de malloc() est inutile et déconseillé) */
    		pt_nouveau = malloc(sizeof(struct element));   /*réservation mémoire*/
    		strcpy(pt_nouveau->nom,nom);
    		pt_nouveau->age=age;
    		pt_nouveau->suivant = NULL;
    		/* Ajout de l'élément à la fin de la liste */
    		/* Si la liste n'est pas vide, on ajoute après pt_dernier. */
    		/* Sinon, on crée la liste avec pt_nouveau */
    		if(pt_dernier)
    			pt_dernier->suivant = pt_nouveau;
    		else
    			*pt_pt_premier = pt_nouveau;
    		pt_dernier = pt_nouveau;
    	}/* while */
    }
    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.

Discussions similaires

  1. système de gestion dynamique de la mémoire centrale
    Par naou18 dans le forum Débuter
    Réponses: 2
    Dernier message: 14/05/2012, 06h19
  2. Gestion dynamique de la mémoire - Tableaux
    Par Smanyx dans le forum C
    Réponses: 1
    Dernier message: 04/04/2010, 19h23
  3. Liste chainé et fuite mémoire
    Par poussinphp dans le forum C++
    Réponses: 2
    Dernier message: 25/04/2007, 23h06
  4. [Tableaux] gestion dynamique de la mémoire en PHP
    Par isorn dans le forum Langage
    Réponses: 1
    Dernier message: 02/04/2007, 16h02
  5. mémoire et liste chainée?
    Par tintin72 dans le forum C++
    Réponses: 17
    Dernier message: 17/12/2005, 20h54

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