Répertoire téléphonique en Liste Chainée

Signaler
Messages postés
2
Date d'inscription
mercredi 2 avril 2008
Statut
Membre
Dernière intervention
8 avril 2008
-
Messages postés
2
Date d'inscription
mercredi 2 avril 2008
Statut
Membre
Dernière intervention
8 avril 2008
-
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 [mailto:alexis.dupuis@hotmail.com alexis.dupuis@hotmail.com]
Kervadec Robin 0139750637 nothing
Pinto Eric 0632323223 [mailto:ericlepinto53@hotmail.fr ericlepinto53@hotmail.fr]
Picard Nicolas 06118895 [mailto:nicospicard@live.com nicospicard@live.com]

Voici 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 ()
{
}

/**********************************************************************************************************/

1 réponse

Messages postés
2
Date d'inscription
mercredi 2 avril 2008
Statut
Membre
Dernière intervention
8 avril 2008

J'ai commencé a réaliser ceci mais ça ne fonctionne pas, il m'indique que pCourant n'est pas initialiser.

void Trier ()
{
struct contact * pCourant;
struct contact * Tete;

Tete = pCourant;

Tete->pSuivant = NULL;

printf("%s %s %s %s \n\n", Tete->Prenom, Tete->Nom, Tete->Telephone, Tete->Email);

while (pCourant->pPrecedant != NULL)
{
    pCourant = pCourant->pPrecedant;
    printf("%s %s %s %s \n\n", pCourant->Prenom, pCourant->Nom, pCourant->Telephone, pCourant->Email);

}

}