Previous: Data Encapsulation, Up: Usage


2.3 Node Comparison

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.