PDA

View Full Version : MERGESORT STRINGHE CON ARRAY BIDIMENSIONALI


markz88
05-02-2011, 12:36
Salve a tutti,
devo ordinare delle stringhe (di massimo 20 caratteri l'una) dentro un array bidimensionale con l'algoritmo mergesort, ho modificato il codice per adattarlo dall'ordinamento dei numeri all'ordinamento delle stringhe, ma non ottengo il risultato sperato.. credo che il problema sia nell'allocazione dinamica del vettore b, dovrebbe essere un vettore bidimensionale b[r-l+1][21] dinamico, come posso allocarlo dinamicamente? Ecco il mio codice:


void fusiones(char f[][21],int l, int m, int r){


int i, j, k;
char *b;

b = malloc((r - l + 1) * sizeof(char));

i = l;
j = m+1;
k=0;

while((i <= m) && (j <=r)){
if (f[i] < f[j])
strcpy(f[k++], f[i++]);
else
strcpy(f[k++], f[j++]);
}

while(i <= m)
strcpy(b[k++], f[i++]);
while(j <= r)
strcpy(b[k++], f[j++]);
i=l;
k=0;

while ( i <= r)
strcpy(f[i++], b[k++]);

free(b);
}

void mergesorts(char f[][21], int l, int r){

int m;

if (l < r){
m = (l + r) / 2;
mergesorts(f, l, m);
mergesorts(f, m+1, r);
fusiones(f, l, m, r);
}
}

Allocandolo come nel mio codice viene un array dinamico b[r-l+1], come faccio ad allocare dinamicamente un array di questo tipo b[r-l+1][21]?

Grazie per chi mi risponderà

tuccio`
05-02-2011, 12:40
non ho capito, la domanda è come fare ad allocare dinamicamente una matrice?

se sì, così:


char **b;
b = malloc(sizeof(char*) * (r - l + 1));
// Ci sarebbe da controllare se l'allocazione è andata a buon fine
int i;
for (i = 0; i < (r - l + 1); i++)
{
b[i] = malloc(sizeof(char) * 21);
// Come sopra
}

markz88
05-02-2011, 12:44
non ho capito, la domanda è come fare ad allocare dinamicamente una matrice?

se sì, così:


char **b;
b = malloc(sizeof(char*) * (r - l + 1));
// Ci sarebbe da controllare se l'allocazione è andata a buon fine
int i;
for (i = 0; i < (r - l + 1); i++)
{
b[i] = malloc(sizeof(char) * 21);
// Come sopra
}


Si esatto, grazie per avermi spiegato come allocare una matrice :)
Però l'algoritmo continua a non fare cosa richiesto, al posto delle stringhe ordinate mi stampa una serie di caratteri del tipo:



š
ž
¢
¦
ª
®
²

º
¾
Â
Æ
Ê
Î
Ò
Ö
Ú
Þ
â
æ
ê
î
ò
ö

L'algoritmo adesso sarebbe questo:

void fusiones(char f[][21],int l, int m, int r){

int i, j, k;

char **b;
b = malloc(sizeof(char*) * (r - l + 1));
// Ci sarebbe da controllare se l'allocazione è andata a buon fine
for (i = 0; i < (r - l + 1); i++)
{
b[i] = malloc(sizeof(char) * 21);
// Come sopra
}

i = l;
j = m+1;
k=0;

while((i <= m) && (j <=r)){
if (strcmp(f[i], f[j]) < 0)
strcpy(f[k++], f[i++]);
else
strcpy(f[k++], f[j++]);
}

while(i <= m)
strcpy(b[k++], f[i++]);
while(j <= r)
strcpy(b[k++], f[j++]);
i=l;
k=0;

while ( i <= r)
strcpy(f[i++], b[k++]);

free(b);
}

void mergesorts(char f[][21], int l, int r){

int m;

if (l < r){
m = (l + r) / 2;
mergesorts(f, l, m);
mergesorts(f, m+1, r);
fusiones(f, l, m, r);
}
}

c'è qualcosa di sbagliato? O.o