The stack data structure is used to store an ordered list of objects. It is basically misnamed to call it a stack but it can function that way and that is what I originally used it for. Due to the way element pointers are kept in a malloc()ed array, the most efficient way to use this structure is to add and delete elements from the end via sk_pop() and sk_push(). If you wish to do 'lookups' sk_find() is quite efficient since it will sort the stack (if required) and then do a binary search to lookup the requested item. This sorting occurs automatically so just sk_push() elements on the stack and don't worry about the order. Do remember that if you do a sk_find(), the order of the elements will change. You should never need to 'touch' this structure directly. typedef struct stack_st { unsigned int num; char **data; int sorted; unsigned int num_alloc; int (*comp)(); } STACK; 'num' holds the number of elements in the stack, 'data' is the array of elements. 'sorted' is 1 is the list has been sorted, 0 if not. num_alloc is the number of 'nodes' allocated in 'data'. When num becomes larger than num_alloc, data is realloced to a larger size. If 'comp' is set, it is a function that is used to compare 2 of the items in the stack. The function should return -1, 0 or 1, depending on the ordering. #define sk_num(sk) ((sk)->num) #define sk_value(sk,n) ((sk)->data[n]) These 2 macros should be used to access the number of elements in the 'stack' and to access a pointer to one of the values. STACK *sk_new(int (*c)()); This creates a new stack. If 'c', the comparison function, is not specified, the various functions that operate on a sorted 'stack' will not work (sk_find()). NULL is returned on failure. void sk_free(STACK *); This function free()'s a stack structure. The elements in the stack will not be freed so one should 'pop' and free all elements from the stack before calling this function or call sk_pop_free() instead. void sk_pop_free(STACK *st; void (*func)()); This function calls 'func' for each element on the stack, passing the element as the argument. sk_free() is then called to free the 'stack' structure. int sk_insert(STACK *sk,char *data,int where); This function inserts 'data' into stack 'sk' at location 'where'. If 'where' is larger that the number of elements in the stack, the element is put at the end. This function tends to be used by other 'stack' functions. Returns 0 on failure, otherwise the number of elements in the new stack. char *sk_delete(STACK *st,int loc); Remove the item a location 'loc' from the stack and returns it. Returns NULL if the 'loc' is out of range. char *sk_delete_ptr(STACK *st, char *p); If the data item pointed to by 'p' is in the stack, it is deleted from the stack and returned. NULL is returned if the element is not in the stack. int sk_find(STACK *st,char *data); Returns the location that contains a value that is equal to the 'data' item. If the comparison function was not set, this function does a linear search. This function actually qsort()s the stack if it is not in order and then uses bsearch() to do the initial search. If the search fails,, -1 is returned. For mutliple items with the same value, the index of the first in the array is returned. int sk_push(STACK *st,char *data); Append 'data' to the stack. 0 is returned if there is a failure (due to a malloc failure), else 1. This is sk_insert(st,data,sk_num(st)); int sk_unshift(STACK *st,char *data); Prepend 'data' to the front (location 0) of the stack. This is sk_insert(st,data,0); char *sk_shift(STACK *st); Return and delete from the stack the first element in the stack. This is sk_delete(st,0); char *sk_pop(STACK *st); Return and delete the last element on the stack. This is sk_delete(st,sk_num(sk)-1); void sk_zero(STACK *st); Removes all items from the stack. It does not 'free' pointers but is a quick way to clear a 'stack of references'.