一个优雅的双向链表的实现
2016-04-03 00:00
204 查看
// basic_defs.h #ifndef __BASIC_DEFS_H__ #define __BASIC_DEFS_H__ #include "head.h" // 包含必须的标准库文件 typedef unsigned long long UINT64_T; typedef long long INT64_T; typedef unsigned int UINT32_T; typedef int INT32_T; typedef unsigned short UINT16_T; typedef short INT16_T; typedef unsigned char UINT8_T; typedef unsigned char UCHAR_T; typedef char INT8_T; typedef char CHAR_T; typedef unsigned char BOOLEAN_T; typedef float FLOAT_T; typedef double DOUBLE_T; typedef void VOID; #include "error_defs.h" // 错误码定义头文件 #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef NULL #define NULL 0 #endif #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0])) typedef INT32_T SYS_RET_T; #endif // dlink.h #ifndef __DLINK_H__ #define __DLINK_H__ #include "basic_defs.h" struct NODE_T { INT32_T id; struct NODE_T *next, *prev; }; typedef struct NODE_T LINK_NODE_T, LINK_LIST_T, *PLINK_LIST_T; LINK_NODE_T *linkNode_malloc(INT32_T id); VOID linkNode_free(LINK_NODE_T **p); PLINK_LIST_T linkList_init(VOID); LINK_NODE_T *linkList_find(PLINK_LIST_T head, INT32_T id); INT32_T linkList_insert(PLINK_LIST_T head, INT32_T id); INT32_T linkList_delete(PLINK_LIST_T head, INT32_T id); VOID linkList_print(PLINK_LIST_T head); #endif //dlink.c /* 带头结点的双向链表操作 */ #include "dlink.h" LINK_NODE_T *linkNode_malloc(INT32_T id) { LINK_NODE_T *p = NULL; p = (LINK_NODE_T *)malloc(sizeof(LINK_NODE_T)); if (p == NULL) { printf("Malloc error!\n"); return NULL; } p->id = id; p->next = p->prev = NULL; return p; } VOID linkNode_free(LINK_NODE_T **p) { if (*p == NULL) &nbs 7fe8 p; return ; free(*p); *p = NULL; } PLINK_LIST_T linkList_init(VOID) { PLINK_LIST_T head = NULL; head = linkNode_malloc(0); return head; } LINK_NODE_T *linkList_find(PLINK_LIST_T head, INT32_T id) { LINK_NODE_T *p = NULL; p = head->next; while (p != NULL) { if (p->id == id) return p; p = p->next; } return p; } INT32_T linkList_insert(PLINK_LIST_T head, INT32_T id) { LINK_NODE_T *p, *new; if (NULL == head) return -1; if (linkList_find(head, id) != NULL) { printf("%d is already in the linklist\n", id); return 0; } if ((new = linkNode_malloc(id)) == NULL) return -1; p = head->next; if (p != NULL) { /* 在头结点和第一个结点之间插入新结点 */ new->prev = p->prev; p->prev->next = new; new->next = p; p->prev = new; } else { /* 只有头结点,直接将新结点接在头结点之后 */ head->next = new; new->prev = head; } return 0; } INT32_T linkList_delete(PLINK_LIST_T head, INT32_T id) { LINK_NODE_T *p = NULL; if (head == NULL) return -1; p = linkList_find(head, id); if (p == NULL) { printf("%d isn't in link list.\n"); return 0; } if (p->next == NULL) { /* 要删除的结点是双向链表的最后一个结点,直接移除 */ p->prev->next = NULL; } else { p->prev->next = p->next; p->next->prev = p->prev; } linkNode_free(&p); return 0; } VOID linkList_print(PLINK_LIST_T head) { LINK_NODE_T *p; if (head == NULL) return; p = head->next; while (p != NULL) { printf("%d ", p->id); p = p->next; } printf("\n"); return; } INT32_T main(VOID) { PLINK_LIST_T link = NULL; link = linkList_init(); linkList_delete(link, 55); linkList_insert(link, 55); linkList_insert(link, 95); linkList_insert(link, 95); linkList_insert(link, 115); linkList_insert(link, 135); linkList_print(link); linkList_delete(link, 55); linkList_delete(link, 135); linkList_print(link); return 0; }
相关文章推荐
- 一个非常有技巧的错误码定义头文件,可以拿去直接用
- linux环境下安装msyql数据库完整教程
- 拉勾沙龙会上,前大众点评产品经理运满满CTO分享的程序员职业规划
- eclipse下调试spring mvc ,github 帮助文档学习
- Zookeeper学习笔记-zookeeper介绍
- 2016年4月3日
- javascript中的__proto__ && prototype
- 经济学原理
- OJ递归青蛙过河问题
- OJ递归之二分查找法
- OJ链表之建立顺序链表
- OJ--链表的归并
- android ViewPager 轮播图的实现
- java和mysql存储过程
- zlib.h:no such file or directory
- CentOS 7 更换 163网易yum源
- linux安装GCC详解
- CentOS 7安装配置Samba
- “Linux内核分析”实验报告(六)分析Linux内核创建一个新进程的过程
- VC6如何让Dialog响应WM_CHAR消息