|This is obviously an assignment but I'll give you some ideas.
a. It's better to use an existing container like std::list but if this is C and you don't have one or you have to write your own linked list then ...
b. You don't need to store current. I also assume you store tail and count for efficiency as you can work these out too.
c. You store tail but then in add_Node() you scan the list for the end anyway.
d. It may be simpler just to add new students to the start of the list rather than the end.
NODE * tmp = head;
head = student;
student->next = tmp;
e. If you step through your code the bvious problem is assigning through a NULL pointer. Why not do it like this:
void add_Node(LIST** list, NODE* student)
NODE ** pcurr;
for (pcurr = &head; *pcurr != NULL; pcurr = &((*pcurr)->next) )
*pcurr = student;
student->next = NULL;
andrew @ hexedit.com