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