INTRODUCTION
L’objectif de cet article est
la réalisation d’un programme ayant pour but la création d’un fichier ou répertoire, sa
suppression son affichage et sa recherche (les mêmes fonctionnalité de poste de
travail de système d’exploitation
Windows).
I- ETAPES DE REALISATION
Etape 1
Le
menu général de ce programme se présente
comme suit:
1- Création;
2- Suppression;
3- Affichage;
4- Recherche;
5- Dir ;
6- Renommer ;
8- Quitter.
Etape 2
D'abord il y a création de la racine C par la fonction creation_rac
void
creation_rac (void)
{
rac=(ptr) malloc (sizeof(noeud));
rac->nom[1]='\x0';
rac->nom[0]='c';
rac->type='R';
rac->fils=NULL;
rac->classe=NULL
}
Etape 3
Le contrôle de l’existence du chemin se fait à l’aide de la
fonction extract qui reçoit comme paramètre la racine (frep) et le chemin (gch)
qui sera pointé par l :
printf("donner
le chemin:\n");
scanf("%s",gch);
l=&gch[0];
frep=rac;
frep=Extract(frep,l);
Etape 4
La fonction extract retourne un pointeur qui peut être
soit :
1.
Vide dans ce cas le
chemin n’existe pas problème de chemin
2.
Un pointeur non vide qui
soit vers un fichier soit vers un répertoire avec :
·
un chemin non achevé ce qui
implique que ce chemin contient un fichier qui contient autre chose ce qui représente une contradiction.
·
un chemin achevé ce qui signifie que le chemin bel et
bien existe
La
structure de la fonction Extract est
divisée en trois parties :
3.
le remplissage de la
première tranche du chemin dans un chaîne niv jusqu au /
4.
la recherche de ce nom niv
dans un niveau donné ensemble de frère (classe)
5.
la sortie ou l’appel
récursive de la fonction Extract.
ptr
Extract(ptr frep,refch &p)
{
refch w,l,q,comp;
char ch[1],pch[20];
int i,trouve;
for (i=0;i<20;i++)
niv[i]='\x0';
ch[1]='/';
i=0;
w=p;
while ((*w!='\x0') &&
(*w!=ch[1]))
{
niv[i]=*w;
w++;
i++;
}
if (*w!='\x0')
{
w++;
p=w;
}
else
p=NULL;
q=&niv[0];
trouve=0;
while
((frep!=NULL)&&(trouve==0))
{
comp=q;
w=&frep->nom[0];
while ((comp!=NULL)&&(w!=NULL)&&(*w==*q))
{
comp++;
w++;
}
if ((*comp=='\x0')&&(*w=='\x0'))
trouve=1;
else
frep=frep->classe;
}
if (frep==NULL)
return frep;
else
{
if (p==NULL)
return frep;
if (frep->type=='R')
Extract(frep->fils,p);
else
return frep ;
}
}
Etape 5
La création de nouvel élément à laide de la fonction
création qui s’occupe de la réservation
de la place mémoire nécessaire au pointeur.
void
Creation (ptr &f)
{
ptr w,p1;
if (f->type=='R')
{
Saisie_nm_t();
p1=(ptr) malloc (sizeof(noeud));
strcpy(p1->nom,nm);
p1->type=ty;
p1->classe=NULL;
p1->fils=NULL;
if (f->fils!=NULL)
{
w=f->fils;
while (w->classe!=NULL)
w=w->classe;
w->classe=p1;
}
else
f->fils=p1;
}
else
printf("vous ne pouvez pas creer dans
un fichier:\n");
}
Etape 6
La
fonction afficher permet d’afficher
d’une manière récursive le contenue de l’arborescence.
void Affiche(ptr &P)
{
ptr H,G,D;
int v;
gotoxy(m,n);
printf("ÀÄÄÄÄÄ%s",P->nom);
if (P->fils!=NULL)
{
n=n+1;m=m+4;
G=P->fils;
H=P;
Affiche(G);
H=H->fils->classe;
while(H!=NULL)
{
n=n+1;
D=H;
H=D->classe;
Affiche(D);
}
if(H==NULL)
m=m-4;
}
}
Etape 7
La fonction de suppression est composée essentiellement de
deux parties :
**La partie principale suppression : consiste à
localiser d’abord le père de l’élément à supprimer, deux cas peuvent alors se
présenter
- L’élément à supprimer n’existe pas ;
- L’élément à supprimer existe, on distingue deus cas et dans tous les cas il faut appeler la fonction supprimer qui supprime récursivement :
- Il est le premier du niveau dans ce cas modifier le lien de parenté et le chaînage;
- Au milieu il faut modifier uniquement le chaînage interne entre les frères du même niveau
**La partie
secondaire supprimer :
C’est la suppression et la
libéralisation de la place mémoire
void supprimer(noeud* ar)
{
//printf("
=%s",ar->nom);
if(ar->fils)
supprimer(ar->fils);
if(ar->classe){
supprimer(ar->classe);}
free
(ar);
}
void suppression(ptr P)//P resulat de extract avant voir
ref
{
ptr temp,prec;
prec=temp=P;
P=P->fils;
Saisie_nm_t();
while(((strcmp(P->nom,nm)!=0)||(P->type!=ty))&&(P!=NULL))
{ prec=P;
P=P->classe;
}
if(P==NULL)
printf("Le repertoire ou le fichier <%s> n'existe pas dans le ce chemin\n",nm);
else if(prec->fils==P)
{
//printf("voulez vous vraiment
supprimer le sous arbre (1 si ou)");
prec->fils=P->classe;
P->classe=NULL;
supprimer(P);
}
else
{
if(P!=prec)
{
prec->classe=P->classe;
P->classe=NULL;
supprimer(P);
}
}
}