|  | /* Searching and Sorting Example | 
|  | Copyright (C) 1991-2016 Free Software Foundation, Inc. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or | 
|  | modify it under the terms of the GNU General Public License | 
|  | as published by the Free Software Foundation; either version 2 | 
|  | of the License, or (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program; if not, if not, see <http://www.gnu.org/licenses/>. | 
|  | */ | 
|  |  | 
|  | #include <stdlib.h> | 
|  | #include <stdio.h> | 
|  | #include <string.h> | 
|  |  | 
|  | /* Define an array of critters to sort. */ | 
|  |  | 
|  | struct critter | 
|  | { | 
|  | const char *name; | 
|  | const char *species; | 
|  | }; | 
|  |  | 
|  | struct critter muppets[] = | 
|  | { | 
|  | {"Kermit", "frog"}, | 
|  | {"Piggy", "pig"}, | 
|  | {"Gonzo", "whatever"}, | 
|  | {"Fozzie", "bear"}, | 
|  | {"Sam", "eagle"}, | 
|  | {"Robin", "frog"}, | 
|  | {"Animal", "animal"}, | 
|  | {"Camilla", "chicken"}, | 
|  | {"Sweetums", "monster"}, | 
|  | {"Dr. Strangepork", "pig"}, | 
|  | {"Link Hogthrob", "pig"}, | 
|  | {"Zoot", "human"}, | 
|  | {"Dr. Bunsen Honeydew", "human"}, | 
|  | {"Beaker", "human"}, | 
|  | {"Swedish Chef", "human"} | 
|  | }; | 
|  |  | 
|  | int count = sizeof (muppets) / sizeof (struct critter); | 
|  |  | 
|  |  | 
|  |  | 
|  | /* This is the comparison function used for sorting and searching. */ | 
|  |  | 
|  | int | 
|  | critter_cmp (const void *v1, const void *v2) | 
|  | { | 
|  | const struct critter *c1 = v1; | 
|  | const struct critter *c2 = v2; | 
|  |  | 
|  | return strcmp (c1->name, c2->name); | 
|  | } | 
|  |  | 
|  |  | 
|  | /* Print information about a critter. */ | 
|  |  | 
|  | void | 
|  | print_critter (const struct critter *c) | 
|  | { | 
|  | printf ("%s, the %s\n", c->name, c->species); | 
|  | } | 
|  |  | 
|  |  | 
|  | /*@group*/ | 
|  | /* Do the lookup into the sorted array. */ | 
|  |  | 
|  | void | 
|  | find_critter (const char *name) | 
|  | { | 
|  | struct critter target, *result; | 
|  | target.name = name; | 
|  | result = bsearch (&target, muppets, count, sizeof (struct critter), | 
|  | critter_cmp); | 
|  | if (result) | 
|  | print_critter (result); | 
|  | else | 
|  | printf ("Couldn't find %s.\n", name); | 
|  | } | 
|  | /*@end group*/ | 
|  |  | 
|  | /* Main program. */ | 
|  |  | 
|  | int | 
|  | main (void) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | for (i = 0; i < count; i++) | 
|  | print_critter (&muppets[i]); | 
|  | printf ("\n"); | 
|  |  | 
|  | qsort (muppets, count, sizeof (struct critter), critter_cmp); | 
|  |  | 
|  | for (i = 0; i < count; i++) | 
|  | print_critter (&muppets[i]); | 
|  | printf ("\n"); | 
|  |  | 
|  | find_critter ("Kermit"); | 
|  | find_critter ("Gonzo"); | 
|  | find_critter ("Janice"); | 
|  |  | 
|  | return 0; | 
|  | } |