[数据结构] 顺序表
数据结构的练习与巩固
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1 //顺序表静态结构 2 #define MaxSize 100 3 typedef int T; 4 typedef struct 5 { 6 T data[MaxSize]; 7 int n; 8 }SeqList;
1 //顺序表动态结构 2 typedef int T; 3 typedef struct 4 { 5 T *data; 6 int n, MaxSize; 7 }SeqList;
1 //顺序表(SeqList)类的定义 2 template <class T> 3 class SeqList : public LinearList<T> 4 { 5 protected: 6 T* data; //数据数组 7 int MaxSize; //最大容量 8 int last; //当前最后元素下标 9 void reSize(int newSize) //重构容量大小 10 11 public: 12 SeqList(int size = MaxSize); //构造函数 13 SeqList(SeqList<T>& L); //复制构造函数 14 ~SeqList() //析构函数 15 {delete[] data;} 16 int Size()const //求顺序表容量 17 { return MaxSize; } 18 int Length()const //求顺序表当前长度 19 { return last + 1; } 20 int Search(T& x)const; //查找 21 int Locate(int i)const; //定位 22 bool getData(int i, T &x) //提取i位置数据 23 { 24 if (i > 0 && i <= last + 1) x = data[i - 1]; 25 else return false; 26 } 27 void setData(int i, T& x) 28 { 29 if (i > 0 && i <= last + 1) data[i - 1] = x; 30 else return false; 31 } 32 int Insert(int i, T& x); //插入 33 int Remove(int i, T& x); //移除 34 bool IsEmpty() //是否是空 35 {return (last == -1) ? true : false;} 36 bool IsFull() //是否是满 37 {return (last == MaxSize - 1) ? true : false;} 38 void Input(); //输入 39 void Output(); //输出 40 41 SeqList<T> operator=(SeqList<T>& L); 42 }; 43 44 template <class T> 45 SeqList<T>::SeqList(int size) 46 { 47 if(size>0) 48 { 49 MaxSize = size; 50 last = -1; 51 data = new T[MaxSize]; 52 if (data == NULL) //如果创建的是空指针则提示失败 53 { 54 cerr << "存储分配失败!" << endl; 55 exit(1); 56 } 57 } 58 } 59 60 template <class T> 61 SeqList<T>::SeqList(SeqList<T>&L) 62 { 63 MaxSize = L.Size(); 64 last = L.Length() - 1; 65 T value; 66 data = new T[MaxSize]; 67 if (data == NULL) //如果创建的是空指针则提示失败 68 { 69 cerr << "存储分配失败" << endl; 70 exit(1); 71 } 72 for (int i = 1; i <= last + 1; i++) //持续提取数据并依次赋给新数组 73 { 74 L.getData(i, value); 75 data[i - 1] = value; 76 } 77 } 78 79 template <class T> 80 void SeqList<T>::reSize(int newSize) 81 { 82 if (newSize <= 0) //长度必须大于0 83 { 84 cerr << "无效的数组大小" << endl; 85 return 0; 86 } 87 if (newSize != MaxSize) //如果输入的新大小跟原来一样,则不需操作 88 { 89 T* newArray = new T[newSize]; 90 if (newArray == NULL) 91 { 92 cerr << "存储分配失败!" << endl; 93 exit(1); 94 } 95 int length = last + 1; 96 T* srcptr = data; //源头指针 97 T* destptr = newArray; //目标指针 98 while (length--)*destptr++ = *srcptr++; //依次赋值 99 delete[]data; //删除原来数据 100 data = newArray; //指针指向新数组 101 MaxSize = newSize; //大小改为新大小 102 } 103 } 104 105 template <class T> 106 int SeqList<T>::Search(T&x)const 107 { 108 for (int i = 0; i <= last; i++) 109 { 110 if (data[i] == x)return i + 1; //搜查data为x的位置 111 } 112 } 113 114 template <class T> 115 void SeqList<T>::Insert(T &x,int i) 116 { 117 if (last + 1 >= MaxSize || (i<0 || i>last + 1)) //如果插入后长度大于定义的最大长度,或插入位置不在规定范围内 118 return false; 119 for (int j = last; j >= i; j--) //插入位置后的数据全部后挪一位 120 data[j + 1] = data[j]; 121 data[i] = x; //将数值赋予该位置的data 122 last++; //当前长度+1 123 return true; 124 } 125 126 template <class T> 127 SeqList<T>::Remove(int i, T&x) 128 { 129 if (last == -1 || i<1 || i>last + 1) //如果长度为0,或移除位置不在规定范围内 130 return false; 131 x = data[i - 1]; //提取移除数据 132 for (int j = i; j <= last; j++) //将该位置后的数据全部前移一位 133 data[j - 1] = data[j]; 134 last--; //当前长度-1 135 return true; 136 } 137 138 template <class T> 139 SeqList<T>::Input() 140 { 141 cout << "请输入元素个数"; 142 while (1) 143 { 144 cin >> last; 145 if (last + 1 <= MaxSize)break; 146 cout << "超出限制"; 147 } 148 cout << "0:" << endl; 149 for (int i = 0; i <= last; i++) 150 { 151 cin >> data[i]; 152 cout << i + 1 << endl; 153 } 154 } 155 156 template <class T> 157 SeqList<T>::Output() 158 { 159 cout << "当前最后元素位置为" << last + 1 << endl; 160 for (int i = 0; i <= last; i++) 161 { 162 cout << "#" << i + 1 << ":" << data[i] << endl; 163 } 164 }