Can anyone help me with 2.1 , 2.3 ,2.5, 2.7 In C programming 2.1 Elephant *new_elephant(const char name[], enum type which_type, unsigned int id, unsigned short weight, float trunk_length) Project #5 discussed some approaches for writing structure functions in C. Another option not mentioned then is for a function to return a pointer to a structure that the function has itself dynamically allocated. Using this approach a function can return a pointer to an initialized structure without requiring the caller to declare a structure or to allocate memory for : structure. It is common for functions to dynamically allocate a structure and return a pointer to it after suitably initializing its fields. This function will use this approach. The function should just return NULL without doing anything else if its array parameter is NULL. Otherwise it should return a pointer to a dynamically-allocated Elephant structure that has the parameters' values stored in its fields. The name field of the newly created Elephant structure has no fixed or maximum length, so this function now must allocatea string of exactly the right size to store the name parameter (however long it may be), copy the value of the name parameter to the allocated string, and make the name field of the allocated structure point to it. To emphasize: the new elephant's name field must point to new memory that this function allocates, not just point to the parameter name that was passed in. In other words, this function should not just be doing pointer aliasing. Use string library functions for all manipulations of the elephant's name, not loops (or recursion), or you will lose considerable credit. 2.2 unsigned short get_type(const Elephant * const el_ptr, enum type *const type_ptr) This function should "return" to the caller the type of its parameter elephant, but it should also return 0 if either parameter is NULL. However, since the first constant in an enum has the numeric value 0 , if the function only returned a value, the caller would not be able to distinguish between it returning 0 to indicate that either parameter was NULL, or it returning the enum value AFRICAN. What the function should do instead is to return 0 or 1 depending upon its parameters' validity, and, if the parameters are valid, to store the elephant's type into the variable that type ptr points to. So if either parameter is NULL the function should return 0 without changing anything else, while otherwise it should return 1 after storing its parameter elephant's type into the variable that its second parameter points to. 2.3 const char *get_name(const Elephant *const el_ptr) This function should return NULL if it parameter is NULL, or if its parameter is not NULL but its parameter's name field is NULL. Otherwise it should return its parameter elephant's name, but it should not just return a pointer to the name field of the Elephant structure itself. Instead, it should allocate enough memory to store the name, copy th.