【C语言】双链表常用函数
来源:互联网 发布:知乎lolfaker 编辑:程序博客网 时间:2024/06/05 10:14
/* * 链表演示 * 双向 * */#include <stdlib.h>#include "03link.h"//链表的初始化函数void link_init(link *p_link) { p_link->head.p_next = &(p_link->tail); p_link->tail.p_next = NULL; //下面是另一个方向的,从尾指向头 p_link->tail.p_pre = &(p_link->head); p_link->head.p_pre = NULL;}//链表的清理函数void link_deinit(link *p_link) { while (p_link->head.p_next != &(p_link->tail)) { node *p_first = &(p_link->head); node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; p_first->p_next = p_last;//清理正向 p_last->p_pre = p_first;//清理反向,就的指针的方向反了一下 free(p_mid); p_mid = NULL; }}//计算有效数字个数的函数,正反一样,要修改可以让p_first,p_mid,p_last,从后面开始来int link_size(const link *p_link) { int cnt = 0; const node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { const node *p_first = p_node; const node *p_mid = p_first->p_next; const node *p_last = p_mid->p_next; if (p_mid != &(p_link->tail)) { cnt++; } } return cnt;}//判断链表是否空的函数int link_empty(const link *p_link) { return p_link->head.p_next == &(p_link->tail);}//判断链表是否满的函数int link_full(const link *p_link) { return 0;}//在链表前边加入新节点的函数void link_add_head(link *p_link, int val) { node *p_first = NULL, *p_mid = NULL, *p_last = NULL; node *p_tmp = (node *)malloc(sizeof(node)); if (!p_tmp) { return ; } p_tmp->num = val; p_tmp->p_next = NULL;//正向指针 p_tmp->p_pre = NULL;//反向指针 p_first = &(p_link->head); p_mid = p_first->p_next; p_last = p_mid->p_next; p_first->p_next = p_tmp; p_tmp->p_pre = p_first;//反向 p_tmp->p_next = p_mid; p_mid->p_pre = p_tmp;//反向}//在原有节点最后加入新节点的函数void link_append(link *p_link, int val) { node *p_first = NULL, *p_mid = NULL, *p_last = NULL; node *p_tmp = (node *)malloc(sizeof(node)); if (!p_tmp) { return ; } p_tmp->num = val; p_tmp->p_next = NULL;//正向 p_tmp->p_pre = NULL;//反向 p_first = p_link->tail.p_pre;//反向添加最后一个节点就是这里不同,原来是first指向头,现在是指向尾,相当于反着来了 p_mid = p_first->p_next; p_last = p_mid->p_next; //把新节点加入到p_first和p_mid中间 p_first->p_next = p_tmp;//正 p_tmp->p_pre = p_first;//反 p_tmp->p_next = p_mid;//正 p_mid->p_pre = p_tmp;//反}/*void link_append(link *p_link, int val) { node *p_tmp = (node *)malloc(sizeof(node)); node *p_node = NULL; if (!p_tmp) { return ; } p_tmp->num = val; p_tmp->p_next = NULL; p_tmp->p_pre = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid == &(p_link->tail)) { p_first->p_next = p_tmp; p_tmp->p_pre = p_first; p_tmp->p_next = p_mid; p_mid->p_pre = p_tmp; break; } }}*///按顺序插入函数void link_insert(link *p_link, int val) { node *p_tmp = (node *)malloc(sizeof(node)); node *p_node = NULL; if (!p_tmp) { return ; } p_tmp->num = val; p_tmp->p_next = NULL; p_tmp->p_pre = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid == &(p_link->tail) || p_mid->num > val) { p_first->p_next = p_tmp; p_tmp->p_pre = p_first;//反向 p_tmp->p_next = p_mid; p_mid->p_pre = p_tmp;//反向 break; } }}//删除最前面有效数字的函数int link_remove_head(link *p_link) { node *p_first = NULL, *p_mid = NULL, *p_last = NULL; if (link_empty(p_link)) { return 0; } p_first = &(p_link->head); p_mid = p_first->p_next; p_last = p_mid->p_next; p_first->p_next = p_last;//正 p_last->p_pre = p_first;//反 free(p_mid); p_mid = NULL; return 1;}//删除最后一个有效节点的函数int link_remove_tail(link *p_link) { node *p_first = NULL, *p_mid = NULL, *p_last = NULL; if (link_empty(p_link)) { return 0; } p_first = p_link->tail.p_pre->p_pre;//尾节点->最后一个有效节点->倒数第二个有效节点 p_mid = p_first->p_next;//最后一个有效节点 p_last = p_mid->p_next; //把p_mid指针捆绑的节点从链表里 //摘出来 p_first->p_next = p_last; p_last->p_pre = p_first; free(p_mid); p_mid = NULL; return 1;}/*int link_remove_tail(link *p_link) { node *p_node = NULL; if (link_empty(p_link)) { return 0; } for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_last == &(p_link->tail)) { p_first->p_next = p_last; p_last->p_pre = p_first; free(p_mid); p_mid = NULL; break; } } return 1;}*///删除某个数字所在节点的函数int link_remove(link *p_link, int val) { node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { node *p_first = p_node; node *p_mid = p_first->p_next; node *p_last = p_mid->p_next; if (p_mid != &(p_link->tail) && p_mid->num == val) { p_first->p_next = p_last;//正 p_last->p_pre = p_first;//反 free(p_mid); p_mid = NULL; return 1; } } return 0;}//获得链表最前面数字的函数int link_get_head(const link *p_link, int *p_num) { const node *p_first = NULL, *p_mid = NULL, *p_last = NULL; if (link_empty(p_link)) { return 0; } p_first = &(p_link->head); p_mid = p_first->p_next; p_last = p_mid->p_next; *p_num = p_mid->num; return 1;}//获得最后有效数字的函数int link_get_tail(const link *p_link, int *p_num) { if (link_empty(p_link)) { return 0; } *p_num = p_link->tail.p_pre->num; return 1;}/*int link_get_tail(const link *p_link, int *p_num) { const node *p_node = NULL; if (link_empty(p_link)) { return 0; } for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { const node *p_first = p_node; const node *p_mid = p_first->p_next; const node *p_last = p_mid->p_next; if (p_last == &(p_link->tail)) { *p_num = p_mid->num; break; } } return 1;}*///根据编号获得数字的函数int link_get(const link *p_link, int num, int *p_num) { int cnt = 0; const node *p_node = NULL; for (p_node = &(p_link->head);p_node != &(p_link->tail);p_node = p_node->p_next) { const node *p_first = p_node; const node *p_mid = p_first->p_next; const node *p_last = p_mid->p_next; if (p_mid != &(p_link->tail) && num == cnt) { *p_num = p_mid->num; return 1; } cnt++; } return 0;}
阅读全文
0 0
- 【C语言】双链表常用函数
- C语言常用函数
- C语言常用函数
- C语言常用函数
- c 语言 常用函数
- C语言 常用函数
- C语言常用函数
- [C语言]常用C语言数学函数
- C语言常用内置函数
- 几个常用C语言函数
- C语言 字符串常用函数
- C语言常用字符串函数
- c语言常用数学函数
- c语言 常用字符串函数
- C语言常用函数简介
- c语言常用功能函数
- c语言常用数学函数
- c语言、c++常用函数
- Linux解压命令
- 【C语言】队列演示(队列的几个函数)
- 选择排序实现
- (树状数组)hdu1166 敌兵布阵
- (转)一个由自由职业者建立的量化对冲基金
- 【C语言】双链表常用函数
- 在安装并使用tensorflow中的Object-detection模块时遇到的一些问题汇总及解决方法
- python2.x与3.x的主要区别笔记
- THINKPHP 的 RBAC 权限总结
- HDU 1800 Flying to the Mars
- JavaScript简介与基础语法
- HDU-1874-畅通工程续
- Dubbo-Admin管理平台和Zookeeper注册中心的搭建
- 【C语言】单链表常用函数