[commande ls] Problème avec tri
Bonjour tout le monde!
J'essaie de programmer la commande ls de linux.
J'ai fait un premier fichier qui marche :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include <stdlib.h> /* exit */
#include <stdio.h> /* printf */
#include <dirent.h> /* struct DIR */
#include <errno.h> /* perror */
int main (int argc, char * argv [])
{
DIR * ndir;
struct dirent * rdir;
if (argc!=1)
{
fprintf(stderr,"Usage : ls\n");
exit(1);
}
/* ouverture du repertoire courant */
if((ndir=opendir("."))==NULL)
{
perror("OPENDIR");
exit(2);
}
rdir=readdir(ndir);
/* listage des fichiers */
while (rdir != NULL)
{
printf("%s ",rdir->d_name);
rdir=readdir(ndir);
}
printf("\n");
closedir(ndir);
exit(0);
} |
Sauf que les elements ne sont pas dans l'ordre alphabétique.
J'ai donc ajouté un trie. Ca compile aussi mais ca me donne le meme resultat que le premier.
J'ai indiqué la ligne où je pense que l'erreur est.
Deuxieme fichier :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include <stdlib.h> /* exit */
#include <stdio.h> /* printf */
#include <dirent.h> /* struct DIR */
#include <errno.h> /* perror */
struct maillon {
char * valeur;
struct maillon *suivant;
struct maillon *precedant;
};
int main (int argc, char * argv [])
{
struct maillon *tete; /* tete de liste */
struct maillon *nm; /* sert a creer de nouveaux maillons */
struct maillon *buff; /* sert a se ballader */
int nb_maillon=0; /* nombre de maillons (pour affichage) */
int i; /* compteur */
DIR * ndir;
struct dirent * rdir;
tete=NULL;
if (argc!=1)
{
fprintf(stderr,"Usage : lss\n");
exit(1);
}
/* ouverture du repertoire courant */
if((ndir=opendir("."))==NULL)
{
perror("OPENDIR");
exit(2);
}
rdir=readdir(ndir);
/* LISTAGE DES FICHIERS */
while (rdir != NULL)
{
nm=malloc(sizeof(struct maillon)); /* nouveau maillon */
(*nm).valeur=rdir->d_name; /* affectation de la valeur */
nb_maillon=nb_maillon+1; /* incrementation */
/* S'il n'y avait pas de maillon */
if (tete==NULL)
{
tete=nm;
(*tete).suivant=tete;
(*tete).precedant=tete;
}
else
{
/* TRIE */
buff=tete;
/* On se ballade pour trouver la place du nouveau maillon */
while ((*nm).valeur>(*buff).valeur)/*-------------------------------- PROBLEME sur la condition (je pense) il doit penser que chaque nouvelle valeur est superieure */
{
buff=(*buff).suivant;
/* Si le nouveau maillon doit etre en derniere place */
if (buff=tete)
{
break;
}
}
/* Affectation de nm */
(*nm).suivant=buff;
(*nm).precedant=(*buff).precedant;
/* Affectation du maillon de buff */
(*buff).precedant=nm;
/* Affectation du maillon avant buff */
(*(*nm).precedant).suivant=nm;
/* Si le nouveau maillon doit etre en 1ere place */
if ((*nm).valeur<(*tete).valeur)
{
tete=nm;
}
}
rdir=readdir(ndir);
}
/* AFFICHAGE */
buff=tete;
for (i=0;i<nb_maillon;i=i+1)
{
printf("%s ",(*buff).valeur);
buff=(*buff).suivant;
}
printf("\n");
closedir(ndir);
exit(0);
} |
Merci d'avance