线性表的逻辑结构

对于非空的线性表:

(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
View Code

相关文章: