

typedef struct dl_ElementListe {
char *donnee;
struct dl_ElementListe *precedent;
struct dl_ElementListe *suivant;
}dl_Element;
typedef struct dl_ListeRepere {
dl_Element *debut;
dl_Element *fin;
int taille;
}dl_Liste;
void initialisation (Liste *liste);
void initialisation (Liste *liste){
liste->debut = NULL;
liste->fin = NULL;
taille = 0;
}
int ins_dans_liste_vide (dl_Liste * liste, char *donnee);

int insertion_dans_liste_vide (dl_Liste * liste, char *donnee){
dl_Element *nouveau_element;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->precedent = liste->debut;
nouveau_element->suivant = liste->fin;
liste->debut = nouveau_element;
liste->fin = nouveau_element;
liste->taille++;
return 0;
}
int ins_debut_liste (dl_Liste * liste, char *donnee);

int ins_debut_liste (dl_Liste * liste, char *donnee){
dl_Element *nouveau_element;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->precedent = NULL;
nouveau_element->suivant = liste->debut;
liste->debut->precedent = nouveau_element;
liste->debut = nouveau_element;
liste->taille++;
return 0;
}
int ins_fin_liste (dl_Liste * liste, char *donnee);

int ins_fin_liste (dl_Liste * liste, char *donnee){
dl_Element *nouveau_element;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->suivant = NULL;
nouveau_element->precedent = liste->fin;
liste->fin->suivant = nouveau_element;
liste->fin = nouveau_element;
liste->taille++;
return 0;
}
int ins_avant (dl_Liste * liste, char *donnee, int pos);


int ins_avant (dl_Liste * liste, char *donnee, int pos){
int i;
dl_Element *nouveau_element, *courant;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
courant = liste->debut;
for (i = 1; i < pos; ++i)
courant = courant->suivant;
nouveau_element->suivant = courant;
nouveau_element-> precedent = courant->precedent;
if(courant->precedent == NULL)
liste->debut = nouveau_element;
else
courant->precedent->suivant = nouveau_element;
courant->precedent = nouveau_element;
liste->taille++;
return 0;
}
int ins_apres (dl_Liste * liste, char *donnee, int pos);


int ins_apres (dl_Liste * liste, char *donnee, int pos){
int i;
dl_Element *nouveau_element, *courant;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
courant = liste->debut;
for (i = 1; i < pos; ++i)
courant = courant->suivant;
nouveau_element->suivant = courant->suivant;
nouveau_element->precedent = courant;
if(courant->suivant == NULL)
liste->fin = nouveau_element;
else
courant->suivant->precedent = nouveau_element;
courant->suivant = nouveau_element;
liste->taille++;
return 0;
}
int supp(dl_Liste *liste, int pos);




