[ C ] Ordinamento valori di una struttura

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
ale_92
Prode Principiante
Messaggi: 4
Iscrizione: mercoledì 17 giugno 2015, 21:07
Sesso: Femminile

[ C ] Ordinamento valori di una struttura

Messaggio da ale_92 »

Ciao ragazzi!
Avrei un quesito da sootoporvi...è la prima volta che scrivo, spero vada tutto bene xD
Allora....

ho un file di n righe dove in ciascuna di esse c'è RAZZA NOME CODICE(es: 34h5br34) COLORE ANNI... le prime 4 info sono stringhe mentre l'ultima è un intero.

Devo prendere questi dati e metterli in una opportuna struttura dati.
Ho scelto l aseguente

Codice: Seleziona tutto

struct animale {
	
    char razza[20];
	char nome[20];
	char codice[30];
	char colore[30];
    int anni;
    struct animale *next; 
};
poi, prima del main ho fatte queste due typedef

Codice: Seleziona tutto

typedef struct animale cane;
typedef cane *lista_cani;
L'inserimento dei dati nella struttura ( si può definire lista?? ) va a buon fine, come anche la sua stampa.....sto avendo problemi nell'ordinamento :muro:

Codice: Seleziona tutto

lista_cane *split_razza(lista_cane *start, lista_cane *end){
	
	lista_cane *p, *tempstart, *tempp, *pivot;
	
	if(start == NULL)
	
		return NULL;
	
	pivot = start;
	
	p = start;
	
	while((*p)->next!= *end){
		
		char paragone1[20];
		char paragone2[20];
		int ret;
		
		strcpy(paragone1, (*p)->next->razza);
		strcpy(paragone2, (*pivot)->razza);
		
		ret = strcmp(paragone1, paragone2);
		
		if(ret < 0){
			
			(*tempp) = (*p)->next;
			tempstart = start;
			(*p)->next = (*tempp)->next;
			start = tempp;
			(*start)->next= (*tempstart);
					
		}
 		else
 			
 			(*p) = (*p)->next;
		
	}
	
	return start;
	
}


lista_cane* quicksort_razza(lista_cane* start, lista_cane* end){
	
	lista_cane *pivot;
	
	if(start == end)
	
		return start;
	
	pivot = start;
	
	start = split_cane(start, end);
	
	start = quicksort_cane(start, pivot);
	

	
	(*pivot)->next = quicksort_cane((*pivot)->next, end);
	
	return start;
	
}
questo se l'utente sceglie di ordinare il tutto tramite la razza.....

Cosa sto sbagliando???
Mi da il seguente errore:

[Error] cannot convert 'animale*' to 'cane** {aka animale**}' for argument '1' to 'cane** quicksort_razza(cane**, cane**)'

Grazie a tutti :)
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: [ C ] ORDINAMENTO valori di una struttura

Messaggio da cortinico »

Ciao,
Io non rispondo prettamente alla tua domanda ma ti vorrei offrire un'approccio alternativo.
Intanto puoi cercare all'interno del forum altre discussioni che trattano dello stesso problema: quicksort su liste:

http://forum.ubuntu-it.org/viewtopic.ph ... t#p1418218
http://forum.ubuntu-it.org/viewtopic.ph ... t#p4430409
http://forum.ubuntu-it.org/viewtopic.ph ... t#p4369767
http://forum.ubuntu-it.org/viewtopic.ph ... t#p4304306
http://forum.ubuntu-it.org/viewtopic.ph ... t#p2867885

Inoltre se sei alle prime armi ti consiglierei un approccio più semplice ma meno elegante:
invece di crearti una lista di animale, perchè non ti fai un'array di lunghezza fissa. Se sai già a priori indicativamente quanti elementi leggerai fai molto prima, al limite riallochi.
Se fai così utilizzi un array e ti risparmi svariati puntatori, fai un

Codice: Seleziona tutto

struct animale elenco[1000]
E accedi come fosse un'array.

Così facendo puoi utilizzare la funzione di libreria qsort che ti risparmia lo sbatti di dover riscrivere il quicksort da zero. Gli basta la funzione comparatore per fare l'ordinamento (così potrai ordinare su razza, nome o codice, etc. a tuo piacimento.
EDIT: ecco un tutorial http://www.tutorialspoint.com/c_standar ... _qsort.htm

Se domani ho tempo ti do anche un'occhiata al codice.
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
ale_92
Prode Principiante
Messaggi: 4
Iscrizione: mercoledì 17 giugno 2015, 21:07
Sesso: Femminile

Re: [ C ] ORDINAMENTO valori di una struttura

