Generalized Linked List(2)

I mentioned about data structure and link node In Generalized Linked List(1) .
The below source code have function and link node and data struct.
When you demonstration using below source code, you must declare list node like that NODE node = {&node, &node}; and some of data node.
If you want insert data to front of list? Just call insert_front(). ex)insert_fromt(&node, &student.list);
If you want insert data to back of list? Just call insert_back(). ex)insert_back(&node, &student.list);
If you want delete data from list? Just call delete_node(). ex)delete_node(&student.list);
Finally, if you want use data struct, you must call macro function before using data struct like that "student = list_entry(node, STUDENT, list);".(if student declare like STUDENT *student;)
#define list_entry(temp,type,member) \
((type*)((char*)temp-(unsigned int)&((type*)0)->member))
typedef struct _node
{
struct _node *next;
struct _node *prev;
} NODE;
typedef struct
{
char name[20];
int age;
NODE link;
} STUDENT;
void __insert_add( NODE *prev,NODE *next, NODE *temp )
{
temp->prev = prev;
temp->next = next;
prev->next = temp;
next->prev = temp;
}
void insert_add( NODE *p,NODE *temp )
{
__insert_add( p, p->next, temp );
}
void insert_back( NODE *head,NODE *temp )
{
insert_add( head->prev, temp );
}
void insert_front( NODE *head,NODE *temp )
{
insert_add( head, temp );
}
void __delete_node( NODE *prev,NODE *next)
{
prev->next = next;
next->prev = prev;
}
void delete_node( NODE *p )
{
__delete_node( p->prev, p->next);
}