int supp(dl_Liste *liste, int pos){
int i;
dl_Element *supp_element,*courant;
if(liste->taille == 0)
return -1;
if(pos == 1){ /* suppresion de 1er élément */
supp_element = liste->debut;
liste->debut = liste->debut->suivant;
if(liste->debut == NULL)
liste->fin = NULL;
else
liste->debut->precedent == NULL;
}else if(pos == liste->taille){ /* suppression du dernier élément */
supp_element = liste->fin;
liste->fin->precedent->suivant = NULL;
liste->fin = liste->fin->precedent;
}else { /* suppression ailleurs */
courant = liste->debut;
for(i=1;i<pos;++i)
courant = courant->suivant;
supp_element = courant;
courant->precedent->suivant = courant->suivant;
courant->suivant->precedent = courant->precedent;
}
free(supp_element->donnee);
free(supp_element);
liste->taille--;
return 0;
}
void affiche(dl_Liste *liste){ /* affichage en avançant */
dl_Element *courant;
courant = liste->debut; /* point du départ le 1er élément */
printf("[ ");
while(courant != NULL){
printf("%s ",courant->donnee);
courant = courant->suivant;
}
printf("]\n");
}
void affiche_inv(dl_Liste *liste){ /* affichage en reculant */
dl_Element *courant;
courant = liste->fin; /* point du départ le dernier élément */
printf("[ ");
while(courant != NULL){
printf("%s : ",courant->donnee);
courant = courant->precedent;
}
printf("]\n");
}
void detruire(dl_Liste *liste){
while(liste->taille > 0)
supp(liste,1);
}
/* ---------- dliste.h ----------- */
typedef struct dl_ElementListe{
char *donnee;
struct dl_ElementListe *precedent;
struct dl_ElementListe *suivant;
} dl_Element;
typedef struct dl_ListeRepere{
dl_Element *debut;
dl_Element *fin;
int taille;
} dl_Liste;
/* initialisation de la liste */
void initialisation (dl_Liste * liste);
dl_Element *alloc (dl_Element * nouveau_element);
/* INSERTION */
int ins_dans_liste_vide (dl_Liste * liste, char *donnee);
int ins_debut_liste (dl_Liste * liste, char *donnee);
int ins_fin_liste (dl_Liste * liste, char *donnee);
int ins_apres (dl_Liste * liste, char *donnee, int pos);
int ins_avant (dl_Liste * liste, char *donnee, int pos);
/* SUPPRESSION */
int supp(dl_Liste *liste, int pos);
void affiche (dl_Liste * liste);
/**************************/
void affiche_inv (dl_Liste * liste);
void detruire (dl_Liste * liste);
/* -------- FIN liste.h --------- */
/***************************\
* dliste_function.h *
\***************************/
void initialisation (dl_Liste * liste){
liste->debut = NULL;
liste->fin = NULL;
liste->taille = 0;
}
int insertion_dans_liste_vide (dl_Liste * liste, char *donnee){
dl_Element *nouveau_element;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->precedent = NULL;
nouveau_element->suivant = NULL;
liste->debut = nouveau_element;
liste->fin = nouveau_element;
liste->taille++;
return 0;
}
int ins_debut_liste (dl_Liste * liste, char *donnee){
dl_Element *nouveau_element;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->precedent = NULL;
nouveau_element->suivant = liste->debut;
liste->debut->precedent = nouveau_element;
liste->debut = nouveau_element;
liste->taille++;
return 0;
}
int ins_fin_liste (dl_Liste * liste, char *donnee){
dl_Element *nouveau_element;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
nouveau_element->suivant = NULL;
nouveau_element->precedent = liste->fin;
liste->fin->suivant = nouveau_element;
liste->fin = nouveau_element;
liste->taille++;
return 0;
}
int ins_apres (dl_Liste * liste, char *donnee, int pos){
int i;
dl_Element *nouveau_element, *courant;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
courant = liste->debut;
for (i = 1; i < pos; ++i)
courant = courant->suivant;
nouveau_element->suivant = courant->suivant;
nouveau_element->precedent = courant;
if(courant->suivant == NULL)
liste->fin = nouveau_element;
else
courant->suivant->precedent = nouveau_element;
courant->suivant = nouveau_element;
liste->taille++;
return 0;
}
int ins_avant (dl_Liste * liste, char *donnee, int pos){
int i;
dl_Element *nouveau_element, *courant;
if ((nouveau_element = alloc (nouveau_element)) == NULL)
return -1;
strcpy (nouveau_element->donnee, donnee);
courant = liste->debut;
for (i = 1; i < pos; ++i)
courant = courant->suivant;
nouveau_element->suivant = courant;
nouveau_element-> precedent = courant->precedent;
if(courant->precedent == NULL)
liste->debut = nouveau_element;
else
courant->precedent->suivant = nouveau_element;
courant->precedent = nouveau_element;
liste->taille++;
return 0;
}
int supp(dl_Liste *liste, int pos){
int i;
dl_Element *supp_element,*courant;
if(liste->taille == 0)
return -1;
if(pos == 1){ /* suppresion de 1er élément */
supp_element = liste->debut;
liste->debut = liste->debut->suivant;
if(liste->debut == NULL)
liste->fin = NULL;
else
liste->debut->precedent == NULL;
}else if(pos == liste->taille){ /* suppression du dernier élément */
supp_element = liste->fin;
liste->fin->precedent->suivant = NULL;
liste->fin = liste->fin->precedent;
}else { /* suppression ailleurs */
courant = liste->debut;
for(i=1;i<pos;++i)
courant = courant->suivant;
supp_element = courant;
courant->precedent->suivant = courant->suivant;
courant->suivant->precedent = courant->precedent;
}
free(supp_element->donnee);
free(supp_element);
liste->taille--;
return 0;
}
void detruire(dl_Liste *liste){
while(liste->taille > 0)
supp(liste,1);
}
dl_Element *alloc (dl_Element * nouveau_element){
if ((nouveau_element = (dl_Element *) malloc (sizeof (dl_Element))) == NULL)
return NULL;
if ((nouveau_element->donnee = (char *) malloc (50 * sizeof (char)))
== NULL)
return NULL;
return nouveau_element;
}
int menu (dl_Liste *liste){
int choix;
if (liste->taille == 0){
printf ("1. Ajout du 1er element\n");
printf ("2. Quitter\n");
} else{
printf ("1. Ajout au debut de la liste\n");
printf ("2. Ajout a la fin de la liste\n");
printf ("3. Ajout avant la position specifie\n");
printf ("4. Ajout apres la position specifie\n");
printf ("5. Suppression à la position specifie\n");
printf ("6. Detruire la liste\n");
printf ("7. Quitter\n");
}
printf ("\n\nFaites votre choix : ");
scanf ("%d", &choix);
getchar();
if(liste->taille == 0 && choix == 2)
choix = 7;
return choix;
}
int supp(dl_Liste *liste, int pos);
void affiche(dl_Liste *liste){
dl_Element *courant;
courant = liste->debut;
printf("[ ");
while(courant != NULL){
printf("%s ",courant->donnee);
courant = courant->suivant;
}
printf("]\n");
}
void affiche_inv(dl_Liste *liste){
dl_Element *courant;
courant = liste->fin;
while(courant != NULL){
printf("%s : ",courant->donnee);
courant = courant->precedent;
}
printf("\n");
}
/* -------- FIN dliste_function.h --------- */
/**********************\
* dliste.c *
\**********************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dliste.h"
#include "dliste_function.h"
int main (void)
{
int choix = 0,pos;
char *donnee;
donnee = malloc(50);
dl_Liste *liste;
dl_Element *pilote = NULL;
liste = (dl_Liste *) malloc (sizeof(dl_Liste));
initialisation(liste);
while(choix != 7){
choix = menu(liste);
switch(choix){
case 1:
printf("Entrez un element : ");
scanf("%s",donnee);
getchar();
if(liste->taille == 0)
insertion_dans_liste_vide(liste,donnee);
else
ins_debut_liste (liste, donnee);
printf("%d elements: deb=%s,fin=%s ",
liste->taille,liste->debut->donnee,liste->fin->donnee);
affiche(liste);
break;
case 2:
printf("Entrez un element : ");
scanf("%s",donnee);
getchar();
ins_fin_liste (liste, donnee);
printf("%d elements: deb=%s,fin=%s ",
liste->taille,liste->debut->donnee,liste->fin->donnee);
affiche(liste);
break;
case 3:
if(liste->taille == 1){
printf("Utiliser l'insertion au debut ou a la fin (Entree Menu : 1 ou 2)\n");
break;
}
printf("Entrez un element : ");
scanf("%s",donnee);
getchar();
do{
printf("Entrez la position : ");
scanf("%d",&pos);
}while (pos < 1 || pos > liste->taille);
getchar();
ins_avant(liste,donnee,pos);
printf("%d elements: deb=%s fin=%s ",
liste->taille,liste->debut->donnee,liste->fin->donnee);
affiche(liste);
break;
case 4:
if(liste->taille == 1){
printf("Utiliser l'insertion au debut ou a la fin (Entree Menu : 1 ou 2)\n");
break;
}
printf("Entrez un element : ");
scanf("%s",donnee);
getchar();
do{
printf("Entrez la position : ");
scanf("%d",&pos);
}while (pos < 1 || pos > liste->taille);
getchar();
ins_apres(liste,donnee,pos);
printf("%d elements: deb=%s,fin=%s ",
liste->taille,liste->debut->donnee,liste->fin->donnee);
affiche(liste);
break;
case 5:
do{
printf("Entrez la position : ");
scanf("%d",&pos);
}while (pos < 1 || pos > liste->taille);
getchar();
supp(liste,pos);
if(liste->taille != 0)
printf("%d elements: deb=%s,fin=%s ",
liste->taille,liste->debut->donnee,liste->fin->donnee);
else
printf("liste vide : %d elements",liste->taille);
affiche(liste);
break;
case 6:
detruire(liste);
printf("la liste a ete detruite : %d elements\n",liste->taille);
break;
}
}
return 0;
}
/* -------- FIN dliste.c --------- */
Autres Astuces dans la catégorie Langage C