根据data大小排序(递增):
删除all + 删除1 + 添加1 + 打印all
// 双链表 -> 有序双链表(递增) #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> typedef enum{ FALSE = 0, TRUE = 1, }STATUS; typedef struct _DOUBLE_LINK_NODE { int addr; struct _DOUBLE_LINK_NODE* prev; struct _DOUBLE_LINK_NODE* next; }DOUBLE_LINK_NODE; //1. 删除双向链表 void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode); //2. 双向链表中插入数据 STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int addr); //3. 双向链表中删除数据 STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int addr); //4. 统计双向链表中数据的个数 int count_number_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode); //5. 打印双向链表中数据 void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode); DOUBLE_LINK_NODE* mb_poll_link; int main() { print_double_link_node(mb_poll_link); insert_data_into_double_link(&mb_poll_link, 11); insert_data_into_double_link(&mb_poll_link, 66); insert_data_into_double_link(&mb_poll_link, 22); insert_data_into_double_link(&mb_poll_link, 33); insert_data_into_double_link(&mb_poll_link, 55); insert_data_into_double_link(&mb_poll_link, 44); insert_data_into_double_link(&mb_poll_link, 77); delete_data_from_double_link(&mb_poll_link, 77); print_double_link_node(mb_poll_link); printf("main end! "); return 0; } //static //创建双向链表节点 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->addr = value; return pDLinkNode; } // static //在双向链表中查找数据 DOUBLE_LINK_NODE* find_data_in_double_link(const DOUBLE_LINK_NODE* pDLinkNode, int addr) { DOUBLE_LINK_NODE* pNode = NULL; if (NULL == pDLinkNode) return NULL; pNode = (DOUBLE_LINK_NODE*)pDLinkNode; while (NULL != pNode){ if (addr == pNode->addr) return pNode; pNode = pNode->next; } return NULL; } //1. 删除双向链表 void delete_all_double_link_node(DOUBLE_LINK_NODE** pDLinkNode) { DOUBLE_LINK_NODE* pNode; if (NULL == *pDLinkNode) return; pNode = *pDLinkNode; *pDLinkNode = pNode->next; free(pNode); delete_all_double_link_node(pDLinkNode); //调用自身函数循环free } //2. 双向链表中插入数据 STATUS insert_data_into_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int addr) { DOUBLE_LINK_NODE* pNode; DOUBLE_LINK_NODE* pIndex; if(NULL == ppDLinkNode) // 原链表首地址 空 ->FALSE return FALSE; if(NULL == *ppDLinkNode){ // 原链表 空 ->直接加入 pNode = create_double_link_node(addr); assert(NULL != pNode); *ppDLinkNode = pNode; (*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL; return TRUE; } if (NULL != find_data_in_double_link(*ppDLinkNode, addr)) // 原链表存在数据data ->FALSE return FALSE; pNode = create_double_link_node(addr); // assert(NULL != pNode); pIndex = *ppDLinkNode; // 赋值链表首地址 #if 0 //添加的先后顺序 while (NULL != pIndex->next)// 找到最后一个节点 pIndex = pIndex->next; pNode->prev = pIndex; pNode->next = pIndex->next; pIndex->next = pNode; #endif #if 1 //递增 if(pIndex->addr>addr) // 起始位置 ->OK ? { *ppDLinkNode = pNode; pNode->prev = NULL; pNode->next = pIndex; pIndex->prev = pNode; } else { while (NULL != pIndex->next)// 找到最后一个节点 pIndex = pIndex->next; if(pIndex->addr<addr){ // 结束位置 ->OK ? pNode->prev = pIndex; pNode->next = pIndex->next; pIndex->next = pNode; } else{ // 中间位置 pIndex = *ppDLinkNode;//首地址向后 while (pIndex->addr<addr) pIndex = pIndex->next; pNode->prev = pIndex->prev; pNode->next = pIndex; pIndex->prev->next = pNode; pIndex->prev = pNode; } } #endif #if 0 //递减 if(pIndex->addr<addr) // 起始位置 ->OK ? { *ppDLinkNode = pNode; pNode->prev = NULL; pNode->next = pIndex; pIndex->prev = pNode; } else { while (NULL != pIndex->next)// 找到最后一个节点 pIndex = pIndex->next; if(pIndex->addr>addr){ // 结束位置 ->OK ? pNode->prev = pIndex; pNode->next = pIndex->next; pIndex->next = pNode; } else{ // 中间位置 pIndex = *ppDLinkNode;//首地址向后 while (pIndex->addr>addr) pIndex = pIndex->next; pNode->prev = pIndex->prev; pNode->next = pIndex; pIndex->prev->next = pNode; pIndex->prev = pNode; } } #endif return TRUE; } //3. 双向链表中删除数据 STATUS delete_data_from_double_link(DOUBLE_LINK_NODE** ppDLinkNode, int addr) { DOUBLE_LINK_NODE* pNode; if (NULL == ppDLinkNode || NULL == *ppDLinkNode) // "原链表首地址"或“原链表” 空 ->FALSE return FALSE; pNode = find_data_in_double_link(*ppDLinkNode, addr); 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; // 下一个节点的 prev = 节点的prev pNode->prev->next = pNode->next; // 前一个节点的 next = 节点的next } free(pNode); return TRUE; } //4. 统计双向链表中数据的个数 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; } //5. 打印双向链表中数据 void print_double_link_node(const DOUBLE_LINK_NODE* pDLinkNode) { DOUBLE_LINK_NODE* pNode = (DOUBLE_LINK_NODE*)pDLinkNode; printf("print_double_link -> start "); while (NULL != pNode){ printf("%d ", pNode->addr); pNode = pNode->next; } printf("print_double_link -> end "); }