⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list_test.h

📁 数据结构与算法设计学习得素材
💻 H
字号:
//--------------------------------------------------------------------------------
/*
    文件名:List_Test_new.h
    目标:模板链表容器及其运算的测试类
*/
#ifndef LIST_TEST_H_
#define LIST_TEST_H_
//--------------------------------------------------------------------------------

#include <iostream>
#include <list>
#include "List_Input.h"
using namespace std;
//--------------------------------------------------------------------------------
// 实际的模板链表测试类

template<class T>
class ListTest
{
   private:
      // 空链表
      list<T> L;
	  list<T> Lcopy;
      // 链表迭代器
	  list<T>::reverse_iterator itrev;
      // 选择号及插入、删除数据
      int Selected;
      int pos,pos_last;
      T value;
      int num;
   public:
      // 构造器:初始化空链表
      ListTest(List_DATA<T> vinfo);
	  // 复制链表
	  list<T> CopyList() {  list<T> Lcpy(L);
                            cout << "已复制一个链表Lcpy!" << endl;
						    return Lcpy;  }
      // 选择功能号
      int SelectNo();
      // 置链表迭代器的指向
      list<T>::iterator SetIterator(int pos);
      // 访问链表
      void print_L();
      // 执行选择号的功能
      void do_operation(int Selected);
};
//--------------------------------------------------------------------------------
// 实现

template<class T>
ListTest<T>::ListTest(List_DATA<T> vinfo)
{
   for(int i=0; i<vinfo.n; i++)
      L.push_back(vinfo.arr[i]);
}

template<class T>
int ListTest<T>::SelectNo()
{
    cout << "**********链表容器主菜单***********" << endl;
    cout << "       1  插入一个元素" << endl;
    cout << "       2  插入多个元素" << endl;
    cout << "       3  删除一个元素" << endl;
    cout << "       4  删除多个元素" << endl;
    cout << "       5  逆向显示链表" << endl;
    cout << "       6  清除链表指定值的结点" << endl;
    cout << "       7  复制链表" << endl;
    cout << "       8  并入链表" << endl;
    cout << "***********************************" << endl;
    cout << "       输入选择号:";
    cin >> Selected;
    return Selected;
}

template<class T>
void ListTest<T>::do_operation(int Selected)
{
    switch (Selected) {
       case 1:      // 插入操作
          cout << "输入插入位置和插入数据:pos value = ";
          cin >> pos >> value;
          L.insert(SetIterator(pos),value);
          print_L();
          break;
       case 2:      // 多插入操作
          cout << "输入插入位置、插入数据和个数:pos value num = ";
          cin >> pos >> value >> num;
          L.insert(SetIterator(pos),num,value);
          print_L();
          break;
       case 3:     // 删除操作
          cout << "输入删除位置:pos = ";
          cin >> pos;
		  if(pos<0 || (size_t)pos>=L.size()) 
			  cout << "删除位置错!" << endl;
          else 
			  L.erase(SetIterator(pos));
          print_L();
          break;
       case 4:     // 多删除操作
          cout << "输入删除位置1和位置2:pos pos_last = ";
          cin >> pos >> pos_last;
          L.erase(SetIterator(pos),SetIterator(pos_last));
          print_L();
          break;
       case 5:    // 逆向显示链表操作
          for(itrev=L.rbegin(); itrev!=L.rend(); itrev++)
             cout << *itrev << " ";
          cout << endl;
          break;
       case 6:    // 清除链表容器中指定值的所有结点
          cout << "输入清除数据value:";
          cin >> value;
		  L.remove(value); 
          print_L();
          break;
       case 7:    // 复制操作
		  Lcopy=CopyList();
          break;
       case 8:
          /*
	         void merge(list<T, Allocator>& x); 并入操作的成员函数说明如下:
             使用运算符< 并入一个链表 x 的元素到自身。如果自身有序,并入后仍保持有序。
		     对于两链表中相等的元素,自身元素总在 x 元素之前。并入函数使得 x 变为空。
          */
		  cout << "是否将复制的链表Lcpy并入当前链表(y/n)?"; getchar();
		  char b=getchar();
          if(b=='y' || b=='Y') {
			  L.merge(Lcopy);
              print_L();
		  }
          break;
    }
}

template<class T>
list<T>::iterator ListTest<T>::SetIterator(int pos)
{
   int i=0;
   list<T>::iterator it;
   if((size_t)pos>=L.size()) it=L.end();
   else {
	  it = L.begin();
	  for(i=0; i<pos; i++) ++it;
   }
   return it;   
}

template<class T>
void ListTest<T>::print_L()
{
   list<T>::iterator it;
   for(it=L.begin(); it!=L.end(); it++)
      cout << *it << "  ";
   cout << endl;
}
#endif


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -