有头结点的双向链表
typedef struct node { struct node*pre; struct node* next; }NODE; typedef struct { NODE head;//头结点,一定要有头结点。 NODE* tail; int nodeNum; }LIST;
//insert p_node after the p_previous node
//没有头结点的情况复杂多了,因为要考虑在头结点前或者后插入,现在只用考虑是不是在最后插入。
//没有头结点的话,连删除第一个节点都很困难,因为要判断头结点是不是为空。总之,没有头结点要考虑两头的事情,很麻烦,有了头结点只需考虑末尾的事情。
void drv_list_node_insert(LIST *pList, LIST_NODE *pPrevious,LIST_NODE* pNode)
{
LIST_NODE * pNext = pPrevious->next;
pPrevious->next = pNode;
if( pNext == NULL)
{
pNode->pre = pPrevious;
pNode->next = NULL;
pList->tail = pNode;
}
else
{
pNext->pre = pNode;
pNode->pre = pPrevious;
pNode->next = pNext;
}
pList->nodeNum--;
}