Linked list implementation
You use root as parameter name when you pass the list around but I think a better name would just be list. root implies that you pass the first node of the list around rather than the container.
++root-&gt;node_count is correct but root-&gt;node_count += 1 reads nicer (imho).
I would consider changing the interface slightly:


Have a List* new_list() method which creates the list (and initializes the object).
delete_list should also delete the list object (probably needs signature change to delete_list(List **list))
Add a method clear_list which just clears the contents of the list.

Right now the programmer has to remember whether a node was added via add_node or add_node_store in order to call the proper delete function. However this could be solved by having a flag in nNode which indicates whether the node owns the content or not. Delete could then automatically do the right thing.