1) Write a fn void printList(Node_S *head); that prints all elements in the list to cout, one per line. 2) Write a fn bool isInList(int x, Node_S *head); return true if x is in the list, false if not. 3) Assume the list may contain duplicates. Write a fn: int countOccurences(int x, Node_S *head); to count how many times x appears in the list. 4) Write a function to insert at the tail of the list void insertAtTail(int x, Node_S **headPtr, Node_S **tailPtr); (4a) Why the double stars? 5) Write a function to insert at the head of the list 6) Assume List must be kept in order (from smallest to largest) Write a function to insert an integer x in the list. (Come up with your own prototype, too) 7) Assume list is not necessarily in order, and may contain duplicates. Write a function that looks for x in the list. If found, delete it from the list and return true. If not found, return false. 7a) Make two versions of your answer to 7, one that uses the answer to (2) as a helper function, and one that doesn't. What is an argument in favor of using the function from 2? What is an argument against using the function from 2?