PDA

View Full Version : [C++] SelectionSort di array di stringhe


Demandred
16-04-2008, 12:29
Ciao ragazzi, vi sarei molto grato se mi indicaste dove sbaglio nel seguente codice. Ho provato di tutto ma proprio non si vuole ordinare questo array....

Ogni volta mi da una stringa fuori posto.

Penso che l'errore sia in posmin ma non lo trovo:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char **leggi_stringhe(int n);
void selsort(char **begin, char **end);
char **pos_min(char **begin, char **end);
void swap(char **a, char **b);
void stampa_stringhe(char **t, int n);
void elimina(char **p, int n);

int main(void) {

char **v;
int n;

printf("Numero di stringhe da ordinare:\n ");
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);
}
else printf( "Input fallito." );
system("pause");
}


char **leggi_stringhe(int n) {

char **p=(char **)malloc(sizeof(char*));

int i;
char *temp=(char *)malloc(sizeof(char));

if( p!=NULL ) {
for (i=0; i<n; i++) {
printf("Inserisci la stringa\n");
scanf("%s", temp);
p[i] = strdup(temp);
}
}
free(temp);

return p;
}


void selsort(char **begin, char **end) {

int i;

for (i = 0;(begin+i)!= end; i++)
swap((pos_min((begin+i), end)), (begin+i));
}


char **pos_min(char **begin, char **end) {

int i;
char **iter = begin;

for (i=0; (begin+i)!= end; i++) {
if (strcmp(*(begin+i),*(begin+1+i)) > 0)
iter=(begin+1+i);
}
return iter;
}


void swap(char **a, char **b) {

char *temp;//=(char *)malloc(sizeof(char));

temp = *a;
*a = *b;
*b = temp;
}


void stampa_stringhe(char **t, int n) {
int i;

for (i=0; i<n; i++) {
printf("%s\n", t[i]);
}
}


void elimina(char **p, int n) {
int i;

for (i=0; i<n; i++) {
free(p[i]);
}

free(p);
}

Demandred
17-04-2008, 08:24
Ho risolto cambiando il ciclo in pos min così:


char **pos_min(char **begin, char **end) {

int i;
char **iter = begin;

for (i=0; (begin+i)<= end; i++) {
if (strcmp(*(iter),*(begin+i)) > 0)
iter=(begin+i);
}
return iter;
}

Tuttavia ogni tanto mi da errori in esecuzione per la gestione della memoria, soprattutto con stringhe lunghe. Secondo voi quale è la causa?
Dovrei allocare dinamicamente anche la variabile temp della funzione swamp?

Tra l'altro... si può scrivere tranquillamente (begin+i)<=end cioè un puntatore è minore di un altro puntatore? L'ho fatto ma mi suona un po' male...

Demandred
17-04-2008, 11:02
Ho provato anche a portarlo sul C qualcuno mi sa spiegare xchè in esecuzione già il metodo leggi_stringhe non funziona?

char **leggi_stringhe(int n) {

char **p=(char **)malloc(sizeof(char*));

int i;
char *temp=(char *)malloc(sizeof(char));

if( p!=NULL ) {
for (i=0; i<n; i++) {
printf("Inserisci la stringa\n");
scanf("%s", temp);
p[i] = strdup(temp);
}
}
free(temp);

return p;
}

Demandred
17-04-2008, 12:34
Chiedete pure il post ho trovato l'errore:

char **p=(char **)malloc(n*sizeof(char*));

al posto di

char **p=(char **)malloc(sizeof(char*));