link list
上一次发的代码有2个小 BUG
1. 没有对那个空的指针进行初始化, 现在已经初始化为NULL.
2. 数据定义的结构已经已经正规化, 结构体采用小写的_t 模型
#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; int reg; struct _double_link_node* prev; struct _double_link_node* next; }double_link_node_t; void delete_all_double_link_node(double_link_node_t** pDLinkNode);//1. 删除双向链表 STATUS insert_addr_into_double_link(double_link_node_t** ppDLinkNode, int value_addr, int value_reg);//2. 双向链表中插入地址+寄存器值 STATUS delete_addr_from_double_link(double_link_node_t** ppDLinkNode, int value_addr);//3. 双向链表中删除地址 int count_number_in_double_link(const double_link_node_t* pDLinkNode);//4. 统计双向链表中地址的个数 void print_double_link_node(const double_link_node_t* pDLinkNode);//5. 打印双向链表中地址 int main() { double_link_node_t *mb_poll_link; mb_poll_link = malloc(sizeof(double_link_node_t)); memset(mb_poll_link,0,sizeof(double_link_node_t)); print_double_link_node(mb_poll_link); insert_addr_into_double_link(&mb_poll_link, 11, 0); delete_addr_from_double_link(&mb_poll_link, 44); print_double_link_node(mb_poll_link); printf("main end!\n"); return 0; } //static //创建双向链表节点 double_link_node_t* create_double_link_node(int value_addr, int value_reg) { double_link_node_t* pDLinkNode = NULL; pDLinkNode = (double_link_node_t*)malloc(sizeof(double_link_node_t)); assert(NULL != pDLinkNode); memset(pDLinkNode, 0, sizeof(double_link_node_t)); pDLinkNode->addr = value_addr; pDLinkNode->reg = value_reg; return pDLinkNode; } // static //在双向链表中查找数据 double_link_node_t* find_addr_in_double_link(const double_link_node_t* pDLinkNode, int addr) { double_link_node_t* pNode = NULL; if (NULL == pDLinkNode) return NULL; pNode = (double_link_node_t*)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_t** pDLinkNode) { double_link_node_t* pNode; if (NULL == *pDLinkNode) return; pNode = *pDLinkNode; *pDLinkNode = pNode->next; free(pNode); delete_all_double_link_node(pDLinkNode); //调用自身函数循环free } //2. 双向链表中插入数据 STATUS insert_addr_into_double_link(double_link_node_t** ppDLinkNode, int value_addr, int value_reg) { double_link_node_t* pNode; double_link_node_t* pIndex; if(NULL == ppDLinkNode) // 原链表首地址 空 ->FALSE return FALSE; if(NULL == *ppDLinkNode){ // 原链表 空 ->直接加入 pNode = create_double_link_node(value_addr, value_reg); assert(NULL != pNode); *ppDLinkNode = pNode; (*ppDLinkNode)->prev = (*ppDLinkNode)->next = NULL; return TRUE; } if (NULL != find_addr_in_double_link(*ppDLinkNode, value_addr)) // 原链表存在数据addr ->FALSE return FALSE; pNode = create_double_link_node(value_addr, value_reg); // assert(NULL != pNode); pIndex = *ppDLinkNode; // 赋值链表首地址 #if 1 //添加的先后顺序 while (NULL != pIndex->next)// 找到最后一个节点 pIndex = pIndex->next; pNode->prev = pIndex; pNode->next = pIndex->next; pIndex->next = pNode; #endif #if 0 //递增 if(pIndex->addr>value_addr) // 起始位置 ->OK ? { *ppDLinkNode = pNode; pNode->prev = NULL; pNode->next = pIndex; pIndex->prev = pNode; } else { while (NULL != pIndex->next)// 找到最后一个节点 pIndex = pIndex->next; if(pIndex->addr<value_addr){ // 结束位置 ->OK ? pNode->prev = pIndex; pNode->next = pIndex->next; pIndex->next = pNode; } else{ // 中间位置 pIndex = *ppDLinkNode;//首地址向后 while (pIndex->addr<value_addr) pIndex = pIndex->next; pNode->prev = pIndex->prev; pNode->next = pIndex; pIndex->prev->next = pNode; pIndex->prev = pNode; } } #endif #if 0 //递减 if(pIndex->addr<value_addr) // 起始位置 ->OK ? { *ppDLinkNode = pNode; pNode->prev = NULL; pNode->next = pIndex; pIndex->prev = pNode; } else { while (NULL != pIndex->next)// 找到最后一个节点 pIndex = pIndex->next; if(pIndex->addr>value_addr){ // 结束位置 ->OK ? pNode->prev = pIndex; pNode->next = pIndex->next; pIndex->next = pNode; } else{ // 中间位置 pIndex = *ppDLinkNode;//首地址向后 while (pIndex->addr>value_addr) pIndex = pIndex->next; pNode->prev = pIndex->prev; pNode->next = pIndex; pIndex->prev->next = pNode; pIndex->prev = pNode; } } #endif return TRUE; } //3. 双向链表中删除数据 STATUS delete_addr_from_double_link(double_link_node_t** ppDLinkNode, int value_addr) { double_link_node_t* pNode; if (NULL == ppDLinkNode || NULL == *ppDLinkNode) // "原链表首地址"或“原链表” 空 ->FALSE return FALSE; pNode = find_addr_in_double_link(*ppDLinkNode, value_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_t* pDLinkNode) { int count = 0; double_link_node_t* pNode = (double_link_node_t*)pDLinkNode; while (NULL != pNode){ count++; pNode = pNode->next; } return count; } //5. 打印双向链表中数据 void print_double_link_node(const double_link_node_t* pDLinkNode) { double_link_node_t* pNode = (double_link_node_t*)pDLinkNode; printf("print_double_link -> start\n"); while (NULL != pNode){ printf("%d %d\n", pNode->addr,pNode->reg); pNode = pNode->next; } printf("print_double_link -> end\n"); }