est ce que quelqu'un aurait de bonnes adresses a propos des structures autoréferrentielles, parce que je m'embrouille un peu les pates !
Du genre avec quelques exemples etc.
merci d'avance !
typedef struct element { struct element * previous; struct element * next; }element; void _main(void) { element el1,el2; el1.next = &el2; el1.previous = NULL; el1.el2->previous = &el1; // etc... etc... n'importe quoi etc... }
typedef struct element { struct element * previous; struct element * next; }element; void _main(void) { element *el1; el1 = (element*)malloc(sizeof(element)); el1->previous = NULL; el1->next = NULL; // etc... etc... n'importe quoi etc... free(el1); }
struct _LISTE_UNITE *Nouveau; Nouveau = (struct _LISTE_UNITE*)malloc(sizeof(struct _LISTE_UNITE));
struct _LISTE_UNITE *Nouveau; Nouveau = (struct _LISTE_UNITE*)malloc(sizeof(struct _LISTE_UNITE));
typedef struct elementDbl ST_ELEMENTDBL, *PT_ELEMENTDBL;
struct elementDbl {
PT_ELEMENTDBL pt_prev;
PT_ELEMENTDBL pt_next;
float fMyData; //Histoire de mettre quelque chose dans la liste
};
//Pour créer un nouvel élément
PT_ELEMENTDBL NewElement(float fData) {
PT_ELEMENTDBL pt_returnVal;
//Attention, on alloue bien la taille de la structure et non du pointeur
pt_returnVal = (PT_ELEMENTDBL)malloc(sizeof(ST_ELEMENTDBL));
if(pt_returnVal) {
pt_returnVal->pt_prev = NULL;
pt_returnVal->pt_next = NULL;
pt_returnVal->fMyData = fData;
}
return pt_returnVal;
}
//Pour insérer un élément à gauche d'un élément existant
//(Retourne pt_newElement si OK, NULL si erreur (par exemple, pt_newElement non-orphelin)
PT_ELEMENTDBL InsertLeft(PT_ELEMENTDBL pt_list, PT_ELEMENTDBL pt_newElement) {
//Erreur si pt_newElement n'est pas orphelin
if(pt_newElement==NULL || pt_newElement->pt_prev!=NULL || pt_newElement->pt_next!=NULL) {
return NULL;
}
pt_newElement->pt_prev = pt_list;
pt_newElement->pt_next = pt_list->pt_next;
pt_list->pt_next = pt_newElement;
if(pt_newElement->pt_next) {
pt_newElement->pt_next->pt_prev = pt_newElement;
}
return pt_newElement;
}
//Pour insérer un élément à droite d'un élément existant
PT_ELEMENTDBL InsertRight(PT_ELEMENTDBL pt_list, PT_ELEMENTDBL pt_newElement) {
//Erreur si pt_newElement n'est pas orphelin
if(pt_newElement==NULL || pt_newElement->pt_prev!=NULL || pt_newElement->pt_next!=NULL) {
return NULL;
}
pt_newElement->pt_prev = pt_list->pt_prev;
pt_newElement->pt_next = pt_list;
pt_list->pt_prev = pt_newElement;
if(pt_newElement->pt_prev) {
pt_newElement->pt_prev->pt_next = pt_newElement;
}
return pt_newElement;
}
//Petites fonctions pour obtenir la tête et la queue d'une liste
PT_ELEMENTDBL GetFirstElement(PT_ELEMENTDBL pt_list) {
if(pt_list==NULL) {
return NULL;
}
while(pt_list->pt_prev != NULL) {
pt_list = pt_list->pt_prev;
}
return pt_list;
}
PT_ELEMENTDBL GetLastElement(PT_ELEMENTDBL pt_list) {
if(pt_list==NULL) {
return NULL;
}
while(pt_list->pt_next != NULL) {
pt_list = pt_list->pt_next;
}
return pt_list;
}
InsertRight(pt_dernierElement, NewElement(fMesDonnees)); pt_dernierElement = GetLastElement(pt_dernierElement);
void free_list(element *head) { element *nxt; while(nxt=head->next) { free(head); head=nxt; } free(head); }