📄 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 + -