Container called "set" is actually (double) linked list. Container "hashtable" (hTab) is just linked list with additional field key. Both of them has incorrect names. Second requires switch to (hash) map which will optimizes search by name to O(log N) instead of O(N).
set implements a set. It might not be the most efficint implementation though; currently, both containers seems to work well enough for SDCC (apparently they do not cause any bottlenecks so far).
It is not even a doubly-linked list. It is in fact a linear-linked list, albeit awkwardly still with the space requirements of a doubly-linked list.
Every list element contains pointers to two list elements.
One of them is the pointer to the next element, the other is just there so that the list head, which is an ordinary list element, can store an iterator that some of the functions need.
As far as I can tell, that pointer is just wasted space in all further list elements.
There is no actual container containing and managing the list elements.
If there were one, it could store head and tail pointers and and iterator pointer, too.
The set operations that this list type has strapped to it are also a bit strange, because the list can store an arbitrary number of identical items in arbitrary order and because the set operations mostly appear to have a run time of O(n²) and leak memory wherever they can.