手写模板类 - 底层数组,有序。理论没错,简单测试过了,大家觉得有问题可以提一下
#pragma once
#include <iostream>
using namespace std;
template <typename T>
class MyList {
public :
MyList(int _size = 32); // 构造一个线性表,默认32位 数组底层,有序
~MyList();// 销毁线性表
void clearList(); // 清空线性表
bool listEmpty(); // 判空
int listLength(); // 线性表实际大小
int locateElem(T &elem); // 返回第一个满足elem的数组的元素位置
void travelList(); // 遍历数组
bool isIndexArr(int index); //判断index是否越界
void expend(); // 扩容
bool getElemPrior(T ¤t, int index ,T &proir); // 获取指定下标的前驱(上一个位置的值)
bool getElem(T &elem,int index); // 获取指定下标的值,返回获取的值
bool getElemNext(T ¤t, int index, T &next); // 获取指定下标的后继(下一个位置的值)
bool insertElem(T &elem, int index); // 向指定位置插入元素,如果线性表满,则扩从 N*2+1
bool deleteElem(T &elem, int index); // 删除指定位置元素,并返回一个被删除的值
private :
T *myList; // 线性表
int size; //线性表容量
int length; //线性表实际大小
};
template <typename T>
MyList<T>::MyList(int _size) {
size = _size;
myList = new T[_size];
clearList();
} // 构造一个线性表,默认32位 数组底层,有序
template <typename T>
MyList<T>::~MyList(){
delete []myList;
myList = NULL;
}// 销毁线性表
template <typename T>
void MyList<T>::clearList(){
length = 0;
} // 清空线性表
template <typename T>
bool MyList<T>::listEmpty(){
return 0 == length ? true : false;
} // 判空
template <typename T>
int MyList<T>::listLength(){
return length;
} // 线性表实际大小
template <typename T>
int MyList<T>::locateElem(T &elem){
for (int i = 0; i < length; i++) {
if (myList[i] == elem)
return i;
}
return -1;
} // 返回第一个满足elem的数组的元素位置
template <typename T>
void MyList<T>::travelList() {
if (listEmpty())
return;
for (int i = 0; i < length; i++)
cout << myList[i];
} // 遍历数组
template <typename T>
bool MyList<T>::isIndexArr(int index) {
return index >= length||index <0 ? true : false;
} //判断index是否越界
template <typename T>
void MyList<T>::expend() {
if (length < size)
return;
T *cacheList = myList;
myList = new T[size << 1 + 1];
for (int i = 0; i < length; i++)
myList[i] = cacheList[i];
delete[]cacheList;
cacheList = NULL;
} // 扩容
template <typename T>
bool MyList<T>::getElemPrior(T ¤t, int index, T &proir){
if (isIndexArr(index))
return false;
current = myList[index];
0 == index ? proir = NULL : proir = myList[index - 1];
return true;
} // 获取指定下标的前驱(上一个位置的值)
template <typename T>
bool MyList<T>::getElem(T &elem, int index){
if (isIndexArr(index))
return false;
elem = myList[index];
return true;
} // 获取指定下标的值,返回获取的值
template <typename T>
bool MyList<T>::getElemNext(T ¤t, int index, T &next){
if (isIndexArr(index))
return false;
current = myList[index];
index == length - 1 ? next = NULL : next = myList[index + 1];
return true;
} // 获取指定下标的后继(下一个位置的值)
template <typename T>
bool MyList<T>::insertElem(T &elem, int index){
if (index > length)
return false;
expend();
for (int i = size - 1; i > index; i--)
myList[i] = myList[i - 1];
myList[index] = elem;
length++;
return true;
} // 向指定位置插入元素, - 如果线性表满,则扩从 N*2+1
template <typename T>
bool MyList<T>::deleteElem(T &elem, int index){
if (isIndexArr(index))
return false;
elem = myList[index];
for (int i = index; i < length - 1; i++)
myList[i] = myList[i+1];
length--;
return true;
} // 删除指定位置元素,并返回一个被删除的值