01/07/08 9:58
Misciu87
Ciao a tutti,devo un set di stringhe prese in input da un file e restituirle ordinate in un file di output, la prima parte del codice(funzioni exchange,partition e sortlist servono per l'ordinamento le altre funzioni per il caricamento delle stringhe e quelle funzionano) il mio problema e nella funzione partition in quanto questo codice funziona con gli interi ma non con i char perche' nei confronti con <> per i char è diverso dovrei usare strcmp ma non riesco a farlo funzionare, qualcuno può aiutarmi a sistemare i confronti con la strcmp? grazie mille
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> void exchange(char **list, int i, int j) { char *tmp=list[i]; list[i]=list[j]; list[j]=tmp; } int partition(char **list, int p, int r) { int i=p, j=r, x, v; char *pivot; x=rand()%(r-p+1)+p; exchange(list,x,p); pivot=list[p]; while(p<r) { while(j>p && strcmp(list[j],pivot)<0) j--; while(i<r && strcmp(list[j], pivot)>=0) i++; if(i<j) exchange(list,i,j); } exchange(list,p,j); } char **sortlist (char **list, int p, int r) { int q,i; if(p<r) { q=partition(list,p,r); sortlist(list,p,q-1); sortlist(list,q+1,r); } return list; } void readsize(char *inputlist, int *length, int *size) { FILE *in=fopen("inputlist.txt","r"); int i=0,j=0; char tmp; while(fscanf(in,"%c",&tmp)!=EOF && tmp!='\n') j++; rewind(in); while(fscanf(in,"%*s\n")!=EOF) i++; (*length)=i; (*size)=j; fclose(in); } char *readline(FILE *in,int size) { char *line=(char *)malloc(size*sizeof(char)), tmp; int i=0; while(i<size && fscanf(in,"%c",&line[i])!=EOF) i++; fscanf(in,"%c",&tmp); if(tmp!='\n') { printf("Error: malformed file\n"); return NULL; } return line; } char **loadlist(char *inputlist, int *length, int *size) { int i; char **list; FILE *in=fopen("inputlist.txt","r"); readsize(inputlist,length,size); list=(char **)malloc((*length)*sizeof(char *)); for(i=0; i<(*length); i++) list[i]=readline(in,(*size)); fclose(in); return list; } void printlist(char *outputlist, char **list, int length) { int i; FILE *out=fopen("outputlist.txt","w"); for(i=0; i<length; i++) printf(out,"%s\n",list[i]); fprintf(out,"\n"); fclose(out); } int main(int argc, const char *argv[]) { char **list; int length,size; time_t start, end; if(argc!=3) { printf("Usage: stringsort <input list> <output list>\n"); return 1; } list=loadlist((char *)argv[1],&length,&size); start=clock(); list=sortlist(list,length,size); end=clock(); printf("%g\n",(int)(end-start)/(int)CLOCKS_PER_SEC); printlist((char *)argv[2],list,length); return 0; }
Ultima modifica effettuata da Misciu87 01/07/08 10:00
aaa