// cour_08/02/2003 : gestion de fichiers / liste chainée / tri
#include <stdio.h>
#include <stdafx.h>
#include <string.h>
struct cel
{ char nomVille[20];
int nbHab;
int info;
cel * voisin;
cel * precedent;
};
struct cel *tliste, *fliste;
struct cel *surf, *surf_avant;
FILE *pf;
bool rep;
int i;
int i_mini=0,i_maxi=0;
bool ouvrir_fichier (char * mode)
{ char nom_fichier[20];
printf("\n Donnez le nom du fichier à ouvrir :");
scanf("%s",&nom_fichier);
printf("\n fichier à ouvrir -> %s",nom_fichier);
pf=fopen(nom_fichier,mode);
if (pf==NULL) {printf("\n *** erreur ouverture %s",nom_fichier); return false;}
else {printf("\n ok, fichier %s ouvert",nom_fichier); return true;};
};
void fermer_fichier()
{
fclose(pf);
};
void lire_fichier()
{
char ville[20];
int hab;
fscanf(pf,"%s",&ville);
fscanf(pf,"%i",&hab);
while (!feof(pf))
{
printf("\n Ville:%s Hab:%i",ville,hab);
fscanf(pf,"%s",&ville);
fscanf(pf,"%i",&hab);
};
};
void ajouter_en_entete(char ville[20], int hab) {
printf("\nAjouter un nouvel element en tete de liste");
surf=new cel;
strcpy((surf->nomVille),ville);
(surf->nbHab)=hab;
surf->voisin=NULL;
surf->precedent=NULL;
if (fliste==NULL) {fliste=surf;} else {tliste->precedent=surf;};
surf->voisin=tliste;
tliste = surf;
};
void charger_fichier_dans_liste()
{
char ville[20];
int hab;
int nbAjout=0;
rep=ouvrir_fichier("r");
if (rep)
{
fscanf(pf,"%s",&ville);
fscanf(pf,"%i",&hab);
while (!feof(pf))
{
ajouter_en_entete(ville,hab);
nbAjout++;
fscanf(pf,"%s %i",&ville,&hab);
};
fermer_fichier();
};
printf("%i",nbAjout);
};
void trier_liste()
{
char max_cle[20];
struct cel *pmax;
char sv_nomVille[20];
int sv_nbHab;
int indice_max=0;
surf=fliste;
while (!(surf==tliste))
{
strcpy(max_cle,surf->nomVille);
printf("\n max_cle %s",max_cle);
surf_avant=surf;
pmax=surf_avant;
while (!(surf_avant==NULL))
{
if (strcmp(surf_avant->nomVille,max_cle)>0)
{
strcpy(max_cle,surf_avant->nomVille);
printf("\n new max_cle %s",max_cle);
pmax=surf_avant;
};
surf_avant=surf_avant->precedent;
};
printf("\n permutte %s : %s %s",max_cle,pmax->nomVille,surf->nomVille);
strcpy(sv_nomVille,surf->nomVille);
sv_nbHab=surf->nbHab;
strcpy(surf->nomVille,pmax->nomVille);
surf->nbHab=pmax->nbHab;
strcpy(pmax->nomVille,sv_nomVille);
pmax->nbHab=sv_nbHab;
surf=surf->precedent;
};
};
void sauvegarder_liste()
{
if (tliste==NULL)
{printf("\n-- la liste est vide --");}
else
{
rep=ouvrir_fichier("w");
if (rep)
{
surf=tliste;
while (surf != NULL)
{
fprintf(pf,"%s %i\n",surf->nomVille,surf->nbHab);
surf=surf->voisin;
};
};
};
};
void Ajouter_en_fin() {
printf("\nAjouter un nouvel element en fin de liste");
printf("\nSaisir une nouvelle donnée :");
surf=new cel;
scanf("%i",&surf->info);
getchar();
surf->voisin=NULL;
if (tliste==NULL)
{tliste=surf;}
else
{
fliste->voisin = 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;
};
};
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++;
};
};
};
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);
if (rech==i_mini) { tliste=surf->voisin;}
else
{
if (rech==i_maxi) { fliste=surf_avant; surf_avant->voisin=NULL; }
else
{ surf_avant->voisin=surf->voisin;};
};
};
};
};
void main()
{
printf("\nDebut de programme");
rep=ouvrir_fichier("r");
if (rep) {lire_fichier(); fermer_fichier();};
charger_fichier_dans_liste();
trier_liste();
sauvegarder_liste();
printf("\nFin de programme\n");
}