数据结构之链表 (C++类模板实现)

来源:互联网 发布:windows双网卡配置种类 编辑:程序博客网 时间:2024/05/28 18:43

简述

    前面用c写的链表主要使用泛型指针(void *)存储数据的地址,索引到不同类型的数据,而用C++类模板实现后可以直接存储数据,编译器会根据定义好的数据类型动态分配空间。

实现

//链表节点template<class T>class LinkNode{public:T data;LinkNode<T> *next;};//链表template <class T>class LinkList{public://初始化LinkList();//指定位置插入元素void insert_LinkList(int pos, T val);//头部插入void Fush_Front(T val);//尾部插入void Fush_Back(T val);//指定位置删除void RemoveByPos_LinkList(int pos);//头删void Pop_Front();//尾删void Pop_Back();//获得链表大小int size_LinkList();//根据指定位置获得数据T data_LinkList(int index);//值删除void RemoveByVal(T val);//遍历链表void Show_LinkList(void(*MyPrint)(T val));//析构函数~LinkList();private:LinkNode<T> mHeader;int mSize;};//初始化template <class T>LinkList<T>::LinkList(){this->mHeader.next = NULL;this->mSize = 0;}//指定位置插入元素template <class T>void LinkList<T>::insert_LinkList(int pos, T val){if (pos < 0 || pos > this->mSize){pos = this->mSize;}//创建新节点LinkNode<T>* newnode = new LinkNode<T>;newnode->data = val;newnode->next = NULL;//辅助指针LinkNode<T>* current = &(this->mHeader);for (int i = 0; i < pos; i++){current = current->next;}//新节点入链表newnode->next = current->next;current->next = newnode;this->mSize++;}//头部插入template <class T>void LinkList<T>::Fush_Front(T val){insert_LinkList(0, val);}//尾部插入template <class T>void LinkList<T>::Fush_Back(T val){insert_LinkList(this->mSize, val);}//指定位置删除template <class T>void LinkList<T>::RemoveByPos_LinkList(int pos){if (this->mSize == 0){return;}if (pos < 0 || tpos > this->mSize){pos = this->mSize;}//找到被删除节点的前一个节点LinkNode<T>* current = &(this->mHeader);for (int i = 0; i < pos; i++){current = current->next;}//缓存被删除节点LinkNode<T>* pDel = current->next;//建立新的前后驱关系current->next = current->next->next;//释放被删除节点delete pDel;this->mSize--;}//头删template <class T>void LinkList<T>::Pop_Front(){if (this->mSize == 0){return;}RemoveByPos_LinkList(0);}//尾删template <class T>void LinkList<T>::Pop_Back(){if (this->mSize == 0){return;}RemoveByPos_LinkList(this->mSize - 1);}//获得链表大小template <class T>int LinkList<T>::size_LinkList(){return this->mSize;}//获得数据template <class T>T LinkList<T>::data_LinkList(int index){if (this->mSize == 0){return -1;}if (index < 0 || index >= this->mSize){return -1;}LinkNode<T>* current = &(this->mHeader);for (int i = 0; i < index; i++){current = current->next;}return current->data;}//值删除template <class T>void LinkList<T>::RemoveByVal(T val){if (this->mSize == 0){return;}//辅助指针变量LinkNode<T>* prev = &(this->mHeader);LinkNode<T>* current = prev->next;while (current != NULL){if (current->data == val){prev->next = current->next;delete current;this->mSize--;break;}prev = current;current = current->next;}}//遍历链表template <class T>void LinkList<T>::Show_LinkList(void(*MyPrint)(T val)){if (this->mSize == 0){return;}LinkNode<T>* current = this->mHeader.next;while (current != NULL){MyPrint(current->data);current = current->next;}}//析构函数template <class T>LinkList<T>::~LinkList(){cout << "调用析构函数" << endl;LinkNode<T>* current = this->mHeader.next;while (current != NULL){LinkNode<T>* pNext = current->next;delete current;current = pNext;}}