数据结构——循环链表模板类
来源:互联网 发布:大数据商业价值 编辑:程序博客网 时间:2024/06/03 23:47
数据结构相关笔记整理(1.2)
最近数据结构进展缓慢,每个结构的代码少说都得200行,但是依旧喜欢成功运行时的成就感!这次主要整理了循环链表的模板class,新手上路难免有不当和瑕疵之处,希望群众们及时指出。下面贴出代码:
class及其函数定义:
//循环链表模板class#include <iostream>using namespace std;template<class T>struct CircleLinkNode { T data; CircleLinkNode<T> *link; //构造函数 CircleLinkNode(CircleLinkNode<T> * next = NULL) : link(next) {} CircleLinkNode(T d, CircleLinkNode<T> * next = NULL) : data(d), link(next) {}};template<class T>class CircleList {public: CircleList(const T & x); //构造函数 CircleList(CircleList<T> & L); //复制构造函数 ~CircleList(); //析构函数 int Length() const; //计算循环链表的长度 bool IsEmpty() { return first->link == first ? true : false; //判断是否是空表 } CircleLinkNode<T> * getHead() const; //返回附加头节点的地址 void setHead(CircleLinkNode<T> * p); //设置附加头节点的地址 CircleLinkNode<T> * Search(T x); //搜索含数据x的节点 CircleLinkNode<T> * Locate(int i); //搜索第i个元素的地址 T getData(int i); //取出第i个元素的值 void setData(int i, T & x); //用修改第i个元素的值 bool Insert(int i, T & x); //在第i个元素后插入x bool Remove(int i, T & x); //删除第i个元素,用x保存删除的数据 void createList(T endFlag); //创建单链表 void outputList(int stopSequence);protected: CircleLinkNode<T> *first, *last; //头指针、尾指针};//函数定义template<class T>CircleList<T>::CircleList(const T & x) { //构造函数: 开辟头节点并赋值 first = new CircleLinkNode<T>(x); first->link = first;}template<class T>CircleList<T>::~CircleList() { //释放相应的资源 delete first; delete last;}template<class T>CircleLinkNode<T> * CircleList<T>::getHead() const { //得到函数的头指针 return first;}template<class T>int CircleList<T>::Length() const { //计算链表的长度 CircleLinkNode<T> *calculLen = NULL; int Len = 0; calculLen = first->link; while (calculLen != first) { //当再一次循环到first时,返回计数长度 Len++; calculLen = calculLen->link; } return Len;}template<class T>CircleList<T>::CircleList(CircleList<T> &L) { //复制构造函数 int Len = Length(); //得到当前链表的长度 CircleLinkNode<T> *create = NULL, *destData, *srcData; create = new CircleLinkNode<T>(0); if (!create) { cerr << "内存分配错误" << endl; exit(1); } last = create; //标记尾节点 for (int i = 0; i < Len - 1; i ++) { create->link = first->link; first->link = create; create = new CircleLinkNode<T>(0); if (!create) { cerr << "内存分配错误" << endl; exit(1); } } //将L中的data域逐一copy到当前链表中 copyData = first->link; srcData = L.first->link; while (srcData == L.first) { destData->data = srcData->data; destData = destData->link; srcData = srcData->link; } //构建循环链表 last->link = first;}template<class T>CircleLinkNode<T> * CircleList<T>::Search(T x) { //查找数据域为x的节点并返回其地址 CircleLinkNode<T> * current = NULL; current = first->link; while (current != first) { if (current->data == x) { break; } current = current->link; } return current;}template<class T>CircleLinkNode<T> * CircleList<T>::Locate(int i) { //定位函数, 返回第i个节点的地址,可供插入与删除函数用 while (i <= 0 || i > Length()) { cout << "数据不合法,请重新输入" << endl; cin >> i; } CircleLinkNode<T> * current = NULL; current = first->link; for (int j = 1; j < i; j ++) { current = current->link; } return current;}template<class T>void CircleList<T>::createList(T endFlag) { //逆序创建单链表 T inputData = 0; CircleLinkNode<T> *create = NULL; cin >> inputData; create = new CircleLinkNode<T>(inputData); //在循环外侧创建尾节点 if (!create) { cerr << "内存分配错误" << endl; exit(1); } last = create; //标记尾节点 while (inputData != endFlag) { //是否满足结束条件 create->link = first->link; //建立链接 first->link = create; cin >> inputData; create = new CircleLinkNode<T>(inputData); //依次建立其他节点 if (!create) { cerr << "内存分配错误" << endl; exit(1); } } //单链表建立完成 last->link = first; //构建循环链表}template<class T>T CircleList<T>::getData(int i) { CircleLinkNode<T> * current; current = Locate(i); //定位函数调用 return current->data;}template<class T>void CircleList<T>::setData(int i, T & x) { //设置第i个节点的数据域为x CircleLinkNode<T> * current = NULL; current = Locate(i); current->data = x; //完成修改}template<class T>bool CircleList<T>::Insert(int i, T & x) { //在第i个节点后插入新的节点,并使其数据域赋值为x CircleLinkNode<T> * flagPtr; CircleLinkNode<T> * newNode = new CircleLinkNode<T>(x); if (!newNode) { //内存分配错误 return false; } if (0 == i) { //插入在首位置 newNode->link = first->link; first->link = newNode; } else { flagPtr = Locate(i); newNode->link = flagPtr->link; flagPtr->link = newNode; } return true;}template<class T>bool CircleList<T>::Remove(int i, T & x) { //删除第i个节点并将删除的数据存储在x当中 CircleLinkNode<T> *preNode = NULL, *delNode = NULL; preNode = Locate(i - 1); delNode = Locate(i); preNode->link = delNode->link; delete delNode; return true;}template<class T>void CircleList<T>::outputList(int stopSequence) { if (first == first->link) { cout << "此为空表" << endl; return; } //输出循环链表,直到指定序号停止输出(方便测试循环特性) CircleLinkNode<T> * current = NULL; current = first->link; for (int i = 0; i < stopSequence; i ++) { cout << current->data << " "; current = current->link; if (current == first) { current = current->link; //跳过first的输出 } } cout << endl;}
下面是主函数测试部分:
int main(){ //int modifValue = 100; //CircleList<int> circle1(0); //circle1.createList(0); //cout << circle1.getData(2) << endl; //读取数据测试(这里指定是5) //circle1.setData(3, modifValue); //修改数据测试(这里指定是3) //cout << circle1.getData(3) << endl; //circle1.outputList(circle1.Length()); //CircleList<int> circle2(0); //循环输出测试 //circle2.createList(0); //circle2.outputList(10); int InseValue = 100, delValue = 0; CircleList<int> circle3(0); //插入与删除节点测试 circle3.createList(0); circle3.outputList(circle3.Length()); circle3.Insert(3, InseValue); //数据插入操作 circle3.outputList(2 * circle3.Length()); //循环两遍输出 circle3.Remove(3, delValue); circle3.outputList(2 * circle3.Length()); system("pause"); return 0;}
运行的部分结果:最后也希望大家能够多加练习,更重要的是多做相关的练习,相信最终能熟练掌握的!
阅读全文
1 0
- 数据结构——循环链表模板类
- 数据结构——双向循环链表模板类
- [数据结构]循环链表(c++/类模板)用例JosephRing
- 数据结构之循环队列(顺序表存储)——C++模板类实现
- 数据结构—类模板实现链表
- 数据结构C#——循环链表
- 数据结构——单向循环链表
- 数据结构——循环链表
- 数据结构——循环链表
- 数据结构与算法—循环链表
- Linux C 数据结构—-循环链表
- 数据结构—链表-循环链表
- 循环链表模板类
- 数据结构——循环队列(顺序队列)模板类实现
- 数据结构——静态链表模板类实现
- 数据结构 循环链表
- 数据结构-循环链表
- 数据结构----循环链表
- 纯css3 实现3D轮播图
- 2.2.3
- 训练日记-26
- Oracle同义词创建及其作用,解决java中数据库报错的表或视图不存在
- 9月28日周四训练笔记
- 数据结构——循环链表模板类
- 2017年9月28日训练日记
- 2017-09-29-word-split.md
- 学生成绩检索系统
- [Linux C]多进程编程与进程间通信
- Maven2的配置文件settings.xml
- MySQL的那些千万不要去做的事情
- 单例模式
- 数据结构实验之链表九:双向链表