codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
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 exchange(char **list, int i, int j) {
char *tmp=list[i];
list[i]=list[j];
list[j]=tmp;
}
char partition(char **list, int p, int r) {
int i=p, j=r, x, v;
char *pivot;
char q;
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);
return q;
}
char **sortlist (char **list, int p, int r) {
char q;
int i;
if(p<r)
{
q=partition(list,p,r);
sortlist(list,p,q-1);
sortlist(list,q+1,r);
}
return list;
}
void printlist(char *outputlist, char **list, int length)
{
int i;
FILE *out=fopen("outputlist.txt","w");
for(i=0; i<length; i++)
fprintf(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("%f\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
printlist((char *)argv[2],list,length);
return 0;
}