template<class ElemType> struct LinkNode { ElemType data,num; LinkNode<ElemType> *next; LinkNode(LinkNode<ElemType> *ptr = NULL){next = ptr;} LinkNode(const ElemType &item, LinkNode<ElemType> *ptr = NULL) { next = ptr; data = item; num = 0; } };
template<class ElemType> class LinkList { private: LinkNode<ElemType> *head; LinkNode<ElemType> *tail; public: LinkList(){head = new LinkNode<ElemType>; tail = head;} LinkList(const ElemType &item){head = new LinkNode<ElemType>(item); tail = head;} LinkList(LinkList<ElemType> &List); ~LinkList(){ListDestroy();} LinkList<ElemType>& operator=(LinkList<ElemType> &List); void ListDestroy(); void ListClear(); int ListLength() const; bool ListEmpty() const; bool InsFirst(ElemType e); bool InsEnd(ElemType e); LinkNode<ElemType>* GetHead() const{return head;} LinkNode<ElemType>* GetTail() const{return tail;} void SetHead(LinkNode<ElemType> *p); void SetTail(LinkNode<ElemType> *p); ElemType GetElem(int pos); bool ListInsert(int pos,ElemType e); bool DelFirst(); void CreateList_Head(int n, ElemType *A); void CreateList_Tail(int n, ElemType *A); ElemType ListDelete(int pos); bool compare(const LinkList<ElemType> &b); bool LocateElem(const ElemType &e, LinkNode<ElemType> *pos); bool NextElem(LinkNode<ElemType> *p, ElemType &e); bool ListTraverse() const; };
template<class ElemType> LinkList<ElemType>::LinkList(LinkList<ElemType> &List){ this->head = new LinkNode<ElemType>(List.head->data); LinkNode<ElemType> *p1 = this->head,*p2 = List.head; while(p2->next) { p1->next = new LinkNode<ElemType>(p2->next->data); p1 = p1->next; p2 = p2->next; } this->tail = p1; }
template<class ElemType> void LinkList<ElemType>::ListDestroy() { LinkNode<ElemType> *p = head, *t = p->next; while(p!=head) { delete p; p = t; if(p) t = p->next; } }
template<class ElemType> LinkList<ElemType>& LinkList<ElemType>::operator=(LinkList<ElemType> &List) { this->head = new LinkNode<ElemType>(List.head->data); LinkNode<ElemType> *p1 = this->head,*p2 = List.head; while(p2->next) { p1->next = new LinkNode<ElemType>(p2->next->data); p1 = p1->next; p2 = p2->next; } tail = p1; return *this; }
template<class ElemType> void LinkList<ElemType>::ListClear() { ListDestroy(head->next); tail = head; }
template<class ElemType> int LinkList<ElemType>::ListLength() const { int length = 0; LinkNode<ElemType> *p = head; while(p->next) { p = p->next; length++; } return length; }
template<class ElemType> bool LinkList<ElemType>::ListEmpty() const { return head->next; }
template<class ElemType> bool LinkList<ElemType>::InsFirst(ElemType e) { LinkNode<ElemType> *t = new LinkNode<ElemType>(e); t->next = head->next; head->next = t; return true; }
template<class ElemType> bool LinkList<ElemType>::InsEnd(ElemType e) { LinkNode<ElemType> *t = new LinkNode<ElemType>(e); tail->next = t; tail = t; tail->next = head; return true; }
template<class ElemType> void LinkList<ElemType>::SetHead(LinkNode<ElemType> *p) { head = p; }
template<class ElemType> void LinkList<ElemType>::SetTail(LinkNode<ElemType> *p) { tail = p; }
template<class ElemType> ElemType LinkList<ElemType>::GetElem(int pos) { if(pos < 1) return head->data; int num = 0; LinkNode<ElemType> *p = head; while(p->next) { num++; p = p->next; if(num == pos) return p->data; } return head->data; }
template<class ElemType> bool LinkList<ElemType>::ListInsert(int pos,ElemType e) { if(pos < 1) return false; int num = 0; LinkNode<ElemType> *p = head; LinkNode<ElemType> *t = new LinkNode<ElemType>(e); while(p->next) {
num++; if(num == pos) { t->next = p->next; p->next = t; return true; } p = p->next; } return false; }
template<class ElemType> bool LinkList<ElemType>::DelFirst() { if(!(head->next)) return false; LinkNode<ElemType> *t = head->next; head->next = t->next; delete t; if(!head->next) tail = head; return true; }
template<class ElemType> void LinkList<ElemType>::CreateList_Head(int n, ElemType *A) { int m = n; while(n) { InsFirst(*(A+(m-n))); n--; } }
template<class ElemType> void LinkList<ElemType>::CreateList_Tail(int n, ElemType *A) { int m = n; while(n) { InsEnd(*(A+(m-n))); n--; } }
template<class ElemType> ElemType LinkList<ElemType>::ListDelete(int pos) { LinkNode<ElemType> *p = head, *t; while(--pos) p = p->next; t = p->next; p->next = t->next; if(!p->next) tail = p; ElemType res = t->data; delete t; return res; }
template<class ElemType> bool LinkList<ElemType>::compare(const LinkList<ElemType> &b) { LinkNode<ElemType> *t = b.GetHead(), *p = head; while(p->next || t->next) { if(p->next->data != t->next->data) return false; p = p->next; t = t->next; } return true; }
template<class ElemType> bool LinkList<ElemType>::NextElem(LinkNode<ElemType> *p, ElemType &e) { if(p->next) e = p->next->data; else return false; return true; }
template<class ElemType> bool LinkList<ElemType>::ListTraverse() const { LinkNode<ElemType> *p = head; while(p->next != head) { p = p->next; cout<<'('<<p->num<<','<<p->data<<')'; if(p->next != head) cout<<"->"; } cout<<endl; return 1; }
|