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; }
测试结果: