1. 程式人生 > >c++ 雙向連結串列操作總結

c++ 雙向連結串列操作總結

第一、包含DoubleLinkNode 模板類和DoubleLinkList 模板類 

  

#pragma once
#include<iostream>
using namespace std;

template <typename T> class DoubleLinkList;//這裡必須宣告

template<typename T> class DoubleLinkNode {
public:
    T getData() {
        return m_data;
    }
private:    
    DoubleLinkNode() :m_pprior(NULL), m_pnext(NULL) {}
    DoubleLinkNode(
const T item, DoubleLinkNode<T>* prior, DoubleLinkNode<T>* pnext) :m_data(item), m_pprior(prior), m_pnext(pnext) {} ~DoubleLinkNode() { m_pprior = NULL; m_pnext = NULL; } friend class DoubleLinkList<T>; DoubleLinkNode* m_pprior; DoubleLinkNode
* m_pnext; T m_data; }; template <typename T> class DoubleLinkList { public: DoubleLinkList() { head = new DoubleLinkNode<T>(); } ~DoubleLinkList() { delete head; } void cleanDoubleLink(); bool insertNode(T data); bool insertNode(T data,int
n); void printAll(); bool deleteNode(T data); DoubleLinkNode<T>* findNode(int n); DoubleLinkNode<T>* findData(T data); bool deleteNodeByIndex(int i); T getData(int i); private: friend class DoubleLinkNode<T>; DoubleLinkNode<T> *head; }; template <typename T> void DoubleLinkList<T>::cleanDoubleLink() { DoubleLinkNode<T> *pmove = head->m_pnext,*pdel; while (pmove != NULL) { pdel = pmove; pmove = pmove->m_pnext; delete pdel; } head->m_pnext = NULL; } template<typename T> bool DoubleLinkList<T>::insertNode(T data) { DoubleLinkNode<T> *pmove = head; while (pmove->m_pnext!=NULL) { pmove = pmove->m_pnext; } DoubleLinkNode<T> *newNode = new DoubleLinkNode<T>(data,pmove,NULL); pmove->m_pnext = newNode; return true; } template<typename T> bool DoubleLinkList<T>::insertNode(T item,int n) { DoubleLinkNode<T> *pmove = head; for (int i = 1; i < n; i++) { pmove = pmove->m_pnext; if (pmove==NULL && i<n-1) { cout << "超出連結串列長度" << endl; return false; } } DoubleLinkNode<T> *newNode = new DoubleLinkNode<T>(); newNode->m_data = item; newNode->m_pnext = pmove->m_pnext; newNode->m_pprior = pmove->m_pprior; if (pmove->m_pnext!=NULL) { pmove->m_pnext->m_pprior = newNode; } pmove->m_pnext = newNode; return true; } template<typename T> void DoubleLinkList<T>::printAll() { DoubleLinkNode<T>* pmove = head->m_pnext; while (pmove!=NULL) { cout << pmove->m_data << " "; pmove = pmove->m_pnext; } cout << endl; } template<typename T> bool DoubleLinkList<T>::deleteNode(T item) { DoubleLinkNode<T>* pmove = head; while (pmove->m_pnext!=NULL) { if (pmove->m_data==item) { break; } pmove = pmove->m_pnext; } if (pmove==NULL) { cout << "沒有找到該item" << endl; return false; } pmove->m_pprior->m_pnext = pmove->m_pnext; if (pmove->m_pnext!=NULL) { pmove->m_pnext->m_pprior = pmove->m_pprior; } delete pmove; return true; } template<typename T> DoubleLinkNode<T>* DoubleLinkList<T>::findNode(int n) { if (n<1) { cout << "指定位置無效" << endl; exit(1); } DoubleLinkNode<T>* pmove = head; for (int i = 1; i <= n; i++) { pmove = pmove->m_pnext; if (pmove==NULL) { cout << "指定節點不存在!" << endl; exit(1); } } return pmove; } template<typename T> DoubleLinkNode<T>* DoubleLinkList<T>::findData(T item) { DoubleLinkNode<T>* pmove = head; while (pmove->m_pnext != NULL) { pmove = pmove->m_pnext; if (pmove == NULL) { cout << "沒有找到所查節點" << endl; exit(1); } if (pmove->m_data == item) { break; } return pmove; } } template<typename T> bool DoubleLinkList<T>::deleteNodeByIndex(int n) { DoubleLinkNode<T>*pmove = head->m_pnext; for (int i = 1; i < n; i++) { if (pmove == NULL && i < (n - 1)) { cout << "沒有找到該位置,刪除失敗" << endl; return false; } pmove = pmove->m_pnext; } if (pmove->m_pnext!=NULL) { pmove->m_pprior->m_pnext = pmove->m_pnext; pmove->m_pnext->m_pprior = pmove->m_pprior; } else { pmove->m_pprior->m_pnext = NULL; } delete pmove; return true; } template<typename T> T DoubleLinkList<T>::getData(int n) { DoubleLinkNode<T>* pmove = head->m_pnext; for (int i = 1; i < n; i++) { if (pmove==NULL && i<(n-1)) { cout << "沒有找到" << endl; exit(1); } pmove = pmove->m_pnext; } if (pmove==NULL) { cout << "節點不存在" << endl; } return pmove->getData(); }