Liste chainé

api08 Messages postés 41 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
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

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Je pense qu'il te faut une étoile dans tes typedef :

    typedef struct nomStruct { ... } *Type;
    0
  2. api08 Messages postés 41 Statut Membre 3
     
    ç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..."
    0
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    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;
    }
    0
  4. api08 Messages postés 41 Statut Membre 3
     
    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;
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. KX Messages postés 19031 Statut Modérateur 3 020
     
    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.
    0
  7. KX Messages postés 19031 Statut Modérateur 3 020
     
    La limite à 6 caractères pour nom_pers et nom_entreprise est très restrictive, entre 10 et 20 ce serait mieux.
    0