1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
#include <stdlib.h>
#include <stdio.h>
/* 0 | 1 */
#define DBG 0
#if DBG
static void display_line (char const *s, int* p, int nb_col)
{
int j;
printf ("%s: ", s);
for (j = 0; j < nb_col; j++)
{
printf ("%-3d", p[j]);
}
printf ("\n");
}
#endif
/* Fonction de comparaison pour qsort() */
static int compare (void const *a, void const *b)
{
/* -ed-
Le tableau a trier a des elements de type int *
On recoit l'adresse de l'element de type int*, soit int **
*/
int const **ppa = a;
int const **ppb = b;
/* -ed- on recupere l'adresse de la ligne */
int const *pa = *ppa;
int const *pb = *ppb;
#if DBG
display_line("pa", pa, 2);
display_line("pb", pb, 2);
#endif
/* -ed- on teste la colonne 1 */
return pa[1] - pb[1];
}
/* -ed- creation dynamique du tableau */
static int** create(int nb_lin, int nb_col)
{
int **pp = malloc (sizeof * pp * nb_lin);
if (pp != NULL)
{
int i;
for (i = 0; i < nb_lin; i++)
{
pp[i] = malloc (sizeof * pp[i] * nb_col);
}
}
return pp;
}
/* -ed- creation dynamique du tableau */
static void delete(int**pp, int nb_lin)
{
if (pp != NULL)
{
int i;
for (i = 0; i < nb_lin; i++)
{
free (pp[i]), pp[i] = NULL;
}
}
free (pp), pp = NULL;
}
static void display (int** pp, int nb_lin, int nb_col)
{
int i;
for (i = 0; i < nb_lin; i++)
{
int j;
for (j = 0; j < nb_col; j++)
{
printf ("%3d", pp[i][j]);
}
printf ("\n");
}
}
int main (void)
{
int nb_lin = 4;
int nb_col = 2;
int** tab2D = create (nb_lin, nb_col);
tab2D[0][0] = 10 ;
tab2D[0][1] = 15;
tab2D[1][0] = 2 ;
tab2D[1][1] = 6;
tab2D[2][0] = 9 ;
tab2D[2][1] = 18;
tab2D[3][0] = 5 ;
tab2D[3][1] = 5;
display (tab2D, nb_lin, nb_col);
// Appel de la fonction de tri
{
/* -ed- verifier que l'on passe les bons parametres */
size_t nb_membres = nb_lin;
size_t sz_membre = sizeof * tab2D;
printf ("nb = %u sz = %u\n", (unsigned) nb_membres , (unsigned) sz_membre);
qsort (tab2D, nb_membres , sz_membre, compare);
}
display (tab2D, nb_lin, nb_col);
delete (tab2D, nb_lin);
return 0;
} |