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

A voir également:

6 réponses

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
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
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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