双向链表

    技术2022-05-20  40

    这个程序可真够复杂的,除了双链表,还有类模版和函数模版,尤其是输出的友元函数,还是运算符重载,还是函数模版,原来知道这个东西是要先声明两句的,得先声明一个类模版,再声明一个函数模版。

    可能还有些不完善,还需要加上对空指针的判断。 

     

     

    代码如下:

    #include <iostream> using namespace std; template <class Type> class DblList; template<class Type> ostream& operator << (ostream& os , DblList<Type>& onelist); template <class Type> class DblNode { friend class DblList<Type>; private: Type data; //数据 DblNode<Type> *lLink, *rLink; //指针 public: DblNode ( Type& value,DblNode<Type>* & left, DblNode<Type>*& right ) :data (value), lLink (left), rLink (right) { } DblNode ( Type& value ) : data (value),lLink (NULL), rLink (NULL) { } }; template <class Type> class DblList { public: friend ostream& operator <<<Type> (ostream& os , DblList<Type>& onelist); //声明List类为友元类 DblList ( Type uniqueVal ) ; // DblList () { first = current = NULL; } ~DblList ( ); int Length ( ) const; int IsEmpty ( ) { return first->rlink == first; } int Find ( const Type & target ); // Type getData ( ) const; void Firster ( ) { current = first; } int First ( ); int Next ( ); int Prior ( ); int operator ! ( ) { return current != NULL; } void Insert ( Type value ); int Remove (const Type & target ); int iInsert(int i, Type value); private: DblNode<Type> *first, *current; }; template <class Type> DblList<Type>::DblList ( Type uniqueVal ) { //双向循环链表的构造函数, 创建表头结点 first = new DblNode<Type> ( uniqueVal ); first->rLink = first->lLink = first; current = NULL; } template <class Type> DblList<Type>::~DblList ( ) { //析构函数 DblNode<Type> *q; while ( first->rLink != first ) { q = first->rLink; first->rLink = q->rLink; //将表头结点后第一个结点从链中摘下 delete q; //释放它 } //last = first; //修改表尾指针 // MakeEmpty ( ); delete first; //链表置空,再删去表头结点 first = current = NULL; //指针置空 } template <class Type> int DblList<Type>::Length ( ) const { //求双向循环链表的长度(不计表头结点) DblNode<Type> * p = first->rLink; int count = 0; while ( p != first ) { p = p->rLink; count++; } return count+1; } template <class Type> int DblList<Type>::First ( ) { if ( !IsEmpty ( ) ) { current = first->rLink; return 1; } current = NULL; return 0; } template <class Type> int DblList<Type>::Next ( ) { if ( current->rLink == first ) { current = NULL; return 0; } current = current->rLink; return 1; } template <class Type> int DblList<Type>::Prior ( ) { if ( current->lLink == first ) { current = NULL; return 0; } current = current->lLink; return 1; } template <class Type> int DblList<Type>::Find ( const Type & target ) { //在双向循环链表中搜索含target的结点, //搜索成功返回1,否则返回0。 DblNode<Type> *p = first->rLink; while ( p != first && p->data != target ) p = p->rLink; //循链搜索 if ( p != first ) { current = p; return 1; } return 0; } template <class Type> void DblList<Type>::Insert ( Type value ) { if ( current == NULL ) //空表情形 current = first->rLink = new DblNode<Type> ( value, first, first ); else { //非空表情形 current->rLink =new DblNode<Type> ( value, current, first ); current = current->rLink; } current->rLink->lLink = current; } template <class Type> int DblList<Type>::iInsert(int i, Type value) { // 在第i个位置插入元素,成功返回1,失败返回0; if(i <= 0) return 0; else if(i > Length()) return 0; else { if(i == 1) { DblNode<Type> *p = new DblNode<Type>(value,current,first); first->lLink = p; current->rLink = p; first = p; } else { DblNode<Type> *temp = first; for(int j = 1; j < i; j++) temp = temp->rLink; DblNode<Type> *p = new DblNode<Type>(value,temp->lLink,temp); temp->lLink->rLink = p; temp->lLink = p; } return 1; } } template <class Type> int DblList<Type>::Remove ( const Type & target) { /* if ( current != NULL ) { DblNode<Type>* temp = current; current = current->rLink; current->lLink = temp->lLink; temp->lLink->rLink = current; delete temp; if ( current == first ) if ( IsEmpty ( ) ) current = NULL; else current = current->rLink; } */ DblNode<Type>* temp = first; if( temp == NULL) return 0; else { if(Find( target) == 1) { while(temp->data != target) { temp = temp->rLink; } if(temp != first && temp != current) { temp->lLink->rLink = temp->rLink; temp->rLink->lLink = temp->lLink; } else if(temp == first) { first = temp->rLink; current->rLink = temp->rLink; temp->rLink->lLink = current; } else if(temp == current) { current = current->lLink; current->rLink = first; } delete temp; return 1; } else return 0; } } template <class Type> ostream& operator <<(ostream& os , DblList<Type>& onelist) { DblNode<Type>* p = onelist.first; // os << p->data << " "; // p = p ->rLink; if ( p == NULL ) os << "It is empty"; else while ( p->rLink != onelist.first ) { os << p->data << " " ; p = p->rLink; //if(p->rLink == onelist.first) //p = NULL; } os << p->data << " "; return os; } int main() { DblList<double> b(3.2); //if(b.Insert(5.2) == 0) // cout << "fail " << endl; b.Insert(6.4); //b.Insert(7.8); b.Insert(9.3); b.Insert(10.8); cout << "original: " << endl; cout << b << endl; cout << "length: " << b.Length() << endl; // b.Remove(2.5); b.iInsert(3,7.8); if(b.Find(2.5) == 1) cout << "ture " << endl; else cout << "false" << endl; cout << b << endl; system("pause"); return 0; }  


    最新回复(0)