Question 23 19 marks) Here is the declaration for the nodes in a singly-linked list of integers: typedef struct intnode int value; struct intnode *next; intnode_t A function named move lower is passed a pointer to a singly-linked list: intnode_t move_lower (intnode t "head) The function moves every node that contains a value less than the value in the first node to a new linked list, and returns a pointer to the new list. For example, suppose variable my 1ist points to this linked list: my list 5 6 3 9 2 Notice that the third, fourth, seventh and eighth nodes all contain values less than the value in the first node (5). Suppose move_lower is called this way: other _1ist move_lower(my_1ist) The function returns a pointer to a new list that contains the third, fourth, seventh and eighth nodes from the original list, so other_list points to this linked list: other list 2 When the function returns, the list pointed to by my_1ist contains the nodes that weren't moved; that is, the first, second, fifth, sixth, and ninth nodes from the original list: my_ list 5 7 9 8 move_lower should return an empty list if is passed an empty list or a list that contains only one node. Write the definition of move_lower in the solutions script. Your function cannot call malloc or free or any other function. Hint: this page has the "before and after" diagrams for a linked list in which the last node isn't moved. Before writing any code, draw "before and after" diagrams for linked lists containing 0 nodes, 1 node, and a list in which the last node is moved. Marks will be deducted for a solution that performs unnecessary traversals of the linked list. Question 24 [4 marks] Write a recursive function that calculates the average of the values stored in a singly linked list with a head pointer. Nodes are of type intnode t, as defined in Q23. An iterative function will receive 0 marks