Next: Hash Search Function, Previous: Array Sort Function, Up: Searching and Sorting

### 9.4 Searching and Sorting Example

Here is an example showing the use of `qsort` and `bsearch` with an array of structures. The objects in the array are sorted by comparing their `name` fields with the `strcmp` function. Then, we can look up individual objects based on their names.

         #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);
         }

         /* 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);
         }

         /* 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;
         }

The output from this program looks like:

         Kermit, the frog
         Piggy, the pig
         Gonzo, the whatever
         Fozzie, the bear
         Sam, the eagle
         Robin, the frog
         Animal, the animal
         Camilla, the chicken
         Sweetums, the monster
         Dr. Strangepork, the pig
         Link Hogthrob, the pig
         Zoot, the human
         Dr. Bunsen Honeydew, the human
         Beaker, the human
         Swedish Chef, the human

         Animal, the animal
         Beaker, the human
         Camilla, the chicken
         Dr. Bunsen Honeydew, the human
         Dr. Strangepork, the pig
         Fozzie, the bear
         Gonzo, the whatever
         Kermit, the frog
         Link Hogthrob, the pig
         Piggy, the pig
         Robin, the frog
         Sam, the eagle
         Swedish Chef, the human
         Sweetums, the monster
         Zoot, the human

         Kermit, the frog
         Gonzo, the whatever
         Couldn't find Janice.