nalsk
13-06-2009, 17:21
Salve a tutti,
Sono nuovo del forum hardware upgrade, e colgo l'occasione di fare il mio primo post chiedendovi disperatamente aiuto sul funzionamento del radix sort! :fagiano:
Vorrei implementare l'algoritmo di ordinamento su un vettore di liste riempite random da numeri interi.
Il mio problema è il seguente: quando richiamo la funzione radix, se la utilizzo nel seguente modo:
rad=radix_sort(rad);
il compilatore mi da un errore sull'argomento che passo alla funzione, mentre sia nella mask sia nella dichiarativa ho usato list_pointer radix_sort(list_pointer ptr), che a mio avviso è compatibile con la chiamata che uso.
Se potreste mettermi almeno sulla giusta strada ve ne sarei grato, in quanto non sono sicuro di aver eseguito tutti i passaggi alla perfezione.
grazie in anticipo.. :help: :help:
riporto il codice che ho buttato giù fino ad ora:
#include <stdio.h>
#include <stdlib.h>
#define RADICE_SIZE 10 //GRANDEZZA RADIX
#define MAX_CIFRE 4
#define MAX_ELEM 10
typedef struct list_node *list_pointer;
typedef struct list_node {
int chiave[MAX_CIFRE];
list_pointer link;
}lista;
void random (void);
void visrad(list_pointer ptr);
list_pointer radix_sort(list_pointer);
list_pointer rad[RADICE_SIZE];
int vettore[MAX_ELEM];
main()
{
int i;
printf("\tCreazione:\n\n");
random();
for(i=0;i<RADICE_SIZE;i++) {
printf("\t%d",i);
visrad(rad[i]);
printf("\n");
}
printf("\n");
for(i=0;i<MAX_ELEM;i++) printf("%5d",vettore[i]);
printf("\n\n\tOrdinamento:\n\n");
for(i=0;i<RADICE_SIZE;i++) rad[i]=radix_sort(rad[i]);
printf("x");
for(i=0;i<RADICE_SIZE;i++) {
printf("\t%d",i);
visrad(rad[i]);
printf("\n");
}
fflush(stdin);getchar();
}
//------------- INSERIMENTO --------------------------------------------
void insert_rad (list_pointer *ptr,int item)
{
list_pointer temp;
int i,aux;
temp = (lista*)malloc(sizeof(lista));
for(i=0;i<MAX_CIFRE;i++) temp->chiave[i]=(int)(item/pow(10,i))%10;
temp->link = *ptr;
*ptr = temp;
}
//------------- INSERIMENTO --------------------------------------------
void random (void)
{
int i,x;
srand(time(NULL));
for(i=0;i<MAX_ELEM;i++) {
vettore[i]=rand()%((int)pow(RADICE_SIZE,MAX_CIFRE));
x=rand()%(RADICE_SIZE);
insert_rad(&rad[x],vettore[i]);
}
}
//------------- VISITA DELLA RADICE -------------------------------------
void visrad(list_pointer ptr)
{
int i;
printf("\t");
for(;ptr;ptr=ptr->link) {
for(i=MAX_CIFRE-1;i>=0;i--)
printf("%d",ptr->chiave[i]);
printf(" ");
}
}
//------------- ORDINAMENTO --------------------------------------------
list_pointer radix_sort(list_pointer ptr)
{
list_pointer davanti[RADICE_SIZE],dietro[RADICE_SIZE];
int i,j,cifra;
for(i = MAX_CIFRE-1;i>=0;i--) {
for(j=0;j<RADICE_SIZE;j++) davanti[j] = dietro[j] = NULL;
while(ptr) {
cifra = ptr->chiave[i];
if(!davanti[cifra]) davanti[cifra] = ptr;
else dietro[cifra]->link = ptr;
dietro[cifra] = ptr;
ptr = ptr->link;
}
ptr = NULL;
for(j = RADICE_SIZE-1;j>=0;j--)
if(davanti[j]) {
dietro[j]->link = ptr;
ptr = davanti[j];
}
}
return ptr;
}
Sono nuovo del forum hardware upgrade, e colgo l'occasione di fare il mio primo post chiedendovi disperatamente aiuto sul funzionamento del radix sort! :fagiano:
Vorrei implementare l'algoritmo di ordinamento su un vettore di liste riempite random da numeri interi.
Il mio problema è il seguente: quando richiamo la funzione radix, se la utilizzo nel seguente modo:
rad=radix_sort(rad);
il compilatore mi da un errore sull'argomento che passo alla funzione, mentre sia nella mask sia nella dichiarativa ho usato list_pointer radix_sort(list_pointer ptr), che a mio avviso è compatibile con la chiamata che uso.
Se potreste mettermi almeno sulla giusta strada ve ne sarei grato, in quanto non sono sicuro di aver eseguito tutti i passaggi alla perfezione.
grazie in anticipo.. :help: :help:
riporto il codice che ho buttato giù fino ad ora:
#include <stdio.h>
#include <stdlib.h>
#define RADICE_SIZE 10 //GRANDEZZA RADIX
#define MAX_CIFRE 4
#define MAX_ELEM 10
typedef struct list_node *list_pointer;
typedef struct list_node {
int chiave[MAX_CIFRE];
list_pointer link;
}lista;
void random (void);
void visrad(list_pointer ptr);
list_pointer radix_sort(list_pointer);
list_pointer rad[RADICE_SIZE];
int vettore[MAX_ELEM];
main()
{
int i;
printf("\tCreazione:\n\n");
random();
for(i=0;i<RADICE_SIZE;i++) {
printf("\t%d",i);
visrad(rad[i]);
printf("\n");
}
printf("\n");
for(i=0;i<MAX_ELEM;i++) printf("%5d",vettore[i]);
printf("\n\n\tOrdinamento:\n\n");
for(i=0;i<RADICE_SIZE;i++) rad[i]=radix_sort(rad[i]);
printf("x");
for(i=0;i<RADICE_SIZE;i++) {
printf("\t%d",i);
visrad(rad[i]);
printf("\n");
}
fflush(stdin);getchar();
}
//------------- INSERIMENTO --------------------------------------------
void insert_rad (list_pointer *ptr,int item)
{
list_pointer temp;
int i,aux;
temp = (lista*)malloc(sizeof(lista));
for(i=0;i<MAX_CIFRE;i++) temp->chiave[i]=(int)(item/pow(10,i))%10;
temp->link = *ptr;
*ptr = temp;
}
//------------- INSERIMENTO --------------------------------------------
void random (void)
{
int i,x;
srand(time(NULL));
for(i=0;i<MAX_ELEM;i++) {
vettore[i]=rand()%((int)pow(RADICE_SIZE,MAX_CIFRE));
x=rand()%(RADICE_SIZE);
insert_rad(&rad[x],vettore[i]);
}
}
//------------- VISITA DELLA RADICE -------------------------------------
void visrad(list_pointer ptr)
{
int i;
printf("\t");
for(;ptr;ptr=ptr->link) {
for(i=MAX_CIFRE-1;i>=0;i--)
printf("%d",ptr->chiave[i]);
printf(" ");
}
}
//------------- ORDINAMENTO --------------------------------------------
list_pointer radix_sort(list_pointer ptr)
{
list_pointer davanti[RADICE_SIZE],dietro[RADICE_SIZE];
int i,j,cifra;
for(i = MAX_CIFRE-1;i>=0;i--) {
for(j=0;j<RADICE_SIZE;j++) davanti[j] = dietro[j] = NULL;
while(ptr) {
cifra = ptr->chiave[i];
if(!davanti[cifra]) davanti[cifra] = ptr;
else dietro[cifra]->link = ptr;
dietro[cifra] = ptr;
ptr = ptr->link;
}
ptr = NULL;
for(j = RADICE_SIZE-1;j>=0;j--)
if(davanti[j]) {
dietro[j]->link = ptr;
ptr = davanti[j];
}
}
return ptr;
}