Previous: Data Encapsulation, Up: Usage
There are two situations in which nodes will be compared, either to
other nodes or to key data. During collated node insertion, the
inserted node's data is compared against other nodes' data to determine
the proper ordering of the nodes. This operation uses the comparison
routine passed to ?ll_new
when the list is created. The second
situation is during searches of the list, where node data is compared to
some user specified data. Since the comparison routine passed to
?ll_new
assumes the same form for both pieces of data passed to
it for comparison, using it would require that the user create a dummy
user node data structure (the same as the one associated with each
node), and fill it with the key data, which in most instances will
probably be one field. linklist
provides the possibility of
using another comparison routine (passed to the search or destroy
routines), which may compare data with two dissimilar forms. For
example, assume that the user node data has the following structure, and
keys on the ‘id’ value:
typedef struct { int id; char *name; } UserNodeData;
The node comparison routine, used to compare nodes during insertion, would look like this:
int node_node_compare(const void *dp1, const void *dp2) { return ((UserNodeData *)dp1)->id - ((UserNodeData *)dp2)->id; }
If you want to search the resultant list, and not create a
dummy UserNodeData
structure, construct the search/destroy
comparison routine as follows:
int key_node_compare(const void *dp1, const void *dp2) { return *((int *) dp1) - ((UserNodeData *)dp2)->id; }
and pass the search/destroy routine a pointer to an int
set equal to the id for which you're searching.