je réalise l'implémentation d'une liste doublement chaînée (ne possédant qu'une tete d'après l'énoncé, on pourrait également rajouter une queue ça va de soit).
Voici mes structures de base
- Code: Tout sélectionner
typedef struct unELEMENT {
int val;
char nom[TAILLE_MAX];
}ELEMENT;
typedef struct uneCEL
{
ELEMENT e; //élément courant
struct uneCEL *suiv;//pointeur sur élément suivant
struct uneCEL *prec;//pointeur sur élément précédent
}CEL;
typedef struct uneLISTE {
CEL *tete; //pointeur de tete sur une cellule
}LISTE;
typedef LISTE* LDC;
Je tiens à préciser que le code suivant est correct (sans erreur de syntaxe) mais il ne fonctionne pas parfaitement dans les faits; du coup j'aurais bien aimé savoir ce qui manquait dans mon code ou qui était mal fait.
Je réalise grosso modo; une fonction permettant d'insérer un élément avant la tête de lecture / après la tete de lecture qui seront utilisé par une fonction d'ajout plus générale.
- Code: Tout sélectionner
void ajoutElemAvant(LDC *l, ELEMENT e1)
{
CEL* maCell=malloc(sizeof(CEL));
maCell->e=e1;
if(estVideListe(*l))
{
maCell->suiv=NULL;
maCell->prec=NULL;
(*l)->tete=maCell;
}
else
{
maCell->suiv=(*l)->tete;
maCell->prec=(*l)->tete->prec;
(*l)->tete->prec=maCell;
}
}
void ajoutElemApres(LDC *l, ELEMENT e1)
{
CEL* maCell=malloc(sizeof(CEL));
maCell->e=e1;
if(estVideListe(*l))
{
maCell->suiv=NULL;
maCell->prec=NULL;
(*l)->tete=maCell;
}
else
{
maCell->suiv=NULL;
maCell->prec=(*l)->tete;
(*l)->tete->suiv=maCell;
}
}
La fonction utilisant les deux qui est donc appelé dans le main
- Code: Tout sélectionner
void ajoutElem(LDC* l, ELEMENT e1)
{
if (estVideListe(*l))
{
ajoutElemApres(l,e1);
}
else
{
if(e1.val > (*l)->tete->e.val)
{
ajoutElemApres(l,e1);
}
else
{
ajoutElemAvant(l,e1);
}
}
}
Et enfin une fonction permettant d'afficher une liste.
- Code: Tout sélectionner
void imprimeListe(LDC* l)
{
LDC* laux;
laux=l;
while((*laux)->tete !=NULL)
{
printf("%d %s\n",(*laux)->tete->e.val,(*laux)->tete->e.nom);
(*laux)->tete=(*laux)->tete->prec;
}
}
Lorsque je tente une exécution dans mon main en faisant l'ajout consécutif de trois élément dans ma suite.
- Code: Tout sélectionner
ELEMENT el;
el.val=10;
strcpy(el.nom,"Bonjour");
ajoutElem(&L,el);
ELEMENT el2;
el2.val=7;
strcpy(el2.nom,"Coucou");
ajoutElem(&L,el2);
ELEMENT el3;
el3.val=5;
strcpy(el3.nom,"Salut");
imprimeListe(&L);
A l'exécution je ne vais afficher que les deux premiers éléments et pas le troisième. Donc je pense que j'ai oublié quelque chose dans le chainage de l'élément précédent.
De plus si je fais un test en faisant en sorte que le second élément que j'insère soit plus grand que le premier, je n'obtiens plus que l'affichage du premier élément.
Donc je dois également avoir un soucis sur l'ajout d'un élément après la tête.
J'ai beau me triturer l'esprit je ne vois pas où mon chaînage merde. A moins que ce ne soit pas fonction d'affichage mais là encore je ne vois pas ce qui pourrait clocher à l'intérieur.
