// COURS 11/01/2003 : structures dynamiques


/*
Les principales STRUCTURES DYNAMIQUES sont :
---------------------------------
- les files d'attente
- les piles
- les graphes (les arbres en sont un cas particulier)

Pour gerer ces structures, utilisation des pointeurs.

Les files d'attente (QUEUE):
---------------------
- ex : travaux, guichet bancaire,...)
- suite ordonnée d'éléments à traiter
- le critère d'ordre le plus utilisée est l'ordre d'arrivée dans la file (avec un second
critere, éventuellement : critère d'urgence, ou priorité, statique ou dynamique)
- file d'attente classique de type FIFO (First In First Out)

Les piles (STACK):
-----------
- utilisé en informatique, par les interpretation /compilation 
(necessité d'évaluation des expressions dans une formule, par ex.), pile d'execution,
pile d'appel (calling stack)
- suite d'éléments empilés de type LIFO (Last In First Out)

Les graphes (GRAPH):
-------------
- noeuds liés par des arcs (ex stations,noeuds, et reseau,arcs)
- ensemble de sommets, ou noeuds, reliés entre eux par des arcs
- les arcs sont parfois orientés  (sinon on les appelle des arêtes)
- les graphes s'appliquent à divers domaines : réseaux routiers, ferroviaires, téléphoniques, 
neurones, informatique, web...
- les arbres sont des cas particuliers des graphes (strictement hiérarchiques)
- relations de voisinage, de chemin permettant de relier les noeuds d'un graphe( X-->--Y-->--Z )
via les arcs.


(tete_de_file)-->element-->element-->element-->...
  element = structure composée d'un contenu et d'une information de chainage vers le voisin

une structure (enregistrement, record,...) est un ensemble d'éléments simples ou composés
regroupés dans une même entité identifiée par un nom.

en C, C++ :
	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  *tlist;			 / tete de liste vers structure de type cel
	[struct] cel cel1, cel2, cel3;  / declaration de structures de type cel
	[struct] cel  *surf;			 / pointeur pour parcourir la liste

cf exo_0

 */
#include <stdio.h>
#include <stdafx.h>


 
/*
EXO_0 : LISTE ET PARCOUR DE LISTE
 */
void exo_0 ()
{
	 // DECLARATION 
	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, *tlistesv;			 // tete de liste vers structure de type cel
	struct cel cel1, cel2, cel3;  // declaration de structures de type cel
	struct cel  *surf;			 // pointeur pour parcourir la liste
	int i = 1;
	int saisie=0;

	 // INITIALISATION 
	cel1.info=110;
	cel2.info=170;
	cel3.info=246;

	cel1.voisin=&cel2;
	cel2.voisin=&cel3;
	cel3.voisin=NULL;

	tliste=&cel1;

	 // PARCOURS
	printf("\nAffichage des éléments en attente :");
	surf=tliste;
	while (surf != NULL)
	{
		printf("\n %ieme element de la file %i",i,surf->info);
		surf=surf->voisin;
		i++;
	};

	 // 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);

	tlistesv=tliste;  // memo tete de liste  /on met dans le pointeur tliste_sv, le pointeur de tliste (adr de cel1)
	tliste=surf;  // nouvelle tete de liste  / on ecrase le pointeur tliste avec l'adresse de la nouvelle cellule créée
	surf->voisin=tlistesv;  // nouvelle cellule pointe vers l'ancienne tete de liste  / on met la cellule 

	 // PARCOURS
	printf("\nAffichage des éléments en attente :");
	surf=tliste;
	i=1;
	while (surf != NULL)
	{
		printf("\n %ieme element de la file %i",i,surf->info);
		surf=surf->voisin;
		i++;
	};


};


 
/*
EXO_1 : SAISIE D'ELEMENTS, LISTE ET PARCOUR DE LISTE
 */
void exo_1 ()
{
	 // DECLARATION 
	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, *tri, *triav;			 // pointeur pour parcourir la liste

	int i = 1;
	int saisie=0;
	char rep='y';
	char reppos='t';

	 // INITIALISATION 
	tliste=NULL;
	fliste=NULL;

	 // NOUVELLE VALEUR
	printf("\nSaisie des éléments :");

	printf("\n Trié ou non (t ou n)");
	getchar();  // prise de l'entree RC issue du message precedent
	reppos=getchar();

	while ((rep=='y')||(rep=='Y'))
	{
		printf("\nSaisir une nouvelle donnée :");
		surf=new cel;  // creation d'une nouvelle structure de type cel et stockage de son adresse dans surf
 		scanf("%i",&surf->info);

		surf->voisin=NULL;
		if (tliste==NULL) 
			{
				tliste=surf;
				fliste=surf;
			} 
			else 
			{ if (reppos=='t') 
			{ if (tliste->suivant=NULL) {} 
				else
				{triav=null;
				tri=tliste;
				while((surf->info>tri->info))
					{
					triav=tri;
					tri=tri->voisin;
					}
				triav->suivant=surf;
				surf->suivant=tri;
				}
				}
				else
				{
					printf("\n  en fin ou debut ? (f ou d)");
					getchar();  // prise de l'entree RC issue du message precedent
					reppos=getchar();
				
					if (reppos=='f') 
						{
						fliste->voisin=surf;
						fliste=surf;
						}
					else
						{
						surf->voisin=tliste;
						tliste=surf;
						}
				}
			};

		printf("\nNouvelle valeur à saisir ? (y ou Y)");
		getchar();  // prise de l'entree RC issue du message precedent
		rep=getchar();
	};

	 // PARCOURS
	printf("\nAffichage des éléments en attente :");
	surf=tliste;
	i=1;
	while (surf != NULL)
	{
		printf("\n %ieme element de la file %i",i,surf->info);
		surf=surf->voisin;
		i++;
	};


};

void main()
{
	printf("\nDebut de programme");
	 //exo_0();
	exo_1();
	printf("\nFin de programme\n");

}