C++链表类模板
来源:互联网 发布:java获取11位时间轴 编辑:程序博客网 时间:2024/06/06 19:01
记录自己写的一个链表类模板,两个头文件:一个是节点头文件Node.h,一个是链表头文件LinkList.h。
Node.h
#pragma once#include <iostream>template <typename T>class Node{public: void printNode(); T data; Node<T>* next;};template <typename T>void Node<T>::printNode(){ std::cout << data << std::endl;}
由于遍历函数中直接实现的节点类中的成员函数printNode,在具体的模板类实现中需要在模板类中重载输出运算符”<<”。
LinkList.h
#pragma once#include <iostream>#include "Node.h"using namespace std;template <typename T>class LinkList{public: LinkList(); ~LinkList(); void ClearLinkList(); //清空链表 bool LinkListEmpty(); //判空 int LinkListLength(); //得到表长 bool GetElem(int i, Node<T> *pNode); //得到i位置节点 int LocateElem(Node<T> *pNode); //定位节点 bool PriorElem(Node<T> *pCurrentNode, Node<T> *pPreNode); //获得指定元素前驱 bool NextElem(Node<T> *pCurrentNode, Node<T> *pNextNode); //获得指定元素后继 void ListTraverse(); //遍历 bool ListInsert(int i, Node<T> *pNode); //指定位置插入 bool ListDelete(int i, Node<T> *pNode); //指定位置删除 bool ListInsertHead(Node<T> *pNode); //头插 bool ListInsertTail(Node<T> *pNode); //尾插private: Node<T>* m_pList; int m_iLength;};template <typename T>LinkList<T>::LinkList(){ m_pList = new Node<T>; m_pList->next = NULL; m_iLength = 0;}template <typename T>LinkList<T>::~LinkList(){ ClearLinkList(); delete m_pList; m_pList = NULL;}template <typename T>void LinkList<T>::ClearLinkList(){ Node<T>* currentNode = m_pList->next; while (currentNode != NULL) { Node<T>* temp = currentNode->next; delete currentNode; currentNode = temp; } m_pList->next = NULL;}template <typename T>bool LinkList<T>::LinkListEmpty(){ return 0 == m_iLength;}template <typename T>int LinkList<T>::LinkListLength(){ return m_iLength;}template <typename T>bool LinkList<T>::ListInsertHead(Node<T> *pNode){ Node* temp = m_pList->next; Node* newNode = new Node<T>; if (newNode == NULL) { return false; } newNode->data = pNode->data; newNode->next = temp; m_pList->next = newNode; m_iLength++; return true;}template <typename T>bool LinkList<T>::ListInsertTail(Node<T> *pNode){ Node<T>* currentNode = m_pList; while (currentNode->next != NULL) { currentNode = currentNode->next; } Node<T>* newNode = new Node<T>; if (newNode == NULL) { return false; } newNode->data = pNode->data; newNode->next = NULL; currentNode->next = newNode; m_iLength++; return true;}template <typename T>bool LinkList<T>::ListInsert(int i, Node<T> *pNode){ if (i < 0 || i > m_iLength) { return false; } Node<T>* currentNode = m_pList; for (int k = 0; k < i; ++k) { currentNode = currentNode->next; } Node<T>* newNode = new Node<T>; if (newNode == NULL) { return false; } newNode->data = pNode->data; newNode->next = currentNode->next; currentNode->next = newNode; m_iLength++; return true;}template <typename T>bool LinkList<T>::ListDelete(int i, Node<T> *pNode){ if (i < 0 || i >= m_iLength) { return false; } Node<T>* currentNode = m_pList; Node<T>* currentNodeBefore = NULL; for (int k = 0; k <= i; ++k) { currentNodeBefore = currentNode; currentNode = currentNode->next; } currentNodeBefore->next = currentNode->next; pNode->data = currentNode->data; delete currentNode; currentNode = NULL; m_iLength--; return true;}template <typename T>bool LinkList<T>::GetElem(int i, Node<T> *pNode){ if (i < 0 || i >= m_iLength) { return false; } Node<T>* currentNode = m_pList; for (int k = 0; k <= i; ++k) { currentNode = currentNode->next; } pNode->data = currentNode->data; return true;}template <typename T>int LinkList<T>::LocateElem(Node<T> *pNode){ int count = 0; Node<T>* currentNode = m_pList; while (currentNode->next != NULL) { currentNode = currentNode->next; if (currentNode->data == pNode->data) return count; else count++; } return -1;}template <typename T>bool LinkList<T>::PriorElem(Node<T> *pCurrentNode, Node<T> *pPreNode){ Node<T>* currentNode = m_pList; Node<T>* tempNode = NULL; while (currentNode->next != NULL) { tempNode = currentNode; currentNode = currentNode->next; if (currentNode->data == pCurrentNode->data) { if (tempNode == m_pList) return false; pPreNode->data = tempNode->data; return true; } } return false;}template <typename T>bool LinkList<T>::NextElem(Node<T> *pCurrentNode, Node<T> *pNextNode){ Node<T>* currentNode = m_pList; while (currentNode->next != NULL) { currentNode = currentNode->next; if (currentNode->data == pCurrentNode->data) { if (currentNode->next == NULL) { return false; } pNextNode->data = currentNode->next->data; return true; } } return false;}template <typename T>void LinkList<T>::ListTraverse(){ Node<T>* currentNode = m_pList; while (currentNode->next != NULL) { currentNode = currentNode->next; currentNode->printNode(); }}
模板实例
这里放一个和顺序表http://blog.csdn.net/zilisen/article/details/72864306中一样的模板实例。
Person.h
#pragma once#include <string>#include <iostream>using namespace std;class Person{ friend ostream &operator<<(ostream &out, Person &person);public: string name; string phone; Person& operator =(Person &person); bool operator == (Person &person);};
Person.cpp
#include "Person.h"ostream &operator<<(ostream &out, Person &person){ out << person.name << "----------" << person.phone << endl; return out;}Person& Person::operator =(Person &person){ this->name = person.name; this->phone = person.phone; return *this;}bool Person::operator == (Person &person){ return (this->name == person.name && this->phone == person.phone);}
阅读全文
0 0
- C++-模板
- C++-模板
- C++:模板
- C++:模板
- C++:模板
- 模板 (C++)
- C ++ 模板
- C ++ 模板
- 【C++】模板
- c++----------模板
- C++--------------------------------------------模板
- c++--模板
- C++:模板
- 立此存照(8)[C++]循环链表类模板和双向链表类模板
- C++,链表类,链表模板类
- 【基础C&C++】模板
- 【c/c++】类模板
- 【C/C++】模板类
- HDU-5980-水题-二进制转换
- hashSet判断是否是同一对象
- theano records
- RAC重启遭遇ORA-01078、ORA-01565、ORA-17503、ORA-12547错误
- windows下GitHub的SSH
- C++链表类模板
- 前台参数杂乱,后台如何接收数据
- TabActivity简介及实例使用
- 设计模式——分析与感悟
- 【怎样写代码】小技巧 -- 关于方法中修饰形参的关键词
- Composer Update或Install速度慢的解决方案
- 基于单片机的简易数字电压表设计
- 直线和圆位置关系教案免费下载
- 基于HTML5 Canvas 实现弹出框