For this lab you will be creating a linked list data structure. The list will be doubly linked, meaning that each node will point to both neighbors (previous and next). Use head to point to the first element in the list, and tail->previous should be equal to head. This also means that the list is circular. For this list, you should support the following operations: -Add a value to the end of the list. -Add a value to an arbitrary location in the list. -Return the nth element in the list. -Return the "first" element in the list (head). -Return the "last" element in the list (this means head->previous). -Remove an arbitrary element in the list. -Print the list. The type of data stored in the list should be a float. Each of these operations can make use of whatever functions you feel are necessary, but one thing they will all have in common is that you will be passing the head pointer to each. For instance, adding a value to an arbitrary location might have a function prototype of: struct node* add_value(struct node *head, float value, int location); where the return value would be the head of the list. Keep in mind you will need to use malloc to create new nodes, which means you will need to use free to remove them. Make sure you have only a single pointer to any struct you want to delete when you call free on it. N.B.: The tool valgrind on the burrow can make your life easier in this regard. valgrind checks for memory leaks, and will let you know if you have more mallocs than frees. Check the valgrind man page for details on usage.