// //LinkList:完成链表的操作 //作者:CXW06023273 //时间:2010年1月5日13:59:43 // template <class DataType> struct Node { DataType info; Node<DataType> *next; }; template <class DataType> class CLinkList { public: CLinkList(); CLinkList(const CLinkList<DataType> & aplist); ~CLinkList(); CLinkList<DataType> & operator=(const CLinkList<DataType> & rlist); void insert(const DataType & element); /*返回list中的第一个元素并且这个当前位置被设为这个元素 如果list为空返回FALSE没有当前位置,否则返回TRUE */ bool first(DataType & listE1); /* 检索list中的下一个元素,并将该元素设置为当前位置 如果没有元素存在与这个位置,函数返回FALSE,当前位置为NULL 否则返回TRUE */ inline bool getNext(DataType & listE1); /* 如果查找的元素不存在返回FALSE,如果找到了这个元素 找到的元素将设置成当前位置,否则反之 */ bool find(const DataType & element); //和find()函数相似,只是返回查找到的元素 bool retrieve(DataType & element); /* 用newElement替换当前位置的元素,如果没有当前位置返回FALSE 没有元素被修改,否则返回TRUE */ bool replace(const DataType & newElement); /* 如果元素被找到返回TRUE,否则返回FALSE 如果找到元素将被设置成找到的元素,没有当前位置 在这个函数使用后 */ bool remove(DataType & element); /* 返回TRUE,如果list是空的,否则返回FALSE,当前位置无变化 */ bool isEmpty() const; void makeEmpty(); private: Node<DataType> *start; Node<DataType> *current; inline void deepCopy(const CLinkList<DataType> & original); }; #include <iostream> using namespace std; #include "LinkList.h" template <class DataType> CLinkList<DataType>::CLinkList() { start=NULL; current=NULL; } template <class DataType> CLinkList<DataType>::CLinkList(const CLinkList<DataType> & aplist) { deepCopy(aplist); } template <class DataType> CLinkList<DataType>::~CLinkList() { makeEmpty(); } template <class DataType> CLinkList<DataType> & CLinkList<DataType>::operator=(const CLinkList<DataType> & rlist) { if (this==&rlist) { return *this; } makeEmpty(); deepCopy(rlist); return *this; } template <class DataType> void CLinkList<DataType>::insert(const DataType & element) { current=NULL; Node<DataType> *newNode=new Node<DataType>; newNode->info=element; newNode->next=start; start=newNode; } template <class DataType> bool CLinkList<DataType>::first(DataType & listE1) { if (start==NULL) { return false; } current=start; listE1=start->info; return true; } template <class DataType> inline bool CLinkList<DataType>::getNext(DataType & listE1) { if (current==NULL) { return false; } if (current->next==NULL) { current=NULL; return false; } current=current->next; listE1=current->info; return true; } template <class DataType> bool CLinkList<DataType>::find(const DataType & element) { DataType item; if (!first(item)) { return false; } do { if (item==element) { return true; } } while(getNext(item)); return false; } template <class DataType> bool CLinkList<DataType>::retrieve(DataType & element) { if (!find(element)) { return false; } element=current->info; return true; } template <class DataType> bool CLinkList<DataType>::replace(const DataType & newElement) { if (current==NULL) { return false; } current->info=newElement; return true; } template <class DataType> bool CLinkList<DataType>::remove(DataType & element) { current=NULL; if (start==NULL) { return false; } Node<DataType> *ptr=start; if (ptr->info==element) { element=ptr->info; start=ptr->next; delete ptr; return true; } while(ptr->next!=NULL) { if (ptr->next->info==element) { Node<DataType> *tempPtr=ptr->next; element=tempPtr->info; ptr->next=tempPtr->next; delete tempPtr; return true; } ptr=ptr->next; } return false; } template <class DataType> bool CLinkList<DataType>::isEmpty() const { return start==NULL; } template <class DataType> void CLinkList<DataType>::makeEmpty() { while (start!=NULL) { current=start; start=start->next; delete current; } current=NULL; } template <class DataType> inline void CLinkList<DataType>::deepCopy(const CLinkList<DataType> & original) { start=NULL; current=NULL; if (original.start==NULL) { return; } start=new Node<DataType>; Node<DataType> *copyPtr=start; Node<DataType> *originalPtr=original.start; copyPtr->info=originalPtr->info; if (originalPtr==original.current) { current=copyPtr; } while (originalPtr->next!=NULL) { originalPtr=originalPtr->next; copyPtr->next=new Node<DataType>; copyPtr=copyPtr->next; copyPtr->info=originalPtr->info; if (originalPtr==original.current) { current=copyPtr; } } copyPtr->next=NULL; } #include "LinkList.cpp" void main() { int i=0; CLinkList<int> list; while(true) { cin>>i; if (i==0) { break; } list.insert(i); } list.first(i); cout<<i<<"/t"; while (list.getNext(i)) { cout<<i<<"/t"; } }