fr0d, how much do you know about pointers? The idea here is that you create a new node object when you want to store a new item value. In your case, the Addr_Val is your node's item value. The "head" and "tail" are special members of a linked list that allow you to retrieve the first and last nodes in the list for traversal. They should be strictly assigned (pointing to) nodes that already exist. Once you get your starter node, you can use the "next" or "previous" fields (in a doubly linked list) to navigate the chain.
For sanity sake, don't pre-create your nodes all at once. Make sure your head and tail pointers are set to null. Create one node object, set its item value, and then add it to the list. By adding it to the list, if tail is null, point the head and tail to this new node. There's only one node at this point and it is both the first and last node in the list. The node you create will by default have its next and previous pointers set to null (ie: it's not attached to anything). When you create and add another node, if the tail is not null, then set tail->next to this new node you want to add and then point the tail to this new node, which will now become the last node in the list. Continue this process as needed.