C++单链表实现
#include<iostream> using namespace std; template <class T> struct SLNode { T Data;///数据域 SLNode<T> * next;///指针域 SLNode():next(NULL) {} ///构造函数 SLNode(const T& item):Data(item),next(NULL) {} }; template <class T> class SLList { private: SLNode<T> * head;///表头指针 SLNode<T> * currptr;///当前位置指针 int length; public: SLList(void);///构造函数,构造只有一个哨位结点的空表 SLList(const T&);///构造函数 ~SLList(void);///析构函数 bool IsEmpty(void)const///const函数不能修改其数据成员 { return head->next==NULL; ///判空 } int GetLength(void)const { return length; };///返回表的长度 bool Find(int ,T&);///存取 int Search(const T&);///查找 bool Delete(int);///删除:按下标删除 bool Insert(int,const T&);///插入 void Print(void);///打印 }; ///构造函数 template <class T> SLList<T>::SLList() { head=currptr=new SLNode<T>();///创建哨位结点 length=0; } template <class T> SLList<T>::SLList(const T& item) { currptr=new SLNode<T>(item);///生成一个表结点 head=new SLNode<T>();///生成哨位结点 head->next=currptr; length=1; } ///析构函数 template <class T> SLList<T>::~SLList() { while(IsEmpty()) { currptr=head->next; head->next=currptr->next; delete currptr; } delete head; } ///存取 template <class T> bool SLList<T>::Find(int k,T& item) { if(k<0||k>length-1||IsEmpty()) { return false; } currptr=head; for(int i=0; i<k; ++i) { currptr=currptr->next; } item=currptr->Data; return true; } ///查找 template <class T> int SLList<T>::Search(const T& item) { currptr=head; for(int i=0; i<length; ++i) { if(currptr->Data==item) { return i; } else { currptr=currptr->next; } } return -1; } ///删除:删除第k个元素,成功返回true,否则返回false template <class T> bool SLList<T>::Delete(int k) { if(k<0||k>length-1||IsEmpty()) return false; currptr=head; for(int i=0; i<k-1; ++i) { currptr=currptr->next; } SLNode<T> *temp; temp=currptr->next; currptr->next=temp->next; delete temp; length--; return true; } ///插入:在第k个借点后插入一个值为item的节点 template <class T> bool SLList<T>::Insert(int k,const T& item) { if(k<0||k>length) { cout<<"please input right position!"<<endl; return false; } SLNode<T> * temp=new SLNode<T>(item); currptr=head; for(int i=0; i<k; i++) { currptr=currptr->next; } temp->next=currptr->next; currptr->next=temp; length++; } ///打印 template <class T> void SLList<T>::Print() { currptr=head->next; for(int i=0; i<length; ++i) { cout<<currptr->Data<<"->"; currptr=currptr->next; } cout<<endl; return; } ///实例 int main() { SLList<int> list(1); list.Print(); ///尾插,尾结点为第length个结点,在length结点后插 for(int i=5; i<=8; ++i) { list.Insert(list.GetLength(),i); } list.Print(); ///头插,哨位结点为0结点,在0结点后插 for(int i=2; i<=4; ++i) { list.Insert(0,i); } list.Print(); ///任意插:在中间结点后插入0 list.Insert(list.GetLength()/2,0); list.Print(); ///存取:将结点位置为3的data取出 int num; list.Find(3,num); cout<<"NUM3:>>"<<num<<endl; ///查询:查询data为0的结点位置 num=0; cout<<"POS0:>>"<<list.Search(num)<<endl; ///删除第一个结点,哨位结点为第0个结点 list.Delete(1); list.Print(); return 0; }