带哨兵的环形双向链表
来源:互联网 发布:淘宝全屏海报轮播 编辑:程序博客网 时间:2024/05/16 13:53
/* *带哨兵的环形双向链表 *具有对链表的插入 浏览 删除的功能 *Author: StoryMonster *Last Change Date: 2016/6/22 */#include <iostream>#include <stdlib.h>typedef struct CircleChain{ struct CircleChain *prev; int value; struct CircleChain *next;} CircleChain;int CurrentLength = 0;CircleChain *sentinel = (CircleChain *)malloc(sizeof(CircleChain)); //哨兵/* *向环形双向链表中插入一个元素 */bool Insert(CircleChain * chain){ if(sentinel->next == NULL) { sentinel->next = chain; chain->next = chain; chain->prev = chain; CurrentLength++; return true; } CircleChain *p = sentinel->next; CircleChain *p1 = p->prev; p1->next = chain; p->prev = chain; chain->next = p; chain->prev = p1; CurrentLength++; return true;}void Scan(){ CircleChain *p = sentinel->next; CircleChain *p1 = p; std::cout << p->value << "-->"; p = p->next; while(p != p1) { std::cout << p->value << "-->"; p = p->next; } std::cout << p->value<< std::endl;}bool Delete(int value){ CircleChain *p = sentinel->next; CircleChain *p3 = sentinel->next; CircleChain *p1 = p->prev; CircleChain *p2 = p->next; if(CurrentLength == 1) { if(p->value == value) { sentinel->next = NULL; free(p); CurrentLength--; return true; } } int len = CurrentLength; p = p->next; while(p != p3) { if(p->value == value) { len--; p1->next = p2; p2->prev = p1; free(p); p = p2; } else { p = p->next; } p1 = p->prev; p2 = p->next; } if(p->value == value) { len--; p1->next = p2; p2->prev = p1; sentinel->next = p2; free(p); } if(len == CurrentLength) { return false; } else { CurrentLength = len; return true; }}int main(){ CircleChain *chain = NULL; int value = 0; int choice = 0; int offset = 0; sentinel->next = NULL; sentinel->prev = NULL; while(1) { std::cout << "1:insert 2:delete 3:scan "<<std::endl; std::cout << "your choice:"; std::cin >> choice; switch(choice) { case 1:std::cout << "input value:"; std::cin >> value; chain = (CircleChain *)malloc(sizeof(CircleChain)); chain->next = NULL; chain->prev = NULL; chain->value = value; Insert(chain); std::cout << "there are total " << CurrentLength <<" data in chain!"<< std::endl; break; case 2:std::cout << "input the delete value:"; std::cin >> value; if(Delete(value)) { std::cout << "delete ok!"<< std::endl; } else { std::cout << "delete fail!" << std::endl; } break; case 3:Scan();break; } }}
结果截图如下:
0 0
- 带哨兵的环形双向链表
- 算法----带哨兵的双向链表
- 带哨兵的双向链表
- 不带哨兵的双向链表
- 【算法导论】10.2不带哨兵节点和带哨兵节点的双向链表
- 数据结构--双向带哨兵的循环链表
- 带有哨兵的双向循环链表
- 带哨兵的双向循环链表的C语言实现
- 算法导论 10.2-6 带哨兵的双向链表合并两个不相交的集合
- 使用带sentinel哨兵的双向链表实现栈和队列
- C++实现有哨兵的双向循环链表
- List环形双向链表
- 10.2-5 带哨兵的单向循环链表
- 丢手帕问题的双向环形链表实现
- C++双向环形链表模板类
- 带哨兵与不带哨兵的插入排序
- 带哨兵的插入排序
- 用面向对象的思维去解决数三退一。关键字,双向环形链表。
- OmegaT 扩展点滴
- Servlet
- 常见的浏览器兼容问题
- 5 整合Hibernate4
- Spring 监听器和乱码过滤器配置
- 带哨兵的环形双向链表
- Linux学习之软件包管理--源码包管理
- 同源基因查找软件OrthoMCL的使用[转载+再编辑]
- LeetCode Integer to Roman(数字转罗马)
- 从递归版归并排序算法看递归函数连续两次调用自己函数每步如何返回,看递归和栈的关系
- Java设计模式之命令模式
- Hive和HBase的区别
- 2016-6-26 HTML知识点总结
- jQuery Easing 使用方法及其图解