双向链表基础操作C++实现
2016-10-11 15:39
239 查看
Node.h:
template <class T> struct Node { T val; Node<T>* next; Node<T>* prev; Node(T nVal) { val = nVal; next =prev= nullptr; } Node(void){} };
#include "Node.h" #include <iostream> using namespace std; template <class> class LinkList { int size; public: Node<T>* head; Node<T>* tail; LinkList(void) { head = tail = nullptr; size = 0; } ~LinkList(void){ Clear(); } void AddBack(T val) { Node<T>* pNode = new Node<T>(val); if (head == nullptr) { head = tail = pNode; } else { tail->next = pNode; pNode->prev = tail; tail = pNode; } size++; } void AddFront(T val) { Node<T>* pNode = new Node<T>(val); if (head == nullptr) { head = tail = pNode; } else { head->prev = pNode; pNode->next = head; head = pNode; } size++; } bool insertAt(int pos, T val) { Node<T>* pNode = nullptr; if (pos<0 || pos>size) { cout << "out of range" << endl; return false; } pNode = new Node<T>(val); if (pos == 0) AddFront(val); else if (pos = size - 1) AddBack(val); else { Node<T>* prevNode = GetPointerAt(pos - 1); pNode->next = prevNode->next; pNode->prev = prevNode; preNode->next->prev = pNode; prevNode->next = pNode; } size++; return true; } bool RemoveAt(int pos) { Node<T>* pNode = nullptr; if (size == 0) { cout << "list is empty" << endl; return false; } if (pos<0 || pos>size - 1) { cout << "out of range" << endl; return false; } if (size == 1) Clear(); else { if (pos == 0) { pNode = head; head = head->next; head->prev = nullptr; delete pNode; } else { Node<T>* prevNode = GetPointerAt(pos - 1); pNode = prevNode->next; prevNode->next = pNode->next; pNode->next->prev = prevNode; delete pNode; if (pos == size - 1) tail = prevNode; } } } bool RemoveBack() { return RemoveAt(size - 1); } bool RemoveFront() { return RemoveAt(0); } int Find(T val) { int index = 0; Node<T>* ip = head; while (ip != nullptr) { if (ip->val == val) return index; ip = ip->next; index++; } return -1; } bool IsEmpty() { return size == 0 ? true : false; } void Clear() { while (head != nullptr) { Node<T>* tmp = head->next; delete head; head = tmp; } tail = nullptr; size = 0; } private: Node<T>* GetPointerAt(int pos) { Node<T>* pNode = nullptr; if (pos<0 || pos>size - 1) cout << "out of range" << endl; else { pNode = head; for (int i = 1; i <= pos; i++) pNode = pNode->next; } return pNode; } };