双向链表

来源:互联网 发布:微纳制造 知乎 编辑:程序博客网 时间:2024/06/05 18:59
#include <stdio.h>#include <assert.h>typedef struct _DOUBLE_LINK_NODE{int data;struct _DOUBLE_LINK_NODE* prev;struct _DOUBLE_LINK_NODE* next;}DOUBLE_LINK_NODE;/*创建一个节点,使节点的prev=NULL next=NULLvalue=xxx返回值:创建的节点*/DOUBLE_LINK_NODE* create_double_link_node(int value){DOUBLE_LINK_NODE* pDLinkNode = NULL;pDLinkNode = (DOUBLE_LINK_NODE*)malloc(sizeof(DOUBLE_LINK_NODE));assert(NULL != pDLinkNode);memset(pDLinkNode, 0, sizeof(DOUBLE_LINK_NODE));pDLinkNode->data = value;return pDLinkNode;}/**  *pDLinkNode即为双向链表的头结点指针*/void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode){DOUBLE_LINK_NODE* pNode;if(NULL == *pDLinkNode)return ;//先获得当前节点pNode = *pDLinkNode;//再让pDLinkNode指向当前的下个节点*pDLinkNode = pNode->next;//释放之前获得的节点free(pNode);//继续处理下个节点delete_all_double_link_node(pDLinkNode);}/** pDLinkNode即为双向链表的头结点指针*/DOUBLE_LINK_NODE* find_data_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode, int data){DOUBLE_LINK_NODE* pNode = NULL;if(NULL == pDLinkNode)return NULL;pNode = (DOUBLE_LINK_NODE*)pDLinkNode;while(NULL != pNode){if(data == pNode->data)return pNode;pNode = pNode ->next;}return NULL;}int insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data){DOUBLE_LINK_NODE* pNode;DOUBLE_LINK_NODE* pIndex;if(NULL == ppDLinkNode)return 0;//当前链表没有一个节点时候if(NULL == *ppDLinkNode){pNode = create_double_link_node(data);    assert(NULL != pNode);*ppDLinkNode = pNode;(*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL;return 1;}if(NULL != find_data_in_double_link(*ppDLinkNode, data))return 0;//需要插入的节点pNodepNode = create_double_link_node(data);assert(NULL != pNode);//先得到最后个节点, pIndex指向最后个节点pIndex = *ppDLinkNode;while(NULL != pIndex->next)pIndex = pIndex->next;//将需要插入的节点插入链表末尾pNode->prev = pIndex;pNode->next = pIndex->next;pIndex->next = pNode;return 1;}int delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int data){DOUBLE_LINK_NODE* pNode;if(NULL == ppDLinkNode || NULL == *ppDLinkNode)return 0;pNode = find_data_in_double_link(*ppDLinkNode, data);if(NULL == pNode)return 0;//要删除的pNode是头结点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 1;}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;}void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode){DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode;while(NULL != pNode){printf("%d\n", pNode->data);pNode = pNode ->next;}}int main(){DOUBLE_LINK_NODE *dlist =  create_double_link_node(5);if(insert_data_into_double_link(&dlist, 4))printf("insert ok\n");if(insert_data_into_double_link(&dlist, 3))printf("insert ok\n");if(insert_data_into_double_link(&dlist, 2))printf("insert ok\n");if(insert_data_into_double_link(&dlist, 1))printf("insert ok\n");if(insert_data_into_double_link(&dlist, 5))printf("insert error , has existed\n");printf("---------------------------------------------\n");DOUBLE_LINK_NODE *p =  find_data_in_double_link(dlist, 3);if(p!= NULL)printf("find p->data=%d\n", p->data);elseprintf("not find\n");p = NULL;p =  find_data_in_double_link(dlist, 10);if(p!=NULL)printf("find p->data=%d\n", p->data);elseprintf("not find\n");printf("---------------------------------------------\n");if(delete_data_from_double_link(&dlist, 1))printf("delete ok\n");printf("---------------------------------------------\n");print_double_link_node(dlist);int len = count_number_in_double_link(dlist);printf("double link cnt=%d\n", len);printf("---------------------------------------------\n");delete_all_double_link_node(&dlist);len = count_number_in_double_link(dlist);printf("double link cnt=%d\n", len);}

0 0
原创粉丝点击