Linked lists are the greatest creation ever. These things absolutely rule, and they're SO simple to use.
1) Make an 'anchor' node, that will store either the first or last node in the list (or, if it's circular, just any given point).
2) Allocate some date.
3) Add it to the list,
4) goto 2:
Salem's idea of creating a structure to track both head and tail is an interesting one, but I've personally never used it. I generally just keep track of one. Though, I can see where if you were inserting in the list, you could find the value of the head and tail, grab the average, and decide if you need to go foreward or backwards to insert it correctly. Generally speaking this could save time.
Still, linked lists are incredibly easy to use. Double linked lists are infinitely easier than single linked lists when it goes for node removal.
void remove( int data, Node *list )
//single line of code to find your data
//purposefully omitted. Yes, you can
//answer your question in a single line
//Now that our node is found, set it free!
if( n->prev ) n->prev->next = n->next;
if( n->next ) n->next->prev = n->prev;
//Damn that's slick. It just doesn't get any
//easier than that!
free( n );