Liste chainé

Bonjour,

je fais un programme en langage c qui comporte une liste doublement chainé et 2 structures:
typedef struct _Dliste {
struct _Dliste *next;
struct _Dliste *prev;
void * info;
}Dliste;

typedef struct {
char nom_pers[6];
int age;
}personne;

typedef struct {
char nom_entreprise[6];
Dliste* liste_personne;

}entreprise;

l'ensemble d'entreprise est une dliste d'entreprise.

je n'arrive pas à ajouter une entreprise à la dliste entrepise, je ne sais pas comment affecter les valeurs dans dliste personne car le programme n'accepte pas
"e->liste_personne->nom_pers" si vous pouvez m'aider .
merci d'avance

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Je pense qu'il te faut une étoile dans tes typedef :

    typedef struct nomStruct { ... } *Type;
    1. ça fonctionne pas, j'ai essayé de faire un transtypage:
      personne*sp;
      sp=(personne *)e->liste_personne->info;
      mais chauqe fois que j'éxecute le programme affiche ça:
      "...Access violation reading location..."
      1. Modérateur
        Voici comment bien commencer (prends la fonction initialiser comme exemple) :

        #include "stdlib.h"
        #include "string.h"
        
        //////////////////////////////
        
        struct strDListe;
        
        typedef struct strDListe
        { 
        	strDListe* next; 
        	strDListe* prev; 
        	void* info; 
        } *DListe; 
        
        #define szDListe sizeof(struct strDListe)
        
        //////////////////////////////
        
        typedef struct strPersonne
        { 
        	char nom_pers[6]; 
        	int age; 
        } *Personne; 
        
        #define szPersonne sizeof(struct strPersonne)
        
        //////////////////////////////
        
        typedef struct strEntreprise
        { 
        	char nom_entreprise[6]; 
        	DListe liste_personne; 
        
        } *Entreprise;
        
        #define szEntreprise sizeof(struct strEntreprise)
        
        //////////////////////////////
        
        void initialiser(Entreprise &entreprise, const char* nomEntreprise)
        {
        	entreprise = (Entreprise) malloc(szEntreprise); // allocation mémoire
        
        	strcpy(entreprise->nom_entreprise, nomEntreprise);
        	entreprise->liste_personne = NULL;
        }
        
        //////////////////////////////
        
        int main()
        {
        	return 0;
        }
        1. merci kx pour votre réponse

          lorsque j'éxecute mon prgramme ce message s'affiche :

          Unhandled exception at 0x01291c96 in projet.exe: 0xC0000005: Access violation writing location 0xcdcdcdcd.

          au niveau de cette instruction:
          e->liste_personne=e->liste_personne->next;
          1. Modérateur
            Tu n'as probablement pas initialisé la liste en mémoire !
            Il faut faire l'allocation dynamique, tu peux par exemple surcharger initialiser

            Ce code marche chez moi :

            int main()
            {
            	Personne p;
            	initialiser(p,"Jeff",32); 
            
            	Entreprise e;
            	initialiser(e,"CCM");
            	initialiser(e->liste_personne,p,NULL,NULL);
            
            	e->liste_personne=e->liste_personne->next;
            
            	return 0;
            }

            Remarque : de même qu'on alloue la mémoire, il faut penser à la désallouer quand on ne s'en sert plus.
            1. Modérateur
              La limite à 6 caractères pour nom_pers et nom_entreprise est très restrictive, entre 10 et 20 ce serait mieux.