Problème avec quick sort avec des chaines de caractères

Résolu
bakka72 Messages postés 2 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 7 décembre 2004 - 6 déc. 2004 à 22:52
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011 - 7 déc. 2004 à 18:36
Bonjour,

Je dois réalisé un quick sort de chaines et jai u souci .
1er. je parcourt kle fichier a trié pour compter le nombre délément
2eme je crée un tableau nécessaire pour mettre tt mes éléments
3eme je reparcourt mon fichier en enregitrant mes éléments ds le tableau et le pb cest ke seuk le dernier élément du fichier est sauvegardé ds tt le tableau et je comprend po pk ??? kelkun pourai maider svp
merci davance

voici mon code (non optimisé)

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

#define MAXCHAINE 10

void quicksort(char **tab,int nb);

void quicksort(char **tab,int nb)
{
int pivot,cpt,i,cptd=0,cptg=0;
char *bpivot=tab[0];
char *tabg[nb];
char *tabd[nb];
for(cpt=1;cpt<nb;cpt++)
{
/*Clasemen par ordre alphabetique*/
//if(strcmp(bpivot,tab[cpt])>=0) tabg[cptg++]=tab[cpt];
/*Classemen par gardeur*/
if(strlen(bpivot)>=strlen(tab[cpt])) tabg[cptg++]=tab[cpt];
else tabd[cptd++]=tab[cpt];
if (cptg>1) quicksort(tabg,cptg);
if (cptd>1) quicksort(tabd,cptd);
for (i=0;i<cptg;i++) tab[i]=tabg[i];
tab[cptg]=bpivot;
for (i=0;i<cptd;i++) tab[cptg+i+1]=tabd[i];
}
}

int main()
{
FILE *fichier;
FILE *res;
char **tab;
char *buf ;
char mot[100];
char buffer;
int cpt=0;
int parcourstab=0;
int i=0;
int longueur=0;
printf("\n---- Quick sort : Chaine ----\n");

fichier=fopen("words","r");
if (fichier==NULL) return(1);
else{
while(!feof(fichier)){
buffer=fgetc(fichier);
if(buffer=='\n') cpt++;
}

tab = malloc((cpt+1) * sizeof(char*));

if(tab==NULL)
{
printf("Memoire insuffisante\n");
exit(1);
}
else{
printf("Nombre de mot : %d\n\n",cpt);

fseek(fichier,0,SEEK_SET);
while(!feof(fichier)){
buffer=fgetc(fichier);
if(buffer=='\n')
{
mot[i]='\0';
tab[parcourstab] = malloc((longueur+1) * sizeof(char));
if(tab[parcourstab]==NULL)
{
printf("Memoire insuffisante\n");
exit(1);
}
tab[parcourstab] = mot;
printf("%d %s\n",parcourstab,mot);
parcourstab++;
i=0;
longueur=0;
if(parcourstab==20) break;
}
else{
longueur++;
mot[i++]=buffer;
}
}
fclose(fichier);
}

printf("\n");
quicksort(tab,longueur);
res=fopen("words2.txt","w+");
if (res==NULL) return(1);
else{

for(cpt=0;cpt<20;cpt++)
{
fputs(tab[cpt],res);
fputs("\n",res);
}}
fclose(res);
}
free(tab);
return 0;
}

3 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
7 déc. 2004 à 08:47
tab[parcourstab] = mot;

=> tu écrase le buffer alloué par le tableau static à chaque itération, seulle la dernière sera la bonne.
Pour recopier une chaine, c'est strcpy
3
bakka72 Messages postés 2 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 7 décembre 2004
7 déc. 2004 à 10:59
ah oui merci bcp sui tro bete moi
en plus javai deja utilisé la fonction strcpy sui tro deg lol

merci encore
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
7 déc. 2004 à 18:36
bakka : "sui tro bete moi "

excellent...

nanta bakka aurrais tu pu dire encore

nan, ce n'est pas grave, une erreur d'init, ça arrive
++
0
Rejoignez-nous