线性表的逻辑结构
对于非空的线性表:
(1)有且仅有一个开始结点a1,没有直接前驱,有唯一后继a2;
(2)有且仅有一个终端结点an,没有直接后继,有唯一的直接前驱an-1;
(3)其余的内部结点ai,都有唯一的直接前驱ai-1和直接后继ai+1;
下面给出不同的实际实现:
一、顺序表数据结构
1 ///////////////////////////////////////////////////// 2 3 //SqList.h顺序表数据结构c++定义(基类) 4 5 ////////////////////////////////////////////////// 6 7 #ifndef SQLIST_H 8 #define SQLIST_H 9 10 //顺序表使用的一些常量说明 11 #define LIST_MAX_SIZE 100 //顺序表初始存储空间的大小 12 #define LISTINCREMENT 10 //顺序表的存储空间增量 13 #define ERROR -1; 14 #define OK 0; 15 typedef int Status; 16 /////////////////////////////////////////////////// 17 //顺序表数据结构声明(基类) 18 #include <assert.h> 19 #include <iostream> 20 using namespace std; 21 template <typename ElemType> 22 class SqList 23 { 24 public: 25 //有序顺序表折半查找 26 int bin_search(ElemType key); 27 //把顺序表置空 28 void clear(); 29 //删除第i个元素 30 Status deleteElem(int i,ElemType& e); 31 //取第i个元素 32 ElemType getElem(int i ,ElemType& e); 33 //求顺序表中元素的个数 34 int getLength(); 35 //取顺序表存储空间的大小 36 int getListSize(); 37 //在第i个元素之前插入一个元素 38 Status insert(int i,ElemType e); 39 //判断顺序表是否为空 40 bool isEmpty(); 41 //查找第1个与e满足compare()关系的元素序号 42 int locateElem(ElemType e,Status (*compare)(ElemType,ElemType)); 43 //重载赋值运算符的定义 44 SqList<ElemType> operator = (SqList<ElemType> rightL); 45 //返回某元素的前驱 46 Status priorElem(ElemType e, ElemType& prior_e); 47 //返回某元素的后继 48 Status nextElem(ElemType e, ElemType& next_e); 49 //在顺序表中查找某元素 50 int sequentialSearch(ElemType e); 51 //********************下面是系统自动调用的构造函数以及析构函数************************ 52 53 //顺序表构造函数 54 SqList(); 55 //顺序表析构函数 56 ~SqList(); 57 //顺序表靠被初始化构造函数 58 SqList(const SqList<ElemType>& otherL); 59 protected: 60 61 ElemType * elem;//顺序表动态存储空间的首地址 62 int listSize;//顺序表当前已分配的存储空间大小 63 int n;//顺序表当前元素的个数 64 private: 65 }; 66 //////顺序表数据结构C++实现(基类) 67 68 69 //功能:在循序表折半查找 70 //要求:顺序表实现排好序 71 //输入:指定值key 72 //输出:如果存在查找元素,则返回该元素的序号(元素的序号从1开始),否则,返回0 73 template<typename ElemType> 74 int SqList<ElemType>::bin_search(ElemType key) 75 { 76 int low; 77 int mid; 78 int high; 79 80 //首先,把顺序表的整个区间设置为初始查找区域 81 low = 0,high=n-1; 82 while(low<=high) 83 { 84 mid = (low+high)/2; 85 86 if (elem[mid]==key) 87 { 88 return mid+1; //返回元素实际的序号 89 } 90 91 else if (elem[mid]<key) 92 { 93 low = mid +1; 94 } 95 96 else 97 { 98 high = mid -1; 99 } 100 101 } 102 103 return 0; 104 } 105 106 107 //功能:把顺序表置空 108 //说明:只是把顺序表当前元素的个数设置为0,并不回收其存储空间 109 110 template<typename ElemType> 111 void SqList<ElemType> ::clear() 112 { 113 n=0; 114 } 115 116 //功能:删除第i个元素 117 118 template <typename ElemType> 119 Status SqList<ElemType>::deleteElem(int i ,ElemType& e) 120 { 121 //判断第i个元素的序号i是否越界 122 if (i<1||i>n) 123 { 124 return false; 125 } 126 127 e= elem[i-1]; 128 //第i个结点以后的数据都向前移动一个位置 129 for (int j =i+1;j<=n;++j) 130 { 131 elem[j-2] = elem[j-1]; 132 } 133 --n;//元素个数减1 134 return true; 135 } 136 137 138 //功能:取第i个元素 139 140 template <typename ElemType> 141 ElemType SqList<ElemType>::getElem(int i ,ElemType& e) 142 { 143 //判断i是否越界 144 if (i<1||i>n) 145 { 146 return ERROR; 147 } 148 149 e=elem[i-1]; 150 return e; 151 } 152 153 154 155 //求顺序表中元素的个数 156 157 template <typename ElemType> 158 int SqList<ElemType>::getLength() 159 { 160 return n; 161 } 162 163 164 //功能:去顺序表存储空间的大小 165 166 template<typename ElemType> 167 int SqList<ElemType>::getListSize() 168 { 169 return listSize; 170 } 171 172 173 //功能:在第i个元素之前插入一个元素 174 175 176 template <typename ElemType> 177 Status SqList<ElemType>::insert(int i,ElemType e) 178 { 179 ElemType *newbase; 180 181 if (i<1||i>(n+1)) 182 { 183 return ERROR; 184 } 185 //如果现在顺序表中的元素个数大于等于表的容量 186 if (n>=listSize) 187 {//重新申请新的顺序表空间,扩充容量 188 newbase = new ElemType(listSize+LISTINCREMENT); 189 assert(newbase != 0); 190 //将原来顺序表中的元素复制到新的顺序表中 191 for (int j = 1;j<=n;++j) 192 { 193 newbase[j-1] = elem[j-1]; 194 } 195 //删除原来顺序表中的元素 196 delete [] elem; 197 //将顺序表的基地址更改为新申请的空间地址 198 elem = newbase; 199 //更新表容量 200 listSize+=LISTINCREMENT; 201 } 202 //从顺序表的最后一个元素开始,直到第i个元素,每个元素后移一位 203 for (int j=n; j>=i;--j) 204 { 205 elem[j] = elem[j-1]; 206 207 } 208 209 elem[i-1]=e; 210 ++n; 211 return OK; 212 } 213 214 215 //功能:判断顺序表是否为空 216 217 template <typename ElemType> 218 bool SqList<ElemType>::isEmpty() 219 { 220 return n?false:true; 221 } 222 223 //功能:查找第1个与e满足compare()关系的元素 224 225 template<typename ElemType> 226 int SqList<ElemType>::locateElem(ElemType e,Status (*compare)(ElemType,ElemType)) 227 { 228 //查找满足条件的元素,即从顺序表第一个严肃开始,逐一判断顺序表的当前元素 229 //是否与待查值满足比较关系,直到满足或顺序表查找完毕。 230 231 for (int i = 1;i<n && !(*compare)(elem[i-1],e);i++); 232 233 if (i <= n) 234 { 235 return i; 236 } 237 else 238 return 0; 239 } 240 241 //功能:返回某元素的后继 242 template <typename ElemType> 243 int SqList<ElemType>::nextElem(ElemType e, ElemType& next_e) 244 { 245 int i =locateElem(e,equal); 246 247 if (i<0||i==n) 248 { 249 return ERROR; 250 } 251 else 252 getElem(i+1,next_e); 253 return OK; 254 } 255 //功能:重载赋值运算符的定义 256 template<typename ElemType> 257 SqList<ElemType> SqList<ElemType>::operator =(SqList<ElemType> rightL) 258 { 259 if (this != &rightL) 260 { 261 delete[] elem; 262 elem = new ElemType(rightL.listSize); 263 assert(elem ! = 0); 264 listSize = rightL.listSize; 265 } 266 n = rightL.n; 267 for (int i =1;i<=n;++i) 268 { 269 elem[i-1]=rightL.elem[i-1]; 270 } 271 return *this; 272 } 273 //功能:返回某元素的前驱 274 275 template<typename ElemType> 276 Status SqList<ElemType>::priorElem(ElemType e, ElemType& prior_e) 277 { 278 int i = locateElem(e,equal); 279 if (i<1) 280 { 281 return ERROR; 282 } 283 else 284 getElem(i-1,prior_e); 285 return OK; 286 } 287 //功能:在顺序表中顺序查找某元素 288 template<typename ElemType> 289 int SqList<ElemType>::sequentialSearch(ElemType key) 290 { 291 for (int i =1;i<=n&&key!=elem[i-1];++i); 292 293 if (i<=n) 294 { 295 return i; 296 } 297 else 298 return 0; 299 } 300 //**********下面为系统自动调用的构造函数和析构函数的实现********* 301 302 //功能:初始申请一个LIST_MAX_SIZED大小的动态存储空间,并把当前元素的个数置为0; 303 template<typename ElemType> 304 SqList<ElemType>::SqList() 305 { 306 elem = new ElemType(LIST_MAX_SIZE); 307 assert(elem != 0); 308 listSize = LIST_MAX_SIZE; 309 n= 0; 310 } 311 //功能:顺序表析构函数 312 template <typename ElemType> 313 SqList<ElemType>::~SqList() 314 { 315 //释放顺序表的元素空间 316 delete [] elem; 317 } 318 //功能:顺序表拷贝初始化的顺序表 319 template<typename ElemType> 320 SqList<ElemType>::SqList(const SqList<ElemType>& otherL) 321 { 322 elem = new ElemType(otherL.listSize); 323 assert(elem ! = 0;) 324 listSize = otherL.listSize; 325 n = otherL.n; 326 for (int i =1;i<=n;++i) 327 { 328 elem[i-1] = otherL.elem[i-1] 329 } 330 } 331 #endif