Acc, siamo riusciti a scrivere il post nello stesso momento...i tuoi suggerimenti sono stati utilissimi, ho un solo problema: Le funzioni richieste sono tutte puntatori a puntatori...ti scrivo il codice :
codice:
char **leggi_stringhe(int n){
int i;
char **p=(char **)malloc(n*sizeof(char*));
char *s=(char *)malloc(sizeof(char)*80);
for(i=0;i<n;i++){
printf("Stringa n. %d: ",i+1);
scanf("%s",s);
p[i]=(char *)malloc(sizeof(char)*strlen(s));
p[i]=strdup(s);
}
free(s);
return p;
}
void selsort(char **begin, char **end){
for(;begin<end;begin++){
swap(begin, pos_min(begin,end));
}
char **pos_min(char **begin, char **end){
char **res;
char **w;
char **app;
res = begin+1;
for (w=begin; w<end; w++){
if (strcmp(*w, *res)< 0)
res=w;
}
return res;
}
void swap(char **a, char **b){
char **papp;
papp=a;
a=b;
b=papp;
printf("SCAMBIO : %s - %s\n",*a,*b);
}
void stampa_stringhe(char **t, int n){
int i;
for(i=0;i<n;i++)
printf("%s",t[i]);
}
void elimina(char **p, int n){
int i;
for(i=0;i<n;i++)
free(p[i]);
free(p);
}
int main(void)
{
char **v;
int n;
printf("Numero di stringhe da ordinare: ");
scanf("%d", &n);
v=leggi_stringhe(n);
if( v!=NULL ) {
selsort(v,v+n-1); // Ordina
printf( "\nVettore ordinato:\n" );
stampa_stringhe(v,n); // Stampa
elimina(v,n); // Libera la memoria
}
else printf( "Input fallito." );
system("PAUSE");
}
L'unico problema che ho è che la funzione SWAP scambia correttamente le due stringhe ma, tornando alla funzione chiamante (selsort), le due stringhe tornano ad essere nelle posizioni iniziali. La cosa non è strana?
Cioé, se io inserisco 's' e poi 'a', swap le scambia (e infatti la printf lo dimostra), ma tornati al selsort, 's' torna ad essere in prima posizione e 'a' in seconda.
Grazie ancora, sei gentilissimo! Buona domenica anche a te