// cours_18/01/2003 : selection multiple


/*
SELECTION MULTIPLE
================== 

selon la valeur V :
si = v1 => trt1
si = v2 => trt2
si = v3 => trt3
si = v4 => trt4
...
sinon trtn
fin selon

Consiste à tester l'egalite de valeur courante d'une variable de reference
avec des valeurs individuelles d'un ensemble proposé.
Selon la valeur retournée, un traitement prévu par le test de selection est effectué.
Ensuite retour à la sequence => un seul traitement effectué.

Possibilité de factoriser (si = v1 ou v2 ou v3...=> meme trt)

Valeur la plus probable en 1er, etc... (pour les premieres valeurs, puis ordonnées
pour les moins fréquentes => meilleure lisibilité)


  (TYPE = EMSEMBLE DE VALEURS possibles, domaine de valeurs,
		et d'OPERATIONS APPLICABLES à ces valeurs)


switch (variable typée)
{
case valeur1 : trt1; break;  / break en C pour reprendre la sequence
case valeur2 : trt2; break;
case valeur3 : trt3; break;
...
[default : trtn; ]  / optionnel

};

 */

#include "stdio.h"
#include <stdafx.h>


 // DECLARATIONS GLOBALES
	 // DECLARATION EXO2
	struct cel		 // cel : nom du type de cellule
	{ int info; 	 //données
	  cel  *voisin;	 //reference recursive, pointeur vers le voisin = NULL si par de voisin
	};
	struct cel  *tliste, *fliste;  // tete et fin de liste vers structure de type cel
	struct cel  *surf, *surf_avant;			 // pointeur pour parcourir la liste

	int i;
	int i_mini=0,i_maxi=0;

	 // declaration des fonctions


void Ajouter_en_tete() {
	printf("\nAjouter un nouvel element en tete de liste");

	 // NOUVELLE VALEUR
	printf("\nSaisir une nouvelle donnée :");

	surf=new cel;  // creation d'une nouvelle structure cel et stockage de son adresse dans surf
 	scanf("%i",&surf->info); 
	getchar();

	surf->voisin=NULL;

	if (fliste==NULL) {fliste=surf;};  // dans la cas d'une liste vide

	surf->voisin=tliste;  // surf pointe vers la premier element de la liste
	tliste = surf;  // le debut de liste pointe vers surf



};


void Ajouter_en_fin() {
	printf("\nAjouter un nouvel element en fin de liste");

	 // NOUVELLE VALEUR
	printf("\nSaisir une nouvelle donnée :");

	surf=new cel;  // creation d'une nouvelle structure cel et stockage de son adresse dans surf
 	scanf("%i",&surf->info);  // mettre la valeur saisie dans la zone info de la cellule
	getchar();

	surf->voisin=NULL;

	if (tliste==NULL) 
		{tliste=surf;}  // dans la cas d'une liste vide
		else
		{
		fliste->voisin = surf;  // le dernier element a pour voisin surf
		};  // la fin de liste pointe vers surf

	fliste=surf;


};

void Rechercher_un_element() {

	int rech=0;

	i=1;

	printf("\nRechercher un element dans la liste");

	printf("\nSaisir une valeur à chercher :");
 	scanf("%i",&rech); 
	getchar();

	surf=tliste;

	while (surf!=NULL)
		{
		if (surf->info==rech) {printf("\n -> trouvé à l'index %i",i);};
		i++;
		surf=surf->voisin;
		};  // fin while



};



void Afficher_les_elements() {
	printf("\nAfficher les elements de la liste");
	i_mini=0;
	i_maxi=0;
	if (tliste==NULL) {printf("\n-- la liste est vide --");}
	else
	{
	surf=tliste;
	i=1;
	i_mini=i;
	while (surf != NULL)
	{
		printf("\n %ieme element de la file %i",i,surf->info);
		surf=surf->voisin;
		i_maxi=i;
		i++;
	};  // fin while
	
	};

};


