The GNU C Library - Search/Sort Example

Node: Search/Sort Example Prev: Array Sort Function Up: Searching and Sorting

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 struct critter *c1, const struct critter *c2)
	{
	  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.


Up: Searching and Sorting