|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Feb 2008
Messaggi: 10
|
[C++] SelectionSort di array di stringhe
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: Codice HTML:
#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); } Ultima modifica di Demandred : 17-04-2008 alle 12:10. |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Feb 2008
Messaggi: 10
|
Ho risolto cambiando il ciclo in pos min così:
Codice HTML:
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;
}
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... Ultima modifica di Demandred : 17-04-2008 alle 12:10. |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Feb 2008
Messaggi: 10
|
Ho provato anche a portarlo sul C qualcuno mi sa spiegare xchè in esecuzione già il metodo leggi_stringhe non funziona?
Codice HTML:
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;
}
Ultima modifica di Demandred : 17-04-2008 alle 12:09. |
|
|
|
|
|
#4 |
|
Junior Member
Iscritto dal: Feb 2008
Messaggi: 10
|
Chiedete pure il post ho trovato l'errore:
char **p=(char **)malloc(n*sizeof(char*)); al posto di char **p=(char **)malloc(sizeof(char*)); |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:53.



















