?? p77_79.cpp
字號:
#include <stdio.h> #include <iostream.h> template <class Type> class List; //前視的類定義 template <class Type> class ListNode { //鏈表結點類的定義 friend class List<Type>; //List類作為友元類定義 public: ListNode ( ); //不給數據的構造函數 ListNode ( const Type& item ); //給數據的構造函數 ListNode ( const Type& item, ListNode<Type>* next ); ListNode<Type> *NextNode ( ) { return link; } //給出當前結點的下一個結點地址 void InsertAfter ( ListNode<Type> *p ); //當前結點插入 ListNode<Type> *GetNode ( const Type& item, ListNode<Type> *next ); //建立一個新結點 ListNode<Type> *RemoveAfter ( ); //刪除當前結點的下一結點 private: Type data; //數據域 ListNode<Type> *link; //鏈指針域 }; template <class Type> class List { //單鏈表類定義 public: List ( ) { last =first = new ListNode<Type> ( ); } //構造函數, 建立一個空鏈表 ~List ( ); //析構函數 void MakeEmpty ( ); //將鏈表置為空表 int Length ( ) const; //計算鏈表的長度 ListNode<Type> *GetNode ( const Type& item, ListNode<Type> *next ); //建立一個新結點 ListNode<Type> *FindValue ( Type value ); //在鏈表中搜索含數據value的結點 ListNode<Type> *FindPosition ( int i ); //搜索鏈表中第i個元素的地址 int Insert ( Type value, int i ); //將新元素value插入在鏈表中第i個位置 Type *Remove ( int i ); //將鏈表中的第i個元素刪去 Type *Get ( int i ); //取出鏈表中第i個元素 void Print(); private: ListNode<Type> *first, *last; //鏈表的表頭指針, 表尾指針 }; template <class Type> void ListNode<Type>::ListNode ( ) : link (NULL) { } //構造函數, 僅初始化指針成員。 template <class Type> void ListNode<Type>::ListNode ( const Type& item ) : data (item), link (NULL) { } //構造函數, 初始化數據與指針成員。 template <class Type> void ListNode<Type>::ListNode ( const Type& item, ListNode<Type>* next ) : data (item), link (next) { } template <class Type> void ListNode<Type>::InsertAfter ( ListNode<Type> *p ) { //將p所指示的結點鏈接成為當前結點(*this)的后繼結點。 p->link = link; link = p; } template <class Type> ListNode<Type>* List<Type>::GetNode ( const Type& item, ListNode<Type> * next ){ //以數據成員item和指針next為參數, 建立一個新結點, 函數返回新結點地址。 ListNode<Type> *newnode = new ListNode<Type> ( item, next ); return newnode; } template <class Type> ListNode<Type> *ListNode<Type>::RemoveAfter ( ) { //從鏈中摘下當前結點的下一結點, 并為刪除它而返回其地址。 ListNode<Type> *tempptr = link; //保存要被刪除結點的地址 if ( link == NULL ) return NULL; //當前結點無后繼, 返回NULL link = tempptr->link; //將被刪結點從鏈中摘下 return tempptr; } template <class Type> List<Type>::~List ( ) { MakeEmpty ( ); delete first; first = last = NULL; } //析構函數 template <class Type> void List<Type>::MakeEmpty ( ) { //將鏈表置為空表 ListNode<Type> *q; while ( first->link != NULL ) { //當鏈不空時, 刪去鏈中所有結點 q = first->link; first->link = q->link; delete q; //循鏈逐個刪除,保留一個表頭結點 } last = first; //表尾指針指向表頭結點 } template <class Type> int List<Type>::Length ( ) const { //計算帶表頭結點的單鏈表的長度 ListNode<Type> *p = first->link; int count = 0; while ( p != NULL ) { p = p->link; count++; } //循鏈掃描, 尋找鏈尾 return count; } template <class Type> ListNode<Type> *List <Type>::FindValue ( Type value ) { //在單鏈表中搜索含數據value的結點, 搜索成功時, 函數返回該結點地址; 否則返回NULL值。 ListNode<Type> *p = first->link; while ( p != NULL && p->data != value ) p = p->link; //循鏈找含k結點 return p; } template <class Type> ListNode<Type> *List<Type>::FindPosition ( int i ) { //定位函數。函數返回鏈表中第i個元素的地址。若i<-1或i超出表中結點個數,則返回NULL。 if ( i < -1 ) return NULL; // i值不合理 if ( i == -1 ) return first; // i = -1時函數返回表頭結點地址 ListNode<Type> *p = first->link; int j = 0; //檢測指針p指向表中第一個結點 while ( p != NULL && j < i ) { p = p->link; j = j++; } //尋找第i個結點的地址 return p; //函數返回第i個結點地址, 若返回NULL, 表示i值太大 } template <class Type> int List<Type>::Insert ( Type value, int i ) { //將新元素value插入在鏈表中第i個位置。 ListNode<Type> *p = FindPosition ( i-1 ); //定位第i-1個元素 (i ( 0) if ( p == NULL ) return 0; //參數i的值不合理,函數返回0 ListNode<Type> *newnode = GetNode ( value, p->link ); //創建含value的結點 if ( p->link == NULL ) last = newnode; p->link = newnode; //插入成功,函數返回1 return 1; } template <class Type> Type *List<Type>::Remove ( int i ) { //將鏈表中的第i個元素刪去, 通過函數返回該元素。若i不合理, 則返回NULL。 ListNode<Type> *p = FindPosition (i-1), *q; // p定位于第i-1個元素 if ( p == NULL || p->link == NULL ) return NULL; // i的值不合理或空表,返回NULL q = p->link; p->link = q->link; // q指向被刪結點,重新拉鏈 Type value = q->data; //取出被刪結點中的數據值 if ( q == last ) last = p; //刪表尾結點時, 表尾指針修改 delete q; return &value; } template <class Type> Type *List<Type>::Get ( int i ) { //取出鏈表中第i個元素。 ListNode<Type> *p = FindPosition ( i ); //定位于第i個元素 if ( p == NULL || p == first ) return NULL; //空表或參數i的值不合理 else return & p->data; } template < class Type > void List<Type> :: Print() { int i = 0; Type *p = Get (i); while ( p != NULL ) { cout << *p << " " ; p = Get ( ++i ); } if ( i == 0 ) cout << " empty!!!! "; cout << endl; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -