Trier une structure indexée

Signaler
Messages postés
17
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
4 avril 2006
-
Messages postés
17
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
4 avril 2006
-
Bonjour,

J'ai écrit un programme qui permet de faire des recherches, ajout, suppression sur une liste de membres.
Je dois trier cette liste de nom, lorsque j'affiche la liste des membres il n'y a aucun problème tout est trié mais je ne sais pas comment faire pour trié a nouveau cette liste apres un ou plusieur ajout ?

Merci

Code:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


struct DATE { int jour;
int mois;
int annee;
};


struct PERS { int ref;
char nom[20];
char prenom[20];
struct DATE nais;
};


struct INDEX { char nom[20];
struct PERS *adresse;
};


void Init(struct PERS *, struct INDEX *, int, int *);
void Liste(struct INDEX *, int *, int);
void Recherche(struct INDEX *, int *, int);
void Ajout(struct INDEX *, int *, int);
void Suppression(struct INDEX *, int *, int);
void HeapSort(struct INDEX *, int, int *);
void Paterner(struct INDEX *, int, int, int *);


void main()
{
int nbel = 5;
int *pt;
int choix;
bool fin = false;
struct PERS *per;
struct INDEX *ind;


int occup[10] = {1, 0, 1, 1, 0, 0, 0, 0, 0};



struct DATE nais[] = {{29, 3, 1980}, {20, 8, 1975}, {01, 2, 1978},
{10, 5, 1979}, {25, 10, 1981}};

struct PERS perso[] = {{127, "Dupont", "Jean", {29, 3, 1980}},
{205, "Durand", "Jean", {20, 8, 1975}}, {135, "Dupond", "Marc", {01, 2, 1978}},
{128, "Pire", "Julien", {10, 5, 1979}}, {112, "Meurice", "Xavier", {25, 10, 1981}}};


struct INDEX index[10];


per = &perso[0];
ind = &index[0];
pt = &occup[0];


Init(per, ind, nbel, pt);


do
{
printf("\n MENU\n");
printf(" ----\n\n");


printf(" 1.Liste\n");
printf(" 2.Recherche\n");
printf(" 3.Ajout\n");
printf(" 4.Suppression\n");
printf(" 5.Quitter\n");
printf("\nChoix : ");
fflush(stdin);
scanf("%d", &choix);



switch(choix)
{
case 1:

system("cls");
Liste(ind, pt, nbel);
break;


case 2:

system("cls");
Recherche(ind, pt, nbel);
break;


case 3:

system("cls");
Ajout(ind, pt, nbel);
break;


case 4:


system("cls");
Suppression(ind, pt, nbel);
break;


case 5:


fin = true;
break;
}


}while(fin != true);
}


void Init(struct PERS *per, struct INDEX *ind, int nbel, int *pt)
{
int i;
struct INDEX *indeb;


indeb = ind;


for(i=0;i<nbel;i++)
{
strcpy(ind->nom, per->nom);
ind->adresse = per;
ind ++;
per++;
}

HeapSort(indeb, nbel, pt);
}


void Liste(struct INDEX *ind, int *pt, int nbel)
{
int i;


printf("\n LISTE DES MEMBRES\n");
printf(" -----------------\n\n");
for(i=0;i<nbel;i++)
{
if(*(pt+i) == 1)
{
printf("%d %s %s %d/%d/%d", ind->adresse->ref, ind->nom, ind->adresse->prenom, ind->adresse->nais.jour, ind->adresse->nais.mois, ind->adresse->nais.annee);
printf("\n");
}
ind++;
}
}


void Recherche(struct INDEX *ind, int *pt, int nbel)
{
int i, nbcar;
char nom[20];
bool trouve;


printf("\n RECHERCHE D UN MEMBRE\n");
printf(" ---------------------\n\n");


printf("Entrez le nom du membre que vous recherchez : ");
fflush(stdin);
gets(nom);


nbcar = strlen(nom);
nom[0] = toupper(nom[0]);


for(i=1;i<nbcar;i++)
{
nom[i] = tolower(nom[i]);
}


i=0;
while(i<nbel && trouve != true)
{
strcpy(ind->nom, ind->nom);


if(strcmp(nom, ind->nom) NULL && *(pt+i) 1)
{
printf("\n");
printf("%d %s %s %d/%d/%d", ind->adresse->ref, ind->nom, ind->adresse->prenom, ind->adresse->nais.jour, ind->adresse->nais.mois, ind->adresse->nais.annee);
trouve = true;
printf("\n");
}
ind++;
i++;
}
}


