C++类模板实现双链表
来源:互联网 发布:安卓推送联盟 知乎 编辑:程序博客网 时间:2024/06/05 02:00
----------------------------------List.h------------------------------------
#ifndef LIST_H_XX#define LIST_H_XXenum Error_code{rangeerror, underflow, overflow, success};template<class Node_entry>struct Node{//data memberNode_entry entry;Node<Node_entry> *next;Node<Node_entry> *back;//constructorNode();Node(Node_entry entry, Node<Node_entry> *next=NULL, Node<Node_entry>*back=NULL);};template<class List_entry>class List{public:List();~List();List<List_entry>& operator = ( List<List_entry> ©);bool empty() const;Error_code replace(int position, const List_entry&data);Error_code retrieve(int position, List_entry&x) const;Error_code insert(int position, const List_entry&x);Error_code remove(int position);int getsize() const;void print() const;protected://mutable 的作用是在const函数中也可以对其进行修改int count;mutable int current_position;mutable Node<List_entry> *current;void set_position(int position) const;};#include "List.cpp"#endif
------------------------------------------List.cpp-----------------------------------------------
#ifndef LIST_CPP_XX#define LIST_CPP_XX#include "List.h"#include <iostream>using namespace std;//结构体构造函数template <class Node_entry>Node<Node_entry>::Node(){back = next = NULL;}template <class Node_entry>Node<Node_entry>::Node(Node_entry entry, Node<Node_entry> *next/* =NULL */, Node<Node_entry>*back/* =NULL */){this->entry = entry;this->back = back;this->next = next;}//类实现函数,constructortemplate <class List_entry>List<List_entry>::List(){current_position = count = 0;current = NULL;}//destructortemplate <class List_entry>List<List_entry>::~List(){while(!empty())remove(0);}//insert a member//0<=position<=counttemplate <class List_entry>Error_code List<List_entry>::insert(int position, const List_entry &x){if(position<0 || position>count)return rangeerror;Node<List_entry>*previous, *following, *new_node;if(position == 0){//如果链表为空 if(count == 0) {previous = following = NULL;}else{set_position(0);following = current;previous = NULL;}}else{set_position(position-1);previous = current;following = current->next;}//完成插入操作new_node = new Node<List_entry>(x, following, previous);if(new_node == NULL) return overflow;if(following!=NULL) following->back = new_node;if(previous!=NULL) previous->next = new_node;//指针指向当前操作的位置current = new_node;current_position = position;count++;return success;}//0<=position<coounttemplate <class List_entry>Error_code List<List_entry>::remove(int position){Node<List_entry>* previous, *del_node, *following;if(empty())return underflow;if(position<0 || position>count)return rangeerror;set_position(position);if(position == 0){del_node = current;following = current->next;if(following!=NULL)following->back = NULL;delete del_node;count--;current = following;current_position = position;return success;}else{del_node = current;following = current->next;previous = current->back;//断开连接if(previous!=NULL)previous->next = following;if(following!=NULL)following->back = previous;//释放内存delete del_node;count--;//如果删除的结点在最后if(following == NULL){current_position = position-1;current = previous;}else{current = following;current_position = position;}}return success;}//current和current_position加了 mutable,所以这两个变量在 const函数里也能修改template <class List_entry>void List<List_entry>::set_position(int position) const{int i ;if(position>current_position){for(i=current_position; i<position; i++)current = current->next;}else{for(i=position; i<current_position; i++)current = current->back;}current_position = position;}//读取指定位置的数据//0<=position<counttemplate <class List_entry>Error_code List<List_entry>::retrieve(int position, List_entry&x) const{if(empty())return underflow;if(position<0 || position>count)return rangeerror;set_position(position);x = current->entry;return success;}//打印函数,注意不要在该函数中直接操作修改current 或调用 set_positiontemplate <class List_entry>void List<List_entry>::print() const{List_entry x;int num = getsize();for(int i=0; i<num; i++){retrieve(i, x);cout<<x;}cout<<endl;}//replace 函数//0<=position<counttemplate <class List_entry>Error_code List<List_entry>::replace(int position, const List_entry&data){if(empty())return underflow;if(position>count||position<0)return rangeerror;set_position(position);current->entry = data;return success;}template <class List_entry>int List<List_entry>::getsize() const{return count;}template <class List_entry>bool List<List_entry>::empty() const{return (count == 0);}//如果返回值为void 那么只能实现单重赋值,下面的方法可以实现多重赋值如first_list=second_list=third_list//另外要注意的是不能简单地赋值current和current_position,因为析构函数中会调用delete所以必须要在此处重新//分配内存,即调用insert函数template <class List_entry>List<List_entry>& List<List_entry>::operator=( List<List_entry> ©){int num = copy.getsize();List_entry data;for(int i=0; i<num; i++){copy.retrieve(i, data);this->insert(i, data);}return *this;}#endif
--------------------------------- 测试代码 -----------------------------------------------
#include <iostream>#include "List.h"using namespace std;int main(){List<char*> tt;tt.insert(0, "mmsa ");tt.insert(1, "jjkl ");tt.insert(1, "ooks "); tt.remove(0); tt.print(); tt.insert(0, "nmcnv "); tt.print(); List<char*> dd, mm; mm = dd = tt;dd.replace(0, "dddd "); dd.print();mm.print();system("pause");return 0;}
------------------------- 测试截图 ---------------------------
- 【C++】模板实现双链表和队列
- C++primer 实现queue的模板类
- 【C++】实现STL模板类string
- [C++] 模板类实现简单链表
- c++(模板类)实现顺序表
- C++:栈(stack)的模板类实现
- C/C++--模板类实现.h和.cpp分离
- 【c/c++】类模板
- 【C/C++】模板类
- C语言实现stack模板
- C语言实现函数模板
- [c++]栈模板的实现
- c++::用模板实现List
- 【c++】模板实现动态Vector
- C++类模板实现双链表
- C++类模板实现双链表
- 【c++】模板和模板类
- 14.c++-类模板不能让声明和实现分离
- Android 关于wifi管理的代码
- 解决ssh的"Write failed: Broken pipe"问题
- Linux xargs命令
- IBM iNotes脱机功能的一个常用使用场景
- [HGE]-源码分析-4 core里的demo和graphics(a)
- C++类模板实现双链表
- HashMap、HashTable、LinkedHashMap和TreeMap用法和区别
- myeclipse 编码总结
- Apache CXF 与Spring MVC 结合时出现 No Service have found错误
- Razor 语法(收集)
- Target runtime Apache Tomcat 7.0 is not defined解决方案
- 键盘上所有特殊符号的英文读法
- Android4.3 Bluetooth基本介绍
- Cocos2d-X tolua++ 使用