Bonjour,
Je suis en école d'ingé et on a un projet a réaliser en C. On doit réaliser un Répertoire téléphonique en Liste Chainée de structure à partir d'un fichier texte dont les contactes ont été rajouté au préalable.
Dans un premier temps, mon code pour extraire les données du fichier texte et le transformer en Liste Chainée ne m'a pas trop posé de problème.
En revanche, par la suite je dois trier les contactes par Nom issu de la Liste Chainée, c'est a ce moment la que je suis bloqué, et que je demande votre aide. J'ai consulté pendant plusieur heure tout les sujets se ramenant au Liste Chainée et au tri, mais soit le sujet diffère trop du mien soit je n'y comprend rien, d'ou ce ma demande d'aide.
Je vois graphiquement comment je dois comparer, je sais aussi que je dois utilise la fonction strcmp pour comparer deux élements de la liste chainée.
Mais je ne sais comment arriver a prendre le premier élement de ma liste et le comparer avec les autres maillons ainsi entre le deuxième et le troisième, au-dela la boucle for s'occupera du reste.
Dans mon code lors de l'estraction des données du fichier texte, j'ai définit un pointeur de structure sur le premier élément de la chaine, or par la suite, ce pointeur va se trouver au dernier maillon, par consequent je n'ai aucun pointeur en Tete de liste a exploiter. De plus, lors de la vérification par un printf de maillon de la liste chainé, la dernière personne du fichier est imprimer 2 fois, j'ai placer un return 0 avant quelle écrive une deuxième fois pour éviter le problème, mais c'est pas très propre dans un programme.
Si vous pouvez m'expliquer comment réaliser le triage, la comparaison des maillons entre eux en m'indiquant la partie du code, cela m'aiderais beaucoup. En ce qui concerne la suite, le décalage du maillon et la suppresion, cela ne devrait pas trop me poser de problème. C'est uniquement la première parti du triage qui me pose problème et qui me bloque.
Je vous remerci du temps consacré a l'avance.
Voici mon fichier texte appellé contact dans le code:
Dupuis Alexis 060102034
alexis.dupuis@hotmail.comKervadec Robin 0139750637 nothing
Pinto Eric 0632323223
ericlepinto53@hotmail.frPicard Nicolas 06118895
nicospicard@live.comVoici mon code :
#include
"stdafx.h"
#include"stdio.h"
#include"stdlib.h"
#include"string.h"/**********************************************************************************************************/typedef
struct contact //Définition de la structure de donnée
{
char Nom[30];
char Prenom[30];
char Telephone[13];
char Email[50];
struct contact * pSuivant;
}contact;/**********************************************************************************************************/int Extraire();
void Trier ();
void main()
{
Extraire();
system("pause");
}/**********************************************************************************************************/int Extraire()
{
FILE* fcontact=NULL;
int etatLecture;struct
contact * pCourant;//Initialisation de la liste chainée
struct
contact *Nouveau;
struct contact *Tete;//Pointe vers la Tete de la liste
Tete = NULL;// Ouverture fichier contact
fcontact=fopen("contact.txt","r");//Vérificationsi l'ouverture du fichier a réussi
if (fcontact) /* ou (fcontact!=NULL) */
{ //Ajout d'un premier élément à la liste chainée
Nouveau = (contact*)malloc(sizeof(contact));
Nouveau->pSuivant = Tete;
Tete = Nouveau;
etatLecture=fscanf(fcontact,"%s %s %s%s",&Nouveau->Prenom, &Nouveau->Nom, &Nouveau->Telephone, &Nouveau->Email); //lecture du premier contact
printf("%s %s %s %s\n\n", Nouveau->Prenom, Nouveau->Nom, Nouveau->Telephone, Nouveau->Email);//tant que ce n'est pas la fin du fichier
while(etatLecture!=EOF)
{//Ajout d'un élément en fin de liste
if (Tete != NULL) //parcours de la liste chaînée jusqu'au dernier noeud
{
pCourant = Tete;
while (pCourant->pSuivant != NULL) pCourant = pCourant->pSuivant;
} pCourant->pSuivant = Nouveau;
Nouveau->pSuivant = NULL;
etatLecture=fscanf(fcontact,
"%s%s%s%s",&Nouveau->Prenom,&Nouveau->Nom,&Nouveau->Telephone, &Nouveau->Email); //printf("etatLecture = %d",etatLecture); //Test de la valeur etatLecture if(etatLecture==-1)return 0; //afin d'éviter la répétition du dernier élément remarqué par le Test precedent printf(
"%s %s %s %s \n\n", Nouveau->Prenom, Nouveau->Nom, Nouveau->Telephone, Nouveau->Email); }
}
else
{
printf ("Erreur d'ouverture \n");
}fclose(fcontact);
return 0;
}/**********************************************************************************************************/void Trier ()
{
}
/**********************************************************************************************************/