void Ajout(struct INDEX *ind, int *pt, int nbel)
{
int i, j, testint, nbcar;
struct INDEX *ptdeb;


printf("\n AJOUT D UN MEMBRE\n");
printf(" -----------------\n\n");


ptdeb = ind;


i=0;
while(i<nbel && *(pt+i) == 1)
{
i++;
ind++;
}

printf("Entrez la reference : ");
fflush(stdin);
scanf("%d", &ind->adresse->ref);


do
{
printf("Entrez le nom : ");
fflush(stdin);
gets(ind->adresse->nom);


nbcar = strlen(ind->adresse->nom);


if(nbcar == 0)
{
printf("VOUS DEVEZ ENTRER UN NOM !!!\n");
}


}while(nbcar == 0);


ind->adresse->nom[0] = toupper(ind->adresse->nom[0]);


for(j=1;j<nbcar;j++)
{
ind->adresse->nom[j] = tolower(ind->adresse->nom[j]);
}



strcpy(ind->nom, ind->adresse->nom);


do
{
printf("Entrez le prenom : ");
fflush(stdin);
gets(ind->adresse->prenom);


nbcar = strlen(ind->adresse->prenom);


if(nbcar == 0)
{
printf("VOUS DEVEZ ENTRER UN PRENOM !!!\n");
}


}while(nbcar == 0);


ind->adresse->prenom[0] = toupper(ind->adresse->prenom[0]);


for(j=1;j<nbcar;j++)
{
ind->adresse->prenom[j] = tolower(ind->adresse->prenom[j]);
}


do
{
printf("Entrez le jour : ");
fflush(stdin);
testint = scanf("%d", &ind->adresse->nais.jour);


if(testint == 0 || ind->adresse->nais.jour < 1 || ind->adresse->nais.jour > 31)
{
printf("JOUR INVALIDE !!!\n");
}


}while(testint == 0 || ind->adresse->nais.jour < 1 || ind->adresse->nais.jour > 31);


do
{
printf("Entrez le mois : ");
fflush(stdin);
testint = scanf("%d", &ind->adresse->nais.mois);


if(testint == 0 || ind->adresse->nais.mois < 1 || ind->adresse->nais.mois > 12)
{
printf("MOIS INVALIDE !!!\n");
}


}while(testint == 0 || ind->adresse->nais.mois < 1 || ind->adresse->nais.mois > 12);


do
{
printf("Entrez le annee : ");
fflush(stdin);
testint = scanf("%d", &ind->adresse->nais.annee);


if(testint == 0 || ind->adresse->nais.annee > 2005)
{
printf("ANNEE INVALIDE !!!\n");
}



}while(testint == 0 || ind->adresse->nais.annee > 2005);


*(pt+i) = 1;


system("cls");


ind = ptdeb;
Liste(ind, pt, nbel);
}


void Suppression(struct INDEX *ind, int *pt, int nbel)
{
int i, nbcar;
char nom[20];
bool efface;
struct INDEX *ptdeb;


printf("\n SUPPRESSION D UN MEMBRE\n");
printf(" -----------------------\n\n");


ptdeb = ind;


do
{
printf("Entrez le nom du membre a effacer : ");
fflush(stdin);
gets(nom);


nbcar = strlen(nom);


if(nbcar == 0)
{
printf("VOUS DEVEZ ENTRER UN NOM !!!\n");
}


}while(nbcar == 0);


nom[0] = toupper(nom[0]);


for(i=1;i<nbcar;i++)
{
nom[i] = tolower(nom[i]);
}


i=0;
while(i<nbel && efface != true)
{
strcpy(ind->nom, ind->nom);


if(strcmp(nom, ind->nom) == NULL)
{
*(pt+i) = 0;
efface = true;
}
ind++;
i++;
}


system("cls");


ind = ptdeb;
Liste(ind, pt, nbel);


}


void HeapSort(struct INDEX *ind, int nbel, int *pt)
{
int i, tmp3;
char tmp[20];
struct PERS *tmp1;


/* Paterner 1X tous le vecteur */
for (i = (nbel / 2)-1; i >= 0; i--)
{
Paterner(ind, i, nbel, pt);
}


for (i = nbel-1; i >= 1; i--)
{
/* Echange le premier et le dernier élément */
strcpy(tmp, ind->nom);
strcpy(ind->nom, (ind+i)->nom);
strcpy((ind+i)->nom, tmp);


tmp1 = ind->adresse;
ind->adresse = (ind+i)->adresse;
(ind+i)->adresse = tmp1;


tmp3 = *pt;
*pt = *(pt+i);
*(pt+i) = tmp3;


/* Paterne une 2X le vecteur avec nombre d'éléments - 1 */
Paterner(ind, 0, i-1, pt);
}
}



