Newsgroup: it.comp.lang.c
Titolo: ordinamento intelligente di una matrice di strutture

Salve a tutti; sto cercando un modo + intelligente del mio (vedi codice in
fondo al msg), per ordinare una matrice di strutture del tipo:
struct shortpole
       {
       double freq;
       char behav;
       };
in base al parametro freq. Si noti che detto parametro è costante lungo una
riga, ma che non tutti gli elementi della riga contengono valori
significativi (nel caso di valori non significativi behav=' ').
Mi va benissimo usare la struttura bubblesort anche se so che non è la +
efficiente; quello che vorrei evitare è di copiare ogni singolo elemento in
un vettore temporaneo e fare gli swap sempre elemento per elemento. Mi
sembra di ricordare dall'ormai lontano esame di fondamenti di informatica,
che si poteva usare un vettore di puntatori e ordinare quello invece della
matrice stessa, ma non so proprio come fare!
Grazie mille
Marco Coppo - University Of Sheffield
/* Function BSORT: Uses bubblesort to sort the matrix in frequency */
void bsort(struct shortpole mat[MATDIM][MATDIM])
   {
   int i,j,first,second,;
   int swap=1;
   struct shortpole temp[MATDIM];
   while(swap)
      {
      swap=0;
      for (i=0;i<MATDIM-1;i++)
        {
        // find the index of the column of the first useful value in lines i
and i+1
        for(first=0;mat[i][first].behav==' ' && first<MATDIM;first++);
        for(second=0;mat[i+1][second].behav==' ' && second
<MATDIM;second++);
     // bubblesorting
     if(mat[i][first].freq>mat[i+1][second].freq)
        {
        for(j=0;j<MATDIM;j++)
          {
          temp[j].freq=mat[i][j].freq;
          temp[j].behav=mat[i][j].behav;
          }
      for(j=0;j<MATDIM;j++)
         {
         mat[i][j].freq=mat[i+1][j].freq;
         mat[i][j].behav=mat[i+1][j].behav;
         }
      for(j=0;j<MATDIM;j++)
        {
        mat[i+1][j].freq=temp[j].freq;
        mat[i+1][j].behav=temp[j].behav;
        }
     swap=1;
     }
   }
  }
}

fondo al msg), per ordinare una matrice di strutture del tipo:
Una possibile soluzione (escludendo la creazione di un albero binario)
e' quella di ricorrere alla funzione qsort() della libreria standard
nel modo seguente :
#include <stdio.h>
#include <stdlib.h>
struct shortpole
{
       double freq ;
       char behav ;
} ;
int shortpole_compare( const void *p1, const void *p2 )
{
    const struct shortpole *sp1 = p1 ;
    const struct shortpole *sp2 = p2 ;
    if ( sp1->freq < sp2->freq )
       return ( -1 ) ;
    else
    if ( sp1->freq == sp2->freq )
       return ( 0 ) ;
    else
       return ( 1 ) ;
}
int main()
{
    struct shortpole vettore[5] ;
    int i ;
    printf( "\n" ) ;
    srand( time( NULL ) ) ;
    for ( i = 0 ; i < 5 ; i++ )
    /* inizializza a caso il vettore */
    {
        vettore[i].freq = (double)(rand() % 50)/(rand() % 10 + 1) ;
        vettore[i].behav = rand() % 100 + 33 ;
        printf( "%d) f = %5.5lf , b = %c\n", i, vettore[i].freq,
                                          vettore[i].behav ) ;
    }
    printf( "\n" ) ;
    qsort(vettore, 5, sizeof (struct shortpole), shortpole_compare);
    for ( i = 0 ; i < 5 ; i++ )
    {
        printf( "%d) f = %5.5lf , b = %c\n", i, vettore[i].freq,
                                          vettore[i].behav ) ;
    }
    return 0 ;
}
--
Andrea Laforgia
andrea_...@bigfoot.com