Slist:
#ifndef Slist_h_#defineSlist_h_#include<cassert>Template<typename t>structslist_node{T element; Slist_node*Next; Slist_node (): Element (), Next (0){} ExplicitSlist_node (Constt& elem): Element (Elem), Next (0){} ~slist_node () {next=0;}}; Template<typename t>classslist{typedef slist_node<t>*ptrn;Private: Slist_node<t>*Hb_head; inthb_size; Public: Slist (): Hb_head (Newslist_node<t>), Hb_size (0){} ~Slist (); BOOLEmpty ()Const{returnHb_size?false:true;} intSize ()Const{returnHb_size;} voidreverse (); T Value (intPosConst; voidPush_front (Constt&elem); T Pop_front (); voidPush_back (Constt&elem); T Pop_back (); voidInsert_after (Constt& Elem,intPOS); T Erase (intPOS); voidEraseintBeginintend); voidclear ();}; Template<typename t>Slist<t>::~Slist () {clear (); DeleteHb_head;} Template<typename t>voidSlist<t>:: Clear () {if(Hb_size! =0) Erase (1, hb_size);} Template<typename t>voidSlist<t>::erase (intBeginintend) { if(begin>hb_size | | end>hb_size | | begin<0|| Begin>end) cout<<"error:position out of range!"<<Endl; Else{ptrn ptr=Hb_head; PTRN prev=0; intI=0; while(i!=begin) {prev=ptr; PTR= ptr->Next; ++i; } while(i<=end) {ptrn PTM=ptr; PTR= ptr->Next; DeletePTM; --hb_size; ++i; } prev->next =ptr; }}template<typename t>T Slist<t>::erase (intPOS) {Assert (POS<=hb_size && pos!=0); Ptrn ptr=Hb_head; PTRN prev=0; intI=0; while(i!=POS) {prev=ptr; PTR= ptr->Next; ++i; } t T= ptr->element; Prev->next = ptr->Next; Deleteptr; --hb_size; returnT;} Template<typename t>voidSlist<t>::insert_after (Constt& Elem,intPOS) {ptrn ptr=Hb_head; intI=0; while(i!=POS) {ptr= ptr->Next; I++; } Slist_node<t>* pnew =NewSlist_node<t>; Pnew->element =Elem; Pnew->next = ptr->Next; PTR->next =pnew; ++Hb_size;} Template<typename t>voidSlist<t>::p Ush_front (Constt&elem) {Insert_after (Elem,0);} Template<typename t>voidSlist<t>::p Ush_back (Constt&elem) {Insert_after (elem,hb_size);} Template<typename t>T Slist<T>::p Op_front () {returnErase1);} Template<typename t>T Slist<T>::p op_back () {returnErase (hb_size);} Template<typename t>T Slist<t>::value (intPosConst{ptrn ptr=Hb_head; intI=0; while(i!=POS) {ptr=ptr->Next; I++; } returnPtr->element;} Template<typename t>voidSlist<t>:: Reverse () {ptrn Pbegin= hb_head->Next; Hb_head->next =0; Hb_size=0; Ptrn ptr=Pbegin; while(ptr!=0) {Push_front (PTR-element); PTRN PTM=ptr; PTR= ptr->Next; DeletePTM; }}#endif
Test:
#include <iostream>#include"s_list.h"using namespacestd;intMain () {Slist<int>slist; intnum =slist.size (); cout<<num<<Endl; Slist.push_back (2); for(intI=0; I<slist.size (); i++) cout<<slist.value (i+1) <<'-'; cout<<Endl; Slist.push_front (4); for(intI=0; I<slist.size (); i++) cout<<slist.value (i+1) <<'-'; cout<<Endl; Slist.insert_after (7,1); cout<<"size ="<< slist.size () <<Endl; for(intI=0; I<slist.size (); i++) cout<<slist.value (i+1) <<'-'; cout<<Endl; Slist.reverse (); cout<<"size ="<<slist.size () <<Endl; for(intI=0; I<slist.size (); i++) cout<<slist.value (i+1) <<'-'; cout<<Endl; Slist.clear (); cout<<"size ="<<slist.size () <<Endl; return 0;}
C + + single-linked list