Lets see if i have fully understood what you want to achieve here. : )

Code:
//returns the element with the current index
//returns NULL if element with index not found.
LL_LIST_ELEM* ll_list_find(LL_LIST* self, int index);


This function is already implemented:
LL_LIST_ELEM *ll_list_getNth(LL_LIST *self, int index)

Code:
//change this to return the index of the newly added element:
int ll_list_add(LL_LIST* self, void* data);


According to my changelog this function should be overloaded (so you can either pass a list element or a void* as second parameter) and return a pointer to the added element. However, this is not the case obviously.^^

I've re-implemented this now: list 09AUG08

So you can use ll_list_add() like this:
Code:
// 1)
elem = ll_lelem_create(data);
ll_list_add(list, elem);

// 2) directly adds the data
// element is created internally and returned by the function
elem = ll_list_add(list, data);


As ll_list_add() appends elements at the end of the list the index of the added element will always be list->count - 1. So it's not necessary to return an elements index.

In your code you store the index of the list element in which an entity is contained. However, it would be better to store a pointer to the element instead. This would be faster (static instead of linear complexity). Also the index of an element can change, if elements are inserted in or removed from the list.

Does this answer your question?