Search/Sort Example (The GNU C Library)

### 9.4 Searching and Sorting Example ¶

Here is an example showing the use of `qsort` and `bsearch` with an array of structures. The elements of the array are sorted by comparing their `name` fields with the `strcmp` function. Then, we can look up individual elements 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.