双链表结构如下,它不是一般的双链表,有前驱和后继,这个链表有个指向下一个节点的指针和指向下一个节点的下个节点指针。
-
typedef struct tagNode{
-
struct tagNode* pnext ;//指向下一个节点
-
struct tagNode* ppnext ;//指向下一个节点的下一个节点
-
}Node;
-
- typedef Node* LList ;
下面提供如何创建链表,毁灭链表等函数。
-
/************************************************************************/
-
/* 创建链表 */
-
/************************************************************************/
-
LList create_list()
-
{
-
Node* p = new Node ;
-
p->pnext = NULL;
-
p->ppnext = NULL;
-
return p ;
-
}
-
/************************************************************************/
-
/* 创建新节点 */
-
/************************************************************************/
-
Node* create_new_node()
-
{
-
Node* p = new Node ;
-
p->pnext = NULL;
-
p->ppnext = NULL;
-
return p ;
- }
-
/************************************************************************/
-
/* 在链表尾端插入新节点 */
-
/************************************************************************/
-
void insert_node(LList head,Node* pNode)
-
{
-
Node* pb=head->pnext;
-
Node* pbb=head;
-
Node* ps= head->ppnext;
-
while(ps)
-
{
-
pbb = pb ;
-
pb = ps;
-
ps = ps->pnext;
-
}
-
if(pb) //如果父节点不为NULL
-
{
-
pbb->ppnext = pNode;
-
pb->pnext = pNode;
-
pb->ppnext = NULL;
-
}else//父节点为NULL
-
{
-
pbb->pnext = pNode;
-
pbb->ppnext =NULL;
-
}
-
- }
-
/************************************************************************/
-
/* 毁灭(删除)链表 */
-
/************************************************************************/
-
void destroy_list(LList head)
-
{
-
Node* p = head ;
-
Node* q;
-
while(p)
-
{
-
q=p ;
-
p=p->pnext;
-
delete q ;
-
}
-
}
-
/************************************************************************/
-
/* 遍历链表 */
-
/************************************************************************/
-
void visit_list(LList list)
-
{
-
Node* p = list ;
-
while(p)
-
{
-
printf("current_addr=[%p] son_addr=[%p] son_son_addr=[%p] \n",p,p->pnext,p->ppnext);
-
p=p->pnext;
-
}
- }
-
/************************************************************************/
-
/* 删除链表的指定节点,但是不能删除头节点,删除头节点有问题 */
-
/************************************************************************/
-
void delete_node(LList list,Node* pNode)
-
{
-
if(list == pNode || pNode == NULL)
-
{
-
return ;
-
}
-
-
Node* pb=list;//指向当前节点的父节点
-
Node* pbb=list;//指向当前节点爷爷节点
-
Node* pc= list;//指向当前节点
-
while(pc && pc != pNode)
-
{
-
pbb = pb ;
-
pb = pc;
-
pc = pc->pnext;
-
}
-
if(pc)//说明找到了pc==pNode的节点,否则pc==NULL
-
{
-
pb->pnext = pc->pnext;
-
pb->ppnext = pc->ppnext;
-
pbb->ppnext = pc->ppnext;
-
}
- }