void Supprimer_un_element() {

	int rech = 0;

	printf("\nSupprimer un element de la liste");

	Afficher_les_elements();
	if (i_mini!=0)
	{

	printf("\nDonnez l'index de l'element à supprimer :");
	printf("\nentre %i et %i :",i_mini, i_maxi);
 	scanf("%i",&rech);
	getchar();
	if ((rech<i_mini)||(rech>i_maxi))
		{printf("\n *** index hors limites  ***");}
	else
		{printf("\nsuppression en cours");


	i=1;
	surf=tliste;
	surf_avant=NULL;

	while (i<rech)
	{printf("\n %ieme element de %i de la file %i",i,rech,surf->info);
	surf_avant=surf;
	surf=surf->voisin;
	i++;
	};

	printf("\n A SUPPRIMER :");	
	printf("\n %ieme element de %i de la file %i",i,rech,surf->info);

	 // surf est l'element à supprimer
	
	 // si 1er element : cad surf=tliste 
	 // tliste = surf->voisin
	if (rech==i_mini) { tliste=surf->voisin;} 
	
	 // si dernier element : cad surf=fliste
	 // fliste = avant_surf
	 // avant_surf->voisin==NULL
	else
	{
	if (rech==i_maxi)  { fliste=surf_avant; surf_avant->voisin=NULL; }

	 // autre :
	 // avant_surf->voisin==surf
	else
	{ surf_avant->voisin=surf->voisin;};

	};  // fin else

	 // ici : desallocation de la cellule pointée par surf

	};  // fin else

	};  // fin if (i_mini!=0)
};



 
/*
exercice 1
 */
void exo1 ()
{int i;
	char x;

	for (i=0;i<6;i++)
	{
	printf("\nDonner la valeur de x ? :");

x=getchar ();getchar();

switch(x)
	{
case 'a':
case 'A': printf("\n Traitement A \n");break;

case 'b':
case 'B': printf("\n Traitement B \n");break;

case 'i':
case 'I': printf("\n Traitement I \n");break;

case 'n':
case 'N': printf("\n Traitement N \n");break;

default:printf("Traitement par defaut: \n");
	}  // fin switch
	}  // fin for
};


 
/*
exercice 2
 */
char exo2_menu()
{	char choix = 'o';
	printf("\n\n================================");
	printf("\nOperations sur liste dynamique :");
	printf("\n================================");
	printf("\n A (a) - Ajouter un nouvel element en tete de liste");
	printf("\n F (f) - Ajouter un nouvel element en fin de liste");
	printf("\n R (r) - Rechercher un element dans la liste");
	printf("\n S (s) - Supprimer un element de la liste");
	printf("\n L (l) - Afficher les elements de la liste");
	printf("\n Q (q) - Quitter l'application");
	printf("\nEntrez votre choix :");
	choix=getchar(); getchar();
	return choix;
};

void exo2()
{   	
	 // INITIALISATION 
	tliste=NULL;
	fliste=NULL;
	char choix='o';


	choix=exo2_menu();

	while ((choix!='q')&&(choix!='Q'))
	{	switch (choix)
		{
		case 'a': case 'A' : printf("\nChoix A"); Ajouter_en_tete();
							break;
		case 'f': case 'F' : printf("\nChoix F"); Ajouter_en_fin();
							break;
		case 'r': case 'R' : printf("\nChoix R"); Rechercher_un_element();
							break;
		case 's': case 'S' : printf("\nChoix S"); Supprimer_un_element();
							break;
		case 'l': case 'L' : printf("\nChoix L"); Afficher_les_elements();
							break;
		default : printf("\nCHOIX INCONNU");
		};  // fin switch 

		choix=exo2_menu();

	};  // fin while

};



void main()
{
	printf("\nDebut programme");

	 //exo1();
	exo2();

	printf("\nFin programme\n");
}