C++顺序表
1 #include<iostream> 2 3 using namespace std; 4 5 int maxSize = 100; 6 7 // 定义 8 template <class T> 9 class SqListClass 10 { 11 private: 12 T *data; // 存放顺序表中的元素 13 int length; // 存放顺序表的长度 14 15 public: 16 SqListClass(); // 构造函数 17 ~SqListClass(); // 析构函数 18 void CreateList(T a[], int n); // 由a数组中的元素建造顺序表 19 void DispList(); // 输出顺序表L中的所有元素 20 int ListLength(); // 求顺序表的长度 21 bool GetElem(int i, T &e); // 求顺序表中某序列号的元素值 22 int LocateElem(T e); // 按元素查找其第一个序号位置 23 bool ListInsert(int i, T e); // 在位置i插入数据元素e 24 bool ListDelete(int i); // 在位置i删除数据元素 25 void ReverseList(SqListClass<T> &L); // 翻转顺序表 26 }; 27 28 // 线性表的初始化 29 template<class T> 30 SqListClass<T>::SqListClass() // 构造函数 31 { 32 data = new T[maxSize]; 33 length = 0; 34 } 35 36 // 线性表的销毁 37 template<class T> 38 SqListClass<T>::~SqListClass() // 析构函数 39 { 40 delete [] data; 41 } 42 43 // 实现 44 45 // 线性表的创建,时间复杂度为O(n) 46 template<class T> 47 void SqListClass<T>::CreateList(T a[], int n) 48 { 49 int i; 50 for(i=0; i<n; i++){ 51 data[i] = a[i]; 52 } 53 length = i; 54 } 55 56 // 输出线性表的所有元素,时间复杂度为O(n) 57 template<class T> 58 void SqListClass<T>::DispList(){ 59 cout << "Out:" << endl; 60 for(int i=0; i<length; i++){ 61 cout << data[i] << " "; 62 } 63 cout << endl; 64 } 65 66 // 求线性表的长度,时间复杂度为O(1) 67 template<class T> 68 int SqListClass<T>::ListLength(){ 69 return length; 70 } 71 72 // 求顺序表中某序列号的元素值,,时间复杂度为O(1) 73 template<class T> 74 bool SqListClass<T>::GetElem(int i, T &e){ 75 if(i<0 || i>length) return false; 76 e = data[i-1]; 77 return true; 78 } 79 80 // 按元素查找其第一个序号位置,时间复杂度为O(n) 81 template<class T> 82 int SqListClass<T>::LocateElem(T e){ 83 int i = 0; 84 while(i<length && data[i]!=e) i++; 85 if(i>=length) return 0; 86 else return i+1; 87 } 88 89 // 在位置i插入数据元素e,时间复杂度为O(n) 90 template<class T> 91 bool SqListClass<T>::ListInsert(int i, T e){ 92 if(i<0 || i>length) return false; 93 for(int j=length; j>=i; j--){ 94 data[j]=data[j-1]; 95 } 96 data[i-1] = e; 97 length++; 98 return true; 99 } 100 101 // 在位置i删除数据元素,时间复杂度为O(n) 102 template<class T> 103 bool SqListClass<T>::ListDelete(int i){ 104 if(i<0 || i>length) return false; 105 for(int j=i-1; j< length; j++){ 106 data[j] = data[j+1]; 107 } 108 length--; 109 return true; 110 } 111 112 // 翻转顺序表 113 template<class T> 114 void SqListClass<T>::ReverseList(SqListClass<T> &L){ 115 T temp; 116 for(int j=0; j<L.length/2; j++){ 117 temp = L.data[j]; 118 L.data[j] = L.data[length-j-1]; 119 L.data[length-j-1] = temp; 120 } 121 } 122 123 // 主函数 124 int main(){ 125 SqListClass<int> sqList; 126 int arr[3] = {3,4,5}; 127 // 创建线性表 128 sqList.CreateList(arr, 3); 129 // 输出线性表 130 sqList.DispList(); 131 // 输出线性表的长度 132 cout << "sqList length is " << sqList.ListLength() << endl; 133 // 求第二个位置的元素 134 int a; 135 sqList.GetElem(2, a); 136 cout <<"The 2 local is elem " << a << endl; 137 // 查找元素5的位置 138 cout << "The elem 5 local is " << sqList.LocateElem(5) << endl; 139 // 在位置4插入元素6 140 sqList.ListInsert(2, 6); 141 sqList.DispList(); 142 // 在位置1删除数据元素 143 sqList.ListDelete(1); 144 sqList.DispList(); 145 // 翻转顺序表 146 sqList.ReverseList(sqList); 147 sqList.DispList(); 148 return 0; 149 }