]>
Commit | Line | Data |
---|---|---|
d9a17c07 | 1 | /* Searching and Sorting Example |
6d7e8eda | 2 | Copyright (C) 1991-2023 Free Software Foundation, Inc. |
d9a17c07 RM |
3 | |
4 | This program is free software; you can redistribute it and/or | |
5 | modify it under the terms of the GNU General Public License | |
6 | as published by the Free Software Foundation; either version 2 | |
7 | of the License, or (at your option) any later version. | |
8 | ||
9 | This program is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | GNU General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU General Public License | |
5a82c748 | 15 | along with this program; if not, see <https://www.gnu.org/licenses/>. |
d9a17c07 RM |
16 | */ |
17 | ||
28f540f4 RM |
18 | #include <stdlib.h> |
19 | #include <stdio.h> | |
20 | #include <string.h> | |
21 | ||
22 | /* Define an array of critters to sort. */ | |
23 | ||
24 | struct critter | |
25 | { | |
26 | const char *name; | |
27 | const char *species; | |
28 | }; | |
29 | ||
30 | struct critter muppets[] = | |
31 | { | |
32 | {"Kermit", "frog"}, | |
33 | {"Piggy", "pig"}, | |
34 | {"Gonzo", "whatever"}, | |
35 | {"Fozzie", "bear"}, | |
36 | {"Sam", "eagle"}, | |
37 | {"Robin", "frog"}, | |
38 | {"Animal", "animal"}, | |
39 | {"Camilla", "chicken"}, | |
40 | {"Sweetums", "monster"}, | |
41 | {"Dr. Strangepork", "pig"}, | |
42 | {"Link Hogthrob", "pig"}, | |
43 | {"Zoot", "human"}, | |
44 | {"Dr. Bunsen Honeydew", "human"}, | |
45 | {"Beaker", "human"}, | |
46 | {"Swedish Chef", "human"} | |
47 | }; | |
48 | ||
49 | int count = sizeof (muppets) / sizeof (struct critter); | |
50 | ||
51 | ||
52 | ||
53 | /* This is the comparison function used for sorting and searching. */ | |
54 | ||
d9a17c07 | 55 | int |
e39745ff | 56 | critter_cmp (const void *v1, const void *v2) |
28f540f4 | 57 | { |
e39745ff AJ |
58 | const struct critter *c1 = v1; |
59 | const struct critter *c2 = v2; | |
60 | ||
28f540f4 RM |
61 | return strcmp (c1->name, c2->name); |
62 | } | |
63 | ||
64 | ||
65 | /* Print information about a critter. */ | |
66 | ||
d9a17c07 | 67 | void |
28f540f4 RM |
68 | print_critter (const struct critter *c) |
69 | { | |
70 | printf ("%s, the %s\n", c->name, c->species); | |
71 | } | |
72 | ||
73 | ||
74 | /*@group*/ | |
75 | /* Do the lookup into the sorted array. */ | |
76 | ||
d9a17c07 | 77 | void |
28f540f4 RM |
78 | find_critter (const char *name) |
79 | { | |
80 | struct critter target, *result; | |
81 | target.name = name; | |
82 | result = bsearch (&target, muppets, count, sizeof (struct critter), | |
83 | critter_cmp); | |
84 | if (result) | |
85 | print_critter (result); | |
86 | else | |
87 | printf ("Couldn't find %s.\n", name); | |
88 | } | |
89 | /*@end group*/ | |
90 | ||
91 | /* Main program. */ | |
92 | ||
93 | int | |
94 | main (void) | |
95 | { | |
96 | int i; | |
97 | ||
98 | for (i = 0; i < count; i++) | |
99 | print_critter (&muppets[i]); | |
100 | printf ("\n"); | |
101 | ||
102 | qsort (muppets, count, sizeof (struct critter), critter_cmp); | |
103 | ||
104 | for (i = 0; i < count; i++) | |
105 | print_critter (&muppets[i]); | |
106 | printf ("\n"); | |
107 | ||
108 | find_critter ("Kermit"); | |
109 | find_critter ("Gonzo"); | |
110 | find_critter ("Janice"); | |
111 | ||
112 | return 0; | |
113 | } |