一步一步写算法(之双向链表)(二)

2014-11-23 23:33:49 · 作者: · 浏览: 23
);

assert(NULL != pNode);

pIndex = *ppDLinkNode;

while(NULL != pIndex->next)

pIndex = pIndex->next;

pNode->prev = pIndex;

pNode->next = pIndex->next;

pIndex->next = pNode;

return TRUE;

}

STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)

{

DOUBLE_LINK_NODE* pNode;

DOUBLE_LINK_NODE* pIndex;

if(NULL == ppDLinkNode)

return FALSE;

if(NULL == *ppDLinkNode){

pNode = create_double_link_node(data);

assert(NULL != pNode);

*ppDLinkNode = pNode;

(*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL;

return TRUE;

}

if(NULL != find_data_in_double_link(*ppDLinkNode, data))

return FALSE;

pNode = create_double_link_node(data);

assert(NULL != pNode);

pIndex = *ppDLinkNode;

while(NULL != pIndex->next)

pIndex = pIndex->next;

pNode->prev = pIndex;

pNode->next = pIndex->next;

pIndex->next = pNode;

return TRUE;

} (6)双向链表中删除数据

STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)

{

DOUBLE_LINK_NODE* pNode;

if(NULL == ppDLinkNode || NULL == *ppDLinkNode)

return FALSE;

pNode = find_data_in_double_link(*ppDLinkNode, data);

if(NULL == pNode)

return FALSE;

if(pNode == *ppDLinkNode){

if(NULL == (*ppDLinkNode)->next){

*ppDLinkNode = NULL;

}else{

*ppDLinkNode = pNode->next;

(*ppDLinkNode)->prev = NULL;

}

}else{

if(pNode->next)

pNode->next->prev = pNode->prev;

pNode->prev->next = pNode->next;

}

free(pNode);

return TRUE;

}

STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data)

{

DOUBLE_LINK_NODE* pNode;

if(NULL == ppDLinkNode || NULL == *ppDLinkNode)

return FALSE;

pNode = find_data_in_double_link(*ppDLinkNode, data);

if(NULL == pNode)

return FALSE;

if(pNode == *ppDLinkNode){

if(NULL == (*ppDLinkNode)->next){

*ppDLinkNode = NULL;

}else{

*ppDLinkNode = pNode->next;

(*ppDLinkNode)->prev = NULL;

}

}else{

if(pNode->next)

pNode->next->prev = pNode->prev;

pNode->prev->next = pNode->next;

}

free(pNode);

return TRUE;

} (7)统计双向链表中数据的个数

int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode)

{

int count = 0;

DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;

while(NULL != pNode){

count ++;

pNode = pNode->next;

}

return count;

}

int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode)

{

int count = 0;

DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;

while(NULL != pNode){

count ++;

pNode = pNode->next;

}

return count;

} (8)打印双向链表中数据

void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode)

{

DOUBLE_LINK_NODE* pNode