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);
}