Bonjour, je suis étudiant en 1ère informatique de gestion et j'ai eu
quelques problèmes à mon examen d'algorithmiques(que je vais devoir
repasser bientot). Bref..
La question était celle ci :
Modifier la table hachée pour qu'elle utilise le type liste.
1. Adaptez le type fiche_etudiant (plus besoin de pointeur)
2. Adaptezle type Table (il sera constitué d'un tableau de liste et non plus d'un tableau de fiche)
3. Adaptez le code pour les fonctions remplir, ajouter et trouver.
Bon, jusque la je comprend, seulement d'après moi, le type liste est
déja utilisé et je ne sais pas comment je pourrai supprimer le
pointeur. Je ne vois pas ce qu'il faut modifier en fait..
Voila le code :
<hr size="2" width="100%">
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
struct Fiche_etudiant
{
char nom[20];
char prenom[20];
float pourcent;
Fiche_etudiant *ptr_suivant;
};
struct Table
{
Fiche_etudiant *ptr_adresse_debut;
int dimension;
} ;
int h1(char *nom);
int h2( int resultat);
Fiche_etudiant *creer_table(struct Table *table);
Fiche_etudiant *trouver(struct Table *ptable,char *nom);
Fiche_etudiant *ajouter(struct Table *ptable,char *nom);
void afficher(struct Table *ptable);
main()
{
Table *tab;
char nom[20];
Fiche_etudiant *c;
int choix=0;
tab=(Table*)malloc(sizeof(Table));
creer_table(tab);
tab->dimension=N;
printf("\nla m\202moire a \202t\202 allou\202e\n\n");
getch();
clrscr();
while(choix!=4)
{
clrscr();
printf("
GESTION TABLE HASHEE STATIQUE");
printf("\n
*****************************");
printf("\n\n\n");
printf("\n\n 1 ajouter une fiche ");
printf("\n\n 2 trouver une fiche ");
printf("\n\n 3 afficher le tableau complet ");
printf("\n\n 4 quitter le programme ");
printf("\n\n\n\n\n\n
Votre choix ? ");
scanf("%d",&choix);fflush(stdin);
switch(choix)
{
case 1:
clrscr();
printf("\nEntrez le nom : ");
gets(nom);
fflush(stdin);
if (ajouter(tab,nom)==NULL)
{ printf("\nLe nom existe d\202ja");
getch();
}
break;
case 2:
clrscr();
printf("\nEntrez le nom : ");
gets(nom);
c=trouver(tab,nom);
if (c!=NULL)
{
printf("\nNom
: %s\nPr\202nom : %s\nPourcentage
%.2lf",c->nom,c->prenom,c->pourcent);
getch();
clrscr();
}
else
{ printf("\n N'existe pas");
getch();
clrscr();
}
break;
case 3:
{
clrscr();afficher(tab);getch();
}
break;
case 4 :{}break;
}
}
free(tab);
}
/*********************Fonction h1 *********************************************/
int h1(char *nom)
{
int resultat=0;
int i=0, temp = 0;
while(nom[i]!='\0')
{
temp += nom[i]*100;
if(nom[i+1] == '\0') { resultat += temp; return resultat; }
temp += nom[i+1];
resultat += temp;
temp = 0;
i+=2;
}
return resultat;
}
/********************************Fonction h2***********************************/
int h2(int resultat)
{
int rest;
rest=(resultat%N);
printf("%d",rest);
return rest;
}
/****************allouer de la memoire*****************************************/
Fiche_etudiant *creer_table(struct Table *table)
{
int i;
table->ptr_adresse_debut=(Fiche_etudiant *)malloc(sizeof(Fiche_etudiant)*N);
for(i=0;i<N;i++)
{
strcpy(table->ptr_adresse_debut[i].nom,"\0");
strcpy(table->ptr_adresse_debut[i].prenom,"\0");
table->ptr_adresse_debut[i].ptr_suivant=NULL;
}
return table->ptr_adresse_debut;
}
/***************pour ajouter une fiche*****************************************/
Fiche_etudiant *ajouter(struct Table *ptable,char *nom)
{
Fiche_etudiant *nouv_fiche;
Fiche_etudiant *fiche_de_sauv;
int h;
h=h2(h1(nom));//définition de l'indice
fiche_de_sauv = &ptable->ptr_adresse_debut[h];
while(fiche_de_sauv!=NULL)//on est pas au dernier element de la liste
{
if(strcmp(fiche_de_sauv->nom, nom)==0) return NULL;//si les 2 noms sont les même
fiche_de_sauv = fiche_de_sauv->ptr_suivant;
}
if(strcmp(ptable->ptr_adresse_debut[h].nom,"\0")==0)//il n'y a rien dans la table
{
strcpy(ptable->ptr_adresse_debut[h].nom,nom);
printf("\nPr\202nom : ");
gets(ptable->ptr_adresse_debut[h].prenom);
printf("\nPourcentage : ");
scanf("%f",&ptable->ptr_adresse_debut[h].pourcent);
clrscr();
}
else
{
fiche_de_sauv = &ptable->ptr_adresse_debut[h];
nouv_fiche = (Fiche_etudiant*)malloc(sizeof(Fiche_etudiant));
if (nouv_fiche==NULL)
{
printf("L\'allocation de m\202moire pour ce nom a \202chou\202");
getch();
exit(0);
}
while(fiche_de_sauv->ptr_suivant!=NULL) fiche_de_sauv =
fiche_de_sauv->ptr_suivant;
{
strcpy(nouv_fiche->nom,nom);
printf("\nPr\202nom : ");
gets(nouv_fiche->prenom);
printf("\nPourcentage : ");
scanf("%f",&nouv_fiche->pourcent);
clrscr();
fiche_de_sauv->ptr_suivant=nouv_fiche;
nouv_fiche->ptr_suivant=NULL;
}
}
return &ptable->ptr_adresse_debut[h];
}
/*******************************pour trouver une fiche*************************/
Fiche_etudiant *trouver(struct Table *ptable,char *nom)
{
int ht;
struct Fiche_etudiant *fiche_de_sauv;
ht=h2(h1(nom));
fiche_de_sauv=&ptable->ptr_adresse_debut[ht];
while(fiche_de_sauv!=NULL)
{
if(strcmp(nom,fiche_de_sauv->nom)==0)
{
return fiche_de_sauv;
}
else
{
fiche_de_sauv=fiche_de_sauv->ptr_suivant;
}
}
return NULL;
}
/************************pour afficher tout le tableau*************************/
void afficher(struct Table *ptable)
{
int i;
Fiche_etudiant *fiche_de_sauv;
clrscr();
for(i=0;i<N;i++)
{
fiche_de_sauv = &ptable->ptr_adresse_debut[i];
while(fiche_de_sauv!=NULL)
{
printf("%s ",fiche_de_sauv->nom);
fiche_de_sauv=fiche_de_sauv->ptr_suivant;
}
printf("\n");
}
}
<hr size="2" width="100%">Merci
Afficher la suite