123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /* Searching and Sorting Example
- Copyright (C) 1991-2019 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, 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;
- }
|