Messaggio da ale_92 »

Grazie della risposta! Guarderò sicuramente tutti i link :)
Il numero di righe del file è variabile purtroppo :(
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [ C ] ORDINAMENTO valori di una struttura

Messaggio da vbextreme »

devi farci vedere come richiami quicksort_razza().

Generalmente per semplificare l'uso delle liste si crea una struttura di supporto che contiene il primo elemento e l'ultimo, in questo modo si elimina l'utilizzo del puntatore a puntatore.
La tua struttura diventerebbe:

Codice: Seleziona tutto

typedef struct _animale {
   
    char razza[20];
   char nome[20];
   char codice[30];
   char colore[30];
    int anni;
    struct _animale *next; 
} animale;

typedef struct _lista_animali
{
    animale* first;
    animale* last;
}lista_animali;

typedef animale cane;
typedef lista_animali lista_cani;
se vuoi vedere qualche esempio sulle liste, clicca sulla mia firma easyframework->easylist e guarda i due file easylist.h e easylist.c
Easy framework per il linguaggio C.
vbextreme hack your life
ale_92
Prode Principiante
Messaggi: 4
Iscrizione: mercoledì 17 giugno 2015, 21:07
Sesso: Femminile

Re: [ C ] ORDINAMENTO valori di una struttura

Messaggio da ale_92 »

grazie!

richiamo il quicksort_razza all'iterno della funzione ordina_lista()

Codice: Seleziona tutto

void ordina_lista(lista_cani cane){
	
	lista_cani *dog;
	int uscita = 1;
	int scelta1;
	char scelta2[20];
	
	while(uscita){
		
	    printf("\n\tScegli in base a quale valore vuoi ordinare i cani?\n");			
	    printf("\n\n\t1)  razza\n");
	    printf("\n\t2)  nome\n");
	    printf("\n\t3)  codice\n");
	    printf("\n\t4)  colore\n");
	    printf("\n\t5)  anni\n");
	    printf("\n\tScelta: ");
	        
		/* Verifica dell'inserimento della scelta */
		if(scanf("%d", &scelta1) == 1){
		
			switch (scelta1) {
				case 1:
					printf("\n\thai scelto di ordinare per razza...ecco il risultato\n");
					
					dog = quicksort_razza(&cane, NULL);
					break;
				case 2:
					printf("\n\thai scelto di ordinare per nome...ecco il risultato\n");					
				
					break;
				case 3:
					printf("\n\thai scelto di ordinare per codice...ecco il risultato\n");
				
					break;
				case 4:
					printf("\n\thai scelto di ordinare per colore...ecco il risultato\n");
				
					break;
				case 5:
				
					printf("\n\thai scelto di ordinare per anni...ecco il risultato\n");
					break;
				default:
					printf("Il numero digitato e' errato!");
					break;
			}
			
		}
    
	}
	
}

Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [ C ] ORDINAMENTO valori di una struttura

Messaggio da vbextreme »

guarda questi due frammenti di codice

Codice: Seleziona tutto

typedef cane *lista_cani;

Codice: Seleziona tutto

lista_cane* quicksort_razza(lista_cane* start, lista_cane* end){
hai visto?
hai sbagliato nomi!
che IDE usi?
Easy framework per il linguaggio C.
vbextreme hack your life
ale_92
Prode Principiante
Messaggi: 4
Iscrizione: mercoledì 17 giugno 2015, 21:07
Sesso: Femminile

Re: [ C ] Ordinamento valori di una struttura

Messaggio da ale_92 »

Ah si scusa, cmq anche correggendo quello non mi si risolve nulla :(
Avatar utente
cortinico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 477
Iscrizione: venerdì 15 maggio 2015, 16:49
Desktop: Unity
Distribuzione: Ubuntu 15.04 amd64
Sesso: Maschile
Località: Pisa
Contatti:

Re: [ C ] ORDINAMENTO valori di una struttura

Messaggio da cortinico »

che IDE usi?
"Look wide, and even when you think you are looking wide – look wider still!"
http://ncorti.com
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [ C ] Ordinamento valori di una struttura

Messaggio da vbextreme »

metto in promozione caratteri ascii al 3x2, affrettatevi...
Come già sa la comunità mi si è rotta la sfera di cristallo e se non posti l'intero codice con il log del compilatore non riesco più a risolvere i problemi.
Potevi almeno dire l'ide che usi e l'errore che ti da adesso riportando un frammento di codice che possiamo compilare anche noi.
In bocca al lupo.
Easy framework per il linguaggio C.
vbextreme hack your life
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti