双向链表--主要操作
来源:互联网 发布:java 泛型类 静态方法 编辑:程序博客网 时间:2024/06/14 09:15
#include<iostream>template <typename DataType> class DoubleList;/*对于DoubleList这个类的前向引用声明*/template <typename DataType> class DoubleListNode { //对DoubleListNode这个模板类进行声明private: friend class DoubleList<DataType>; //将DoubleList这个类声明为自己的友元, //然后DoubleList这个双向链表类就可以调用这个DoubleListNode这个类了 DoubleListNode():m_pprior(NULL), m_pnext(NULL){} DoubleListNode(const DataType item, DoubleListNode<DataType>* Prior = NULL, DoubleListNode<DataType>* next = NULL):m_data(item), m_pprior(prior), m_pnext(next) {} //DoubleListNode的两个构造函数 //并且这两个构造函数都被私有化,只有类的成员或者友元才可以访问! ~DoubleListNode() {//DoubleListNode的析构函数 m_pprior = NULL; //析构函数中使指针指向了NULL m_pnext = NULL; } DataType m_data; //数据域 DoubleListNode* m_pprior;//指向前驱结点的指针域 DoubleListNode* m_pnext;//指向后驱结点的指针域public: DataType getData(); //获取数据的公有成员函数};template <typename DataType> DataType DoubleListNode<DataType>::getData() { return this->m_data; //公有成员函数模板getData的类外定义}template<typename DataType> class DoubleList { //DoubleList双向链表这个模板类的声明public: DoubleList() { head = new DoubleListNode<DataType>(); } ~DoubleList() { cleanDoubleLink(); delete head; }public: void cleanDoubleList();//清空双向链表 int getLength();// 获取双向链表的长度 DoubleListNode<DataType>* findNode(int i = 0);//寻找第i个结点 DoubleListNode<DataType>* findData(DataType item);//寻找具有给定值数据的结点 bool insertNode(DataType item, int i = 0);//在第i个结点的后面插入新的结点 bool removeNode(int i = 0);//删除第i个结点 DataType getData(int i = 0);//获取第i个结点的数据private: DoubleListNode<DataType>* head; //头指针};template<typename DataType> void DoubleList<DataType>::cleanDoubleLink() { DoubleListNode<DataType>* pmove= head->m_pnext, *pdel; while(pmove != NULL) { //一次删除指针后面的结点 pdel是一个临时指针 把链表上每个结点的右指针域都遍历一遍 pdel = pmove; pmove = pdel->m_pnext; delete pdel; } head->m_pnext = NULL;}template <typename DataType> int DoubleList<DataType>::getLength() { int count = 0; DoubleListNode<DataType>* pmove = head->m_pnext;//遍历链表计算结点数 while(pmove != NULL) { pmove = pmove->m_pnext; count++; } return count;}template <typename DataType> DoubleListNode<DataType>* DoubleList<DataType>::findNode(int n = 1) { if(n < 1) { //判断位置是否有效0 cout << "非有效位置" << endl; return NULL: } DoubleListNode<DataType>* pmove = head->m_pnext; for(int i = 1; i < n; i++) { //利用游标指针pmove查找指定位置的结点 pmove = pmove->m_pnext; if(pmove == NULL) { //判断结点的是否存在 cout << "不存在指定结点" << endl; return NULL; } } return pmove;}template<typename DataType> bool DoubleList<DataType>::insertNode(DataType item, int n) { int n; if(n < 1) { //判断所插入的位置是否有效 cout << "插入位置无效" << endl; return 0; } //创建新结点, 设置游标指针 DoubleListNode<DataType>* newnode = new DoubleListNode<DataType>(item), *pmove = head; if(newnode == NULL) { cout << "内存分配失败,新结点无法创建!" << endl; exit(1); } for(i = 1; i < n; i++) { pmove = pmove->m_pnext; if(pmove == NULL && i < n-1) { cout << "超出链表长度,插入位置无效" << endl; return 0; } } //插入新结点 newnode-> m_pnext= pmove->m_pnext; if(pmove->m_pnext != NULL) { //判断是否在链表的尾部添加结点 pmove->m_pnext->m_pprior = newnode; } newnode->m_pprior = pmove; pmove->m_pnext = newnode; return 1;}template <typename DataType> bool DoubleList<DataType>::removeNode(int n = 1) { if(n<1 || n>getlength) { cout << "位置不合法" << endl; return false; } DoubleListNode<DataType>* pmove = head->m_pnext, *pdel; for(int i = 1; i < n; i++) { pmove = pmove->m_pnext; if(pmove == NULL) { cout << "超出了链表范围" << endl; return false; } } //删除结点 pdel = pmove; pmove->m_pprior->m_pnext = pdel->m_pnext; pmove->m_pnext->m_pprior = pdel->m_pprior; delete pdel; return true;}template<typename DataType> DataType DoubleList<DataType>::getData(int n = 1) { if(n < 1 || n > getlength()) { cout << "指定位置无效" << endl; exit(1); } DoubleListNode<DataType>*pmove = head->m_next; for(int i = 1; i < n; i++) { pmove = pmove->m_next; if(pmove == NULL) { cout << "指定结点不存在" << endl; exit(1); } } if(pmove == NULL) { cout << "结点不存在" << endl; return NULL; } return pmove->m_data;}template<typename DataType> DoubleListNode<DataType>* DoubleList<DataType>::findData(DataType item) { DoubleListNode<DataType>* pmove = head->m_pnext; if(pmove == NULL) { cout << "链表是空表" << endl; exit(1); } while(pmove->getData() != item) { pmove = pmove->m_pnext; if(pmove == NULL) { cout << "没有所查找的结点" << endl; exit(1); } } remove pmove;}
主函数部分自己写
0 0
- 双向链表--主要操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表操作
- 双向链表基本操作
- java 操作双向链表
- 双向循环链表操作
- 双向循环链表操作
- [C++]双向链表操作
- 双向链表的操作
- 双向链表的操作
- 双向链表的操作
- 双向链表简单操作
- java 操作双向链表
- 双向链表基本操作
- 双向链表基本操作
- win8开机默认账户以及无密码登陆
- Java Web应用程序开发_HTTP协议
- #ifdef,#else,#endif,#if用法详解
- Js屏蔽键盘输入的某些字符,用以部分代替正则表达式
- 图片自适应uiimageview
- 双向链表--主要操作
- 关于在Android开发中使用模糊透明效果的方法
- POJ 1321-棋盘问题 简单搜索DFS
- HDU 1686 KMP
- Deepin/Ubuntu下搭建Golang开发环境
- linux socket 进程间通信
- [cocos2dx]重要父类——CCObject对象类
- HTTP请求报文和HTTP响应报文
- 小工具使用