Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
lsearch(3C)		 Standard C Library Functions		   lsearch(3C)

       lsearch,	lfind -	linear search and update

       #include	<search.h>

       void  *lsearch(const void *key, void *base, size_t *nelp, size_t	width,
       int (*compar) (const void *, const void *));

       void *lfind(const void *key, const void	*base,	size_t	*nelp,	size_t
       width, int (*compar)(const void *, const	void *));

       The  lsearch()  function	 is  a	linear search routine generalized from
       Knuth (6.1) Algorithm S.	(see The Art of	Computer  Programming,	Volume
       3,  Section  6.1, by Donald E. Knuth.). It returns a pointer to a table
       indicating where	a datum	can be found. If the datum does	not occur,  it
       is  added at the	end of the table. The key argument points to the datum
       to be sought in the table. The base argument points to the  first  ele-
       ment  in	 the  table. The nelp argument points to an integer containing
       the current number of  elements in the table.  The  integer  is	incre-
       mented  if  the	datum is added to the table. The width argument	is the
       size of an element in bytes. The	compar argument	is a  pointer  to  the
       comparison function that	the user must supply (strcmp(3C) for example).
       It is called with two arguments that point to the elements  being  com-
       pared. The function must	return zero if the elements are	equal and non-
       zero otherwise.

       The lfind() function is the same	as lsearch() except that if the	 datum
       is not found, it	is not added to	the table.  Instead, a null pointer is

       It is important to note the following:

	 o  The	pointers to the	key and	the element at the base	of  the	 table
	    can	be pointers to any type.

	 o  The	 comparison function need not compare every byte, so arbitrary
	    data can be	contained in the elements in addition  to  the	values
	    being compared.

	 o  The	value returned should be cast into type	pointer-to-element.

       If  the searched-for datum is found, both lsearch() and	lfind()	return
       a pointer to it.	Otherwise, lfind() returns NULL	and  lsearch() returns
       a pointer to the	newly added element.

       Undefined results can occur if there is not enough room in the table to
       add a new item.

       The lsearch() and lfind() functions safely allows concurrent access  by
       multiple	 threads to disjoint data, such	as overlapping subtrees	or ta-

       Example 1: A sample code	using the lsearch() function.

       This program will read in less than TABSIZE strings of length less than
       ELSIZE and store	them in	a table, eliminating duplicates, and then will
       print each entry.

       #include	<search.h>
       #include	<string.h>
       #include	<stdlib.h>
       #include	<stdio.h>

       #define TABSIZE 50
       #define ELSIZE 120

	       char line[ELSIZE];	       /* buffer to hold input string */
	       char tab[TABSIZE][ELSIZE];      /* table	of strings */
	       size_t nel = 0;		       /* number of entries in tab */
	       int i;

	       while (fgets(line, ELSIZE, stdin) != NULL &&
		       nel < TABSIZE)
		       (void) lsearch(line, tab, &nel, ELSIZE, mycmp);
	       for( i =	0; i < nel; i++	)
		       (void)fputs(tab[i], stdout);
	       return 0;

       See attributes(5) for descriptions of the following attributes:

       |      ATTRIBUTE	TYPE	     |	    ATTRIBUTE VALUE	   |
       |Interface Stability	     |Standard			   |
       |MT-Level		     |MT-Safe			   |

       bsearch(3C), hsearch(3C), string(3C), tsearch(3C), attributes(5), stan-

       The  Art	 of  Computer  Programming, Volume 3, Sorting and Searching by
       Donald E. Knuth,	published by Addison-Wesley Publishing Company,	1973.

SunOS 5.10			  6 Dec	2004			   lsearch(3C)


Want to link to this manual page? Use this URL:

home | help