C++ 資料結構與演算法(二)線性表之單鏈表:寫的不足之處,望指教:)。
ListNode.h:
template<typename Type> class SingleList;template<typename T>class ListNode{//鏈表結點類public: ListNode():m_pnext(NULL) { } ListNode(const T item,ListNode<T>* next= NULL):m_data(item),m_pnext(next) { } ~ListNode() { m_pnext = NULL; }public: T GetData(); friend typename SingleList<T>;private: T m_data;//存放結點值的資料域 ListNode* m_pnext;//存放結點的直接後繼的地址(位置)的指標域(鏈域)};template<typename T>T ListNode<T>::GetData(){ return this->m_data;}
SingleList.h:
#include "ListNode.h"template<typename T> class SingleList{public: SingleList() { head = new ListNode<T>(); } ~SingleList() { EmptyList(); delete head; } public: void EmptyList();//清空鏈表 int Length();//獲得鏈表長度 ListNode<T>* Find(int n);//尋找第n個結點 bool Insert(T data,int n);//插入到鏈表的第n個位置 T Delete(int n);//刪除第n個資料 T GetData(int n);//擷取第n個資料 void Print(); private: ListNode<T>* head;};template<typename T>void SingleList<T>::EmptyList(){ ListNode<T>* pdel; while(head->m_pnext != NULL) { pdel = head->m_pnext; head->m_pnext = pdel->m_pnext; delete pdel; }}template<typename T>int SingleList<T>::Length(){ ListNode<T>* p = head->m_pnext; int count = 0; while(p != NULL) { count ++; p = p->m_pnext; } return count;}template<typename T>ListNode<T>* SingleList<T>::Find(int n){ if(n < 1) { cout << " 非法操作" << endl; return NULL; } ListNode<T>* p = head->m_pnext; for(int i = 0 ;i < n&&p; i ++) { p = p->m_pnext; } if(p == NULL) { cout << "n值 益處" << endl; return NULL; } return p;}template<typename T>bool SingleList<T>::Insert(T data, int n){ if(n < 0 || n > Length()) { cout <<"n 值 非法" << endl; return false; } ListNode<T>* p = head; ListNode<T>* pnewnode = new ListNode<T>(data,NULL); if(pnewnode == NULL) { cout << "建立新結點失敗" << endl; return false; } for(int i= 0 ;i < n &&p; i ++) { p = p->m_pnext; } if(p == NULL) { cout << "n 值非法" <<endl; return false; } pnewnode->m_pnext = p->m_pnext; p->m_pnext = pnewnode; return true;}template<typename T>T SingleList<T>::Delete(int n){ if(n < 0 || n > this->Length()) { cout <<"n值非法" << endl; return NULL; } ListNode<T>* p = head; ListNode<T>* pdel; for(int i =0 ;i< n&& p->m_pnext;i ++) { p = p->m_pnext; } if(p->m_pnext == NULL) { cout << "沒有找到" << endl; return NULL; } pdel = p->m_pnext; p->m_pnext = pdel->m_pnext; T data = pdel->m_data; delete pdel; return data;}template<typename T>T SingleList<T>::GetData(int n){ if(n < 0 || n > this->Length()) { cout <<"n值非法" << endl; return NULL; } ListNode<T>* p = head->m_pnext; for(int i =0 ;i <n&& p; i++) { p = p->m_pnext; } if(NULL == p) { cout <<"n值非法" << endl; return NULL; } return p->m_data;}template<typename T>void SingleList<T>::Print(){ ListNode<T>* p = head->m_pnext; cout << "head"; while(p) { cout << "-->" << p->m_data; p = p->m_pnext; } cout << "-->over" <<endl;}
test.cpp:
// test.cpp : 定義控制台應用程式的進入點。//#include "stdafx.h"#include "SingleList.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ SingleList<int> singlelist; for(int i = 0;i<15; i++) { singlelist.Insert(i*3,i); } singlelist.Print(); singlelist.Delete(1); singlelist.Print(); cout << singlelist.Length(); cin.get(); return 0;}
測試結果: