Re,
Voici un exemple purement didactic pour comprendre les opérations sur une liste chaînée
/* ---------- liste.h ----------- */
typedef struct ElementListe
{
char *donnee;
struct ElementListe *suivant;
} Element;
typedef struct ListeRepere
{
Element *debut;
Element *fin;
int taille;
} Liste;
/* initialisation de la liste */
void initialisation (Liste * liste);
/* INSERTION */
/* insertion dans une liste vide */
int ins_dans_liste_vide (Liste * liste, char *donnee);
/* insertion au début de la liste */
int ins_debut_liste (Liste * liste, char *donnee);
/* insertion à a fin de la liste */
int ins_fin_liste (Liste * liste, Element * pilote, char *donnee);
/* insertition ailleurs */
int ins_liste (Liste * liste, char *donnee, int pos);
/* fonction globale d'insertion */
int insertion (Liste * liste, Element * pilote, char *donnee);
/* SUPPRESSION */
int supp_debut (Liste * liste);
int supp_dans_liste (Liste * liste, int pos);
void affiche (Liste * liste);
void detruire (Liste * liste);
/* -------- FIN liste.h --------- */
Les fonctions/***************************\
* liste_function.h *
\***************************/
void
initialisation (Liste * liste)
{
liste->debut = NULL;
liste->fin = NULL;
liste->taille = 0;
}
/* insertion dans une liste vide */
int ins_dans_liste_vide (Liste * liste, char *donnee){
Element *nouveau_element;
if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL)
return -1;
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
== NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->suivant = NULL;
liste->debut = nouveau_element;
liste->fin = nouveau_element;
return 0;
}
/* insertion au début de la liste
* * les éléments seront decalé de la façon suivante
* * le 1er passe en position 2, le 2è en position 3, ...
* */
int ins_debut_liste (Liste * liste, char *donnee){
Element *nouveau_element;
if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL)
return -1;
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
== NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->suivant = liste->debut;
liste->debut = nouveau_element;
return 0;
}
/*insertion à la fin de la liste */
int ins_fin_liste (Liste * liste, Element * pilote, char *donnee){
Element *nouveau_element;
if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL)
return -1;
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
== NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
pilote->suivant = nouveau_element;
nouveau_element->suivant = NULL;
liste->fin = nouveau_element;
return 0;
}
/* insertion à la position desirée
* la position sera demandé
*/
int ins_liste (Liste * liste, char *donnee, int pos){
if (liste->taille < 2)
return -1;
if (pos < 1 || pos >= liste->taille)
return -1;
Element *courant;
Element *nouveau_element;
int i;
if ((nouveau_element = (Element *) malloc (sizeof (Element))) == NULL)
return -1;
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
== NULL)
return -1;
courant = liste->debut;
for (i = 1; i < pos; ++i)
courant = courant->suivant;
if (courant->suivant == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->suivant = courant->suivant;
courant->suivant = nouveau_element;
liste->taille++;
return 0;
}
/* fonction globale d'insertion
* * en fonction d'élément pilote
* * - l'insertion se fera :
* * - dans une liste vide
* * - au début de la liste
* * - à la fin de la liste
* */
int choix_insertion (Liste * liste, Element * pilote, char *donnee){
if (pilote == NULL && liste->taille == 0)
ins_dans_liste_vide (liste, donnee);
else if (pilote == NULL && liste->taille != 0)
ins_debut_liste (liste, donnee);
else if (liste->taille != 0 && pilote != NULL && pilote->suivant == NULL)
ins_fin_liste (liste, pilote, donnee);
liste->taille++;
return 0;
}
/* suppression en début de la liste
* * cette fonction sera utiliser dans une boucle
* * pour detruire la liste (voir la fonction "detruire" )
* */
int supp_debut (Liste * liste){
if (liste->taille == 0)
return -1;
Element *element_supp;
element_supp = liste->debut;
liste->debut = liste->debut->suivant;
if (liste->taille == 1)
liste->fin = NULL;
free (element_supp->donnee);
free (element_supp);
liste->taille--;
return 0;
}
/* supprimer un element après la position donnée
* la suppresion à la fin de la liste sera interdite
* pour la suppression dans une liste avec un seul élément
* utiliser la fonctionn "supp_debut"
* */
int supp_dans_liste (Liste * liste, int pos){
if (liste->taille <= 1 || pos < 1 || pos >= liste->taille)
return -1;
int i;
Element *courant;
Element *supp_element;
courant = liste->debut;
for (i = 1; i < pos; ++i)
courant = courant->suivant;
supp_element = courant->suivant;
courant->suivant = courant->suivant->suivant;
if(courant->suivant == NULL)
liste->fin = courant;
free (supp_element->donnee);
free (supp_element);
liste->taille--;
return 0;
}
/* affichage de la liste */
void affiche (Liste * liste){
Element *courant;
courant = liste->debut;
while (courant != NULL){
printf ("%p - %s\n", courant, courant->donnee);
courant = courant->suivant;
}
}
/* detruire la liste */
void detruire (Liste * liste){
while (liste->taille > 0)
supp_debut (liste);
}
/* -------- FIN liste2.h --------- */
liste.c/**********************\
* liste.c *
\**********************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "liste.h"
#include "liste_function.h"
int main (void)
{
char choix;
char *nom;
Liste *liste;
Element *pilote;
if ((liste = (Liste *) malloc (sizeof (Liste))) == NULL)
return -1;
if ((nom = (char *) malloc (50)) == NULL)
return -1;
pilote = NULL;
choix = 'o';
initialisation (liste);
int pos;
while (choix == 'o'){
printf ("Entrez un element : ");
scanf ("%s", nom);
getchar ();
choix_insertion (liste, pilote, nom);
pilote = liste->fin; /* insertion à la fin */
printf ("Vous voulez continuer [o/n] : ");
choix = getchar ();
}
printf ("%d\n", liste->taille);
affiche (liste);
printf ("%s - ", liste->debut->donnee);
printf ("%s\n", liste->fin->donnee);
printf
("Entrez la position apres laquelle le nouveau element sera installer : ");
scanf ("%d", &pos);
printf ("Entrez un element : ");
scanf ("%s", nom);
getchar ();
ins_liste (liste, nom, pos);
printf ("%d\n", liste->taille);
affiche (liste);
printf ("Entrez la position apres laquelle l'element sera supprime : ");
scanf ("%d", &pos);
getchar ();
supp_dans_liste (liste, pos);
printf ("%d\n", liste->taille);
affiche (liste);
printf ("%s - ", liste->debut->donnee);
printf ("%s\n", liste->fin->donnee);
printf ("Voulez-vous detruire la liste [o - detruire;n - afficher] : ");
if ((choix = getchar ()) == 'o'){
detruire (liste);
printf ("La liste a ete detruite!\n");
} else
affiche(liste);
return 0;
}
lami20j