编写一维数组模板。可以无限扩展,任意数据类型,可以进行插入,删除,查找,排序等操作
#include<iostream> using std::cout; using std::cin; using std::endl; template <class T> class CTest { public: CTest(T *p,int a):n(a)//普通数据类型的构造函数 { arr = new T[n]; for (int i=0;i<n;i++) { *(arr + i) = *(p + i); } } CTest(const char* p)//字符类型的构造函数 { n = strlen(p) + 1; arr = new T[n]; strcpy_s(arr, n, p); } ~CTest() { delete[]arr; arr = NULL; } int sortD()//按大到小的顺序排序 { T temp; for (int i = 0; i < n; i++) { for (int j = i + 1; j<n;j++) { if (arr[j] > arr[i]) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } return 0; } int searchD(T t) { for (int i=0;i<n;i++) { if (t==*(arr+i)) { return i; } } return -1; } int insertD(T t,int x)//增加数据 参数:插入的数据 和插入的位置 { T* des = new T[++n]; if (n-x>=2) { for (int i =n; i>=0 ;i--) { if (i>x) { *(des + i) = *(arr + i - 1); } else if (i==x) { *(des + i) = t; } else { *(des + i) = *(arr + i); } } delete[]arr; arr = NULL; arr = new T[n]; copyD(arr, des); return 0; } else { return -1; } } int deleD(T t)//删除数据 { for (int i=0;i<n;i++) { if (*(arr+i)==t) { for (int j = i; j < n-1; j++) { *(arr + j) = *(arr + j + 1); } n--; return 0; } } return -1; } int copyD(T t1[], T t2[])//将t2拷贝到t1 { for (int i=0;i<n;i++) { t1[i] = t2[i]; } return 0; } void show() {//输出数组 for (int i = 0; i < n; i++) { cout<<*(arr+i)<<" " ; } cout << endl; } private: T *arr; int n; }; int main() { int a[5] = {1,5,6,7,2 }; const char *c = "145644"; //CTest<int> cint(a,5); CTest<char> cint(c); int flag = 1; int x; while (flag) { cout << "1 插入数据:" << endl; cout << "2 删除数据:" << endl; cout << "3 查找数据:" << endl; cout << "4 查看数据:" << endl; cout << "5 排序数据:" << endl; cout << "6 退出程序:" << endl; cout << "请输入你的操作码:" << endl; cin >> x; switch (x) { case 1: { char a ; int b; cout << "请输入要插入的数据" << endl; cin >> a; cout << "请输入要插入的位置" << endl; cin >> b; if (cint.insertD(a, b) == 0) { cout << "操作成功,返回主界面" << endl; } else { cout << "操作失败,请重试" << endl; } } break; case 2: { char a; cout << "请输入要删除的数据" << endl; cin >> a; if (cint.deleD(a) == 0) { cout << "操作成功,返回主界面" << endl; } else { cout << "操作失败,请重试" << endl; } } break; case 3: { char a; cout << "请输入要查询的数据" << endl; cin >> a; int b = cint.searchD(a); if ( b>= 0) { cout << "操作成功,数据下标为" <<b<< endl; } else { cout << "操作失败,请重试" << endl; } } break; case 4: { cout << "查询结果" << endl; cint.show(); } break; case 5: { cout << "大到小的排序结果" << endl; if (cint.sortD() == 0) { cint.show(); } else { cout << "操作失败,请重试" << endl; } } break; case 6: { flag = 0; } break; default: break; } } }
(自己测试int 类型和char基本没问题 。)
还有一些小问题没解决。比如我的类类型是char 那么增删的时候需要键入一个数据用char 接收。如果类型int 那么就又要用int类型去接收键入的数据代码需要来回改动。如果能让接收的变量类型和类类型自动保持一致或达到类型效果。那代码就不需要老是改动了。有没有知道的大佬教教我怎么修改?