void Paterner(struct INDEX *ind, int pere, int finvec, int *pt)
{
int trie, fils, tmp3;
char tmp[20];
struct PERS *tmp1;


trie = 0;


/**************************************************************************/
/* Boucle tant que indice du pere*2 est plus petit que le dernier élément */
/**************************************************************************/


while ((pere*2 <= finvec) && (trie != 1))
{
if (pere*2 == finvec)
{
fils = pere*2;
}
else
{
if (strcmp((ind+pere*2)->nom, (ind+(pere*2 + 1))->nom) > 0)
{
fils = pere*2;
}
else
{
fils = pere*2 + 1;
}
}
if (strcmp((ind+pere)->nom, (ind+fils)->nom) < 0)
{


strcpy(tmp, (ind+pere)->nom);
strcpy((ind+pere)->nom, (ind+fils)->nom);
strcpy((ind+fils)->nom, tmp);


tmp1 = (ind+pere)->adresse;
(ind+pere)->adresse = (ind+fils)->adresse;
(ind+fils)->adresse = tmp1;


tmp3 = *(pt+pere);
*(pt+pere) = *(pt+fils);
*(pt+fils) = tmp3;


pere = fils;


}
else
{
trie = 1;
}
}
}

3 réponses

Messages postés
17
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
4 avril 2006

j'aimerais aussi pouvoir ajouter plus d'un membre mais mon programme plante et je ne saisi pas pourquoi ?

Merci
Messages postés
99
Date d'inscription
mercredi 12 mai 2004
Statut
Membre
Dernière intervention
29 mars 2006

Si tu veu vraiment obtenir une réponse pose une question claire.

Toi tu dit mon programe plante et tu pose un fichier de 430 lignes sans commentaires.

Ce site n'est pas fait pour faire le boulot a ta place.



cepandant il y'a plusieurs problemes dans ton code. Il manque un #include <ctype.h>.




<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Kate, the KDE Advanced Text Editor">

strcmp(nom, ind->nom) == NULL (lignes 335 et 168)

strcmp retourne un entier et NULL est un pointeur. utilise ==0



Sinon chez moi le prog marche (sous linux avec KDevlop).

Tu utilise quoi pour compiler ?

Si tu a visual C++ tu a un debugueur integré.
Messages postés
17
Date d'inscription
lundi 16 janvier 2006
Statut
Membre
Dernière intervention
4 avril 2006

J'utilise Visual C++. Désolé pour les commentaires.
En fait quand je lance le programme et que je choisi AJOUT dans le menu, je dois entrer les information demandé puis on me demande si je veu en ajouter un autre. Si je met 'o' je peu réentré un nouveau membre sinon je revien au menu principal. Si je choisi LISTE le programme doit m'afficher les membre dans l'ordre alphabétique mais je ne sais pas ou mettre l'appelle de mon tri ?

J'ai modifié le code reste ce seul probleme de trier apres plusieur nouveau ajout

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


struct DATE { int jour;
int mois;
int annee;
};


struct PERS { int ref;
char nom[20];
char prenom[20];
struct DATE nais;
};


struct INDEX { char nom[20];
struct PERS *adresse;
};


void Init(struct PERS *, struct INDEX *, int, int *);
void Liste(struct INDEX *, int *, int);
void Recherche(struct INDEX *, int *, int);
void Ajout(struct INDEX *, int *, int);
void Suppression(struct INDEX *, int *, int);
void HeapSort(struct INDEX *, int, int *);
void Paterner(struct INDEX *, int, int, int *);


void main()
{
int nbel = 5;
int *pt;
int choix;
bool fin;
struct PERS *per;
struct INDEX *ind;


int occup[10] = {1, 0, 1, 1, 0, 0, 0, 0, 0, 0};



struct DATE nais[] = {{29, 3, 1980}, {20, 8, 1975}, {01, 2, 1978},
{10, 5, 1979}, {25, 10, 1981}};

struct PERS perso[] = {{127, "Dupont", "Jean", {29, 3, 1980}},
{205, "Durand", "Jean", {20, 8, 1975}}, {135, "Dupond", "Marc", {01, 2, 1978}},
{128, "Pire", "Julien", {10, 5, 1979}}, {112, "Meurice", "Xavier", {25, 10, 1981}}};


struct INDEX index[10];


per = &perso[0];
ind = &index[0];
pt = &occup[0];


Init(per, ind, nbel, pt);


do
{
fin = false;
printf("\n MENU\n");
printf(" ----\n\n");


printf(" 1.Liste\n");
printf(" 2.Recherche\n");
printf(" 3.Ajout\n");
printf(" 4.Suppression\n");
printf("\nChoix : ");
fflush(stdin);
scanf("%d", &choix);


switch(choix)
{
case 1:

system("cls");
Liste(ind, pt, nbel);
break;


case 2:

system("cls");
Recherche(ind, pt, nbel);
break;


case 3:

system("cls");
Ajout(ind, pt, nbel);
break;


case 4:


system("cls");
Suppression(ind, pt, nbel);
break;


case 5:


fin = true;
break;


default:


printf("Choix non disponible");
break;
}


}while(fin != true);
}


/* Initialise et trie l'index */


void Init(struct PERS *per, struct INDEX *ind, int nbel, int *pt)
{
int i;
struct INDEX *indeb;


indeb = ind;


for(i=0;i<nbel;i++)
{
strcpy(ind->nom, per->nom);
ind->adresse = per;
ind ++;
per++;
}

HeapSort(indeb, nbel, pt);
}


/* Affiche la liste des membre dans l'ordre alphabétique */


void Liste(struct INDEX *ind, int *pt, int nbel)
{
int i;


printf("\n LISTE DES MEMBRES\n");
printf(" -----------------\n\n");
for(i=0;i<nbel;i++)
{
if(*(pt+i) == 1)
{
printf("%d %s %s %d/%d/%d", ind->adresse->ref, ind->nom, ind->adresse->prenom, ind->adresse->nais.jour, ind->adresse->nais.mois, ind->adresse->nais.annee);
printf("\n");
}
ind++;
}
}


/* Permet de rechercher un membre */


void Recherche(struct INDEX *ind, int *pt, int nbel)
{
int i, nbcar;
char nom[20];
bool trouve;


printf("\n RECHERCHE D UN MEMBRE\n");
printf(" ---------------------\n\n");


printf("Entrez le nom du membre que vous recherchez : ");
fflush(stdin);
gets(nom);


nbcar = strlen(nom);
nom[0] = toupper(nom[0]);


for(i=1;i<nbcar;i++)
{
nom[i] = tolower(nom[i]);
}


i=0;
while(i<nbel && trouve != true)
{
strcpy(ind->nom, ind->nom);


if(strcmp(nom, ind->nom) NULL && *(pt+i) 1)
{
printf("%d %s %s %d/%d/%d", ind->adresse->ref, ind->nom, ind->adresse->prenom, ind->adresse->nais.jour, ind->adresse->nais.mois, ind->adresse->nais.annee);
trouve = true;
}
printf("\n");
ind++;
i++;
}
}


/* Permet d'ajouter un nouveau membre */


void Ajout(struct INDEX *ind, int *pt, int nbel)
{
int i, j, testint, nbcar;
char choix;
struct INDEX *ptdeb;


ptdeb = ind;


do
{
printf("\n AJOUT D UN MEMBRE\n");
printf(" -----------------\n\n");


i=0;
while(i<nbel && *(pt+i) == 1)
{
i++;
ind++;
}


if(i<nbel && *(pt+i) == 0)
{

do
{
printf("Entrez la reference : ");
fflush(stdin);
testint = scanf("%d", &ind->adresse->ref);


if(testint == 0)
{
printf("CARACTERE INVALIDE !!!\n");
}


}while(testint == 0);


do
{
printf("Entrez le nom : ");
fflush(stdin);
gets(ind->adresse->nom);


nbcar = strlen(ind->adresse->nom);


if(nbcar == 0)
{
printf("VOUS DEVEZ ENTRER UN NOM !!!\n");
}


}while(nbcar == 0);


ind->adresse->nom[0] = toupper(ind->adresse->nom[0]);


for(j=1;j<nbcar;j++)
{
ind->adresse->nom[j] = tolower(ind->adresse->nom[j]);
}



strcpy(ind->nom, ind->adresse->nom);


do
{
printf("Entrez le prenom : ");
fflush(stdin);
gets(ind->adresse->prenom);


nbcar = strlen(ind->adresse->prenom);


if(nbcar == 0)
{
printf("VOUS DEVEZ ENTRER UN PRENOM !!!\n");
}


}while(nbcar == 0);


ind->adresse->prenom[0] = toupper(ind->adresse->prenom[0]);


for(j=1;j<nbcar;j++)
{
ind->adresse->prenom[j] = tolower(ind->adresse->prenom[j]);
}


do
{
printf("Entrez le jour : ");
fflush(stdin);
testint = scanf("%d", &ind->adresse->nais.jour);


if(testint == 0 || ind->adresse->nais.jour < 1 || ind->adresse->nais.jour > 31)
{
printf("JOUR INVALIDE !!!\n");
}


}while(testint == 0 || ind->adresse->nais.jour < 1 || ind->adresse->nais.jour > 31);


do
{
printf("Entrez le mois : ");
fflush(stdin);
testint = scanf("%d", &ind->adresse->nais.mois);


if(testint == 0 || ind->adresse->nais.mois < 1 || ind->adresse->nais.mois > 12)
{
printf("MOIS INVALIDE !!!\n");
}


}while(testint == 0 || ind->adresse->nais.mois < 1 || ind->adresse->nais.mois > 12);


do
{
printf("Entrez le annee : ");
fflush(stdin);
testint = scanf("%d", &ind->adresse->nais.annee);


if(testint == 0 || ind->adresse->nais.annee > 2005)
{
printf("ANNEE INVALIDE !!!\n");
}



}while(testint == 0 || ind->adresse->nais.annee > 2005);


*(pt+i) = 1;


system("cls");


}


/* Demande si on veut ajouter un autre membre */


printf("Recommencer ?");
fflush(stdin);
scanf("%c", &choix);


}while(choix == 'o');


}


/* Supprimme un membre */


void Suppression(struct INDEX *ind, int *pt, int nbel)
{
int i, nbcar;
char nom[20];
bool efface;
struct INDEX *ptdeb;


printf("\n SUPPRESSION D UN MEMBRE\n");
printf(" -----------------------\n\n");


ptdeb = ind;


do
{
printf("Entrez le nom du membre a effacer : ");
fflush(stdin);
gets(nom);


nbcar = strlen(nom);


if(nbcar == 0)
{
printf("VOUS DEVEZ ENTRER UN NOM !!!\n");
}


}while(nbcar == 0);


nom[0] = toupper(nom[0]);


for(i=1;i<nbcar;i++)
{
nom[i] = tolower(nom[i]);
}


i=0;
while(i<nbel && efface != true)
{
strcpy(ind->nom, ind->nom);


if(strcmp(nom, ind->nom) == 0)
{
*(pt+i) = 0;
efface = true;
}
ind++;
i++;
}


system("cls");


ind = ptdeb;
Liste(ind, pt, nbel);


}


/* Fonction de tri basé sur le Heapsort */


void HeapSort(struct INDEX *ind, int nbel, int *pt)
{
int i, tmp3;
char tmp[20];
struct PERS *tmp1;


/* Paterner 1X tous le vecteur */
for (i = (nbel / 2)-1; i >= 0; i--)
{
Paterner(ind, i, nbel, pt);
}


for (i = nbel-1; i >= 1; i--)
{
/* Echange le premier et le dernier élément */
strcpy(tmp, ind->nom);
strcpy(ind->nom, (ind+i)->nom);
strcpy((ind+i)->nom, tmp);


tmp1 = ind->adresse;
ind->adresse = (ind+i)->adresse;
(ind+i)->adresse = tmp1;


tmp3 = *pt;
*pt = *(pt+i);
*(pt+i) = tmp3;


/* Paterne une 2X le vecteur avec nombre d'éléments - 1 */
Paterner(ind, 0, i-1, pt);
}
}



void Paterner(struct INDEX *ind, int pere, int finvec, int *pt)
{
int trie, fils, tmp3;
char tmp[20];
struct PERS *tmp1;


trie = 0;


/**************************************************************************/
/* Boucle tant que indice du pere*2 est plus petit que le dernier élément */
/**************************************************************************/


while ((pere*2 <= finvec) && (trie != 1))
{
if (pere*2 == finvec)
{
fils = pere*2;
}
else
{
if (strcmp((ind+pere*2)->nom, (ind+(pere*2 + 1))->nom) > 0)
{
fils = pere*2;
}
else
{
fils = pere*2 + 1;
}
}
if (strcmp((ind+pere)->nom, (ind+fils)->nom) < 0)
{


strcpy(tmp, (ind+pere)->nom);
strcpy((ind+pere)->nom, (ind+fils)->nom);
strcpy((ind+fils)->nom, tmp);


tmp1 = (ind+pere)->adresse;
(ind+pere)->adresse = (ind+fils)->adresse;
(ind+fils)->adresse = tmp1;


tmp3 = *(pt+pere);
*(pt+pere) = *(pt+fils);
*(pt+fils) = tmp3;


pere = fils;


}
else
{
trie = 1;
}
}
}