Oppure

Loading
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
01/07/08 16:54
asdasd
Non vorrei dire una cavolata, ma secondo me sbagli nell'utilizzare quel char **list;

Essendo un puntatore di puntatore non penso puoi accedergli così list[x]

Correggetemi se sbaglio...
aaa
01/07/08 17:38
Misciu87
No parche io ho un pezzo di codice che era di base e sono le funzioni main, readsize, readline e loadlist, in più le altre funzioni(exchenge,partition e sortlist) vanno bene ma funzionano per gli interi e non per i char, io devo modificarlo opportunamente in modo che confronti i char!
aaa
01/07/08 20:56
gantonio
La funzione partition deve restituire un valore ... correggila ...
aaa
01/07/08 23:51
Misciu87
ok l'ho modificato cosi però non funziona lo stesso..
#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;

	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("%g\n",(int)(end-start)/(int)CLOCKS_PER_SEC);
	printlist((char *)argv[2],list,length);

	return 0;
	
}
aaa
10/07/08 13:30
gantonio
Hai aggiunto una

return q;

ma q non esiste nella funzione ... se aggiungi istruzioni a caso, non ti funzionera' mai ...

E non e' solo quello il problema ...
aaa
16/07/08 14:55
Misciu87
Gia risolto da sola!
aaa
16/07/08 15:25
gantonio
Postato originariamente da Misciu87:

Gia risolto da sola!


Bene! Mi fa piacere ...
aaa