rewrite double linked list and hash table functions

Double linked list now uses a sentinel as a handler.
If prev or next hits the sentinel, then those are the ends.
The reason of using sentinel is that sentinel has a mutex
internally, and could not be NULL.
One more merit of using sentinel is performance improvement
in scanning the elements from the last to first.

Hash table data structure became simple.

Memory usage was reduced.