6.1.3 C-Version

// Time-stamp: "(13.05.02 22:33) suchestud.c [Klaus@Wachtler.de]" /*   1 */
// demonstriert generisches Programmieren (hier: Suche in einem   /*   2 */
// Feld mit unbekannten Datentypen) in Anlehnung an bsearch()     /*   3 */
// aus der Standardbibliothek von ANSI-C.                         /*   4 */
//                                                                /*   5 */
// Literatur:                                                     /*   6 */
// [1] "0 ist false, alles andere true"                           /*   7 */
//     Klaus Wachtler 2002                                        /*   8 */
                                                                  /*   9 */
#include <stdlib.h>                                               /*  10 */
#include <stddef.h>                                               /*  11 */
#include <stdio.h>                                                /*  12 */
                                                                  /*  13 */
// Lineare Suche in einem Feld von Werten unbekannten Inhalts;    /*  14 */
// entnommen aus [1];                                             /*  15 */
// Aufruf identisch zu bsearch() aus der Standardbibliothek       /*  16 */
// (allerdings muß das Feld nicht sortiert sein, da lineare       /*  17 */
// Suche):                                                        /*  18 */
void *lsearch( const void *schluessel,                            /*  19 */
               const void *feldanfang,                            /*  20 */
               size_t elemente,                                   /*  21 */
               size_t elementgroesse,                             /*  22 */
               int(* vergleichsfkt)( const void *e1,              /*  23 */
                                     const void *e2               /*  24 */
                                     )                            /*  25 */
               )                                                  /*  26 */
{                                                                 /*  27 */
  char       *feld_p = (char *)feldanfang;                        /*  28 */
                                                                  /*  29 */
  /* Parameter pruefen: */                                        /*  30 */
  if( !( schluessel                                               /*  31 */
         && feldanfang                                            /*  32 */
         && elemente                                              /*  33 */
         && elementgroesse                                        /*  34 */
         && vergleichsfkt                                         /*  35 */
         )                                                        /*  36 */
      )                                                           /*  37 */
    return NULL;                                                  /*  38 */
                                                                  /*  39 */
  /* Schleife ueber alle Elemente: */                             /*  40 */
  while( elemente-- )                                             /*  41 */
  {                                                               /*  42 */
    /* trifft das aktuelle Element zu? */                         /*  43 */
    if( !(*vergleichsfkt)( schluessel, feld_p ) )                 /*  44 */
      return feld_p;                                              /*  45 */
    /* Wenn nicht, dann naechstes Element: */                     /*  46 */
    feld_p += elementgroesse;                                     /*  47 */
  }                                                               /*  48 */
                                                                  /*  49 */
  /* Ende des Feldes und trotzdem nichts gefunden? */             /*  50 */
  return NULL;                                                    /*  51 */
}                                                                 /*  52 */
                                                                  /*  53 */
                                                                  /*  54 */
// Testprogramm                                                   /*  55 */
// ------------                                                   /*  56 */
//                                                                /*  57 */
                                                                  /*  58 */
/* Datentyp für einen Studenten: */                               /*  59 */
typedef struct                                                    /*  60 */
{                                                                 /*  61 */
  char *vname;                                                    /*  62 */
  char *nname;                                                    /*  63 */
  int   matrikelnummer;                                           /*  64 */
}                                                                 /*  65 */
student_t;                                                        /*  66 */
                                                                  /*  67 */
// Vergleichsfunktion für zwei Studenten (liefert einen Wert      /*  68 */
// kleiner 0, wenn die Matrikelnummer des ersten kleiner ist      /*  69 */
// als die des zweiten, oder 0, wenn beide gleich sind, sonst     /*  70 */
// einen Wert >0):                                                /*  71 */
//                                                                /*  72 */
int vergleiche_student_t_matrikelnummer( const void *p1,          /*  73 */
                                         const void *p2           /*  74 */
                                         )                        /*  75 */
{                                                                 /*  76 */
  return ( ((student_t*)p1)->matrikelnummer                       /*  77 */
           -                                                      /*  78 */
           ((student_t*)p2)->matrikelnummer                       /*  79 */
          );                                                      /*  80 */
}                                                                 /*  81 */
                                                                  /*  82 */
int main( int nargs, char **args )                                /*  83 */
{                                                                 /*  84 */
  /* Feld mit ein paar Studenten: */                              /*  85 */
  student_t    studenten[5] =                                     /*  86 */
  {                                                               /*  87 */
    { "Kurt", "Pappnase", 978123 },                               /*  88 */
    { "Hein", "Meier", 987456 },                                  /*  89 */
    { "Fritz", "Schmidt", 998159 },                               /*  90 */
    { "Klaus", "Lahm", 988123 },                                  /*  91 */
    { "Sina", "Flink", 977111 },                                  /*  92 */
  };                                                              /*  93 */
                                                                  /*  94 */
  /* Zeiger auf gefundenes Element: */                            /*  95 */
  student_t   *p_student = NULL;                                  /*  96 */
                                                                  /*  97 */
  /* Schlüssel, nach dem gesucht wird (VN+NN egal): */            /*  98 */
  student_t    key = { "", "", -1 };                              /*  99 */
                                                                  /* 100 */
  /* Suche nach Student mit der Matrikelnummer 988123: */         /* 101 */
  key.matrikelnummer = 988123;                                    /* 102 */
  p_student = lsearch( &key,                                      /* 103 */
                       studenten,                                 /* 104 */
                       sizeof(studenten)/sizeof(studenten[0]),    /* 105 */
                       sizeof(studenten[0]),                      /* 106 */
                       vergleiche_student_t_matrikelnummer        /* 107 */
                       );                                         /* 108 */
                                                                  /* 109 */
  if( p_student==NULL )                                           /* 110 */
  {                                                               /* 111 */
    printf( "nichts gefunden!\n" );                               /* 112 */
  }                                                               /* 113 */
  else                                                            /* 114 */
  {                                                               /* 115 */
    printf( "gefunden: %s %s %d\n",                               /* 116 */
            p_student->vname,                                     /* 117 */
            p_student->nname,                                     /* 118 */
            p_student->matrikelnummer                             /* 119 */
           );                                                     /* 120 */
  }                                                               /* 121 */
                                                                  /* 122 */
  return 0;                                                       /* 123 */
} /* main( int nargs, char **args */                              /* 124 */



www.wachtler.de