线性表的顺序表示

线性表了有如下几个特征:

1.集合中必存在唯一的一个"第一个元素";

2.集合中必存在唯一的一个"最后的元素";

3.除最后元素之外,其它数据元素均有唯一的"后继";

4.除第一元素之外,其它数据元素均有唯一的"前驱"。

线性表的顺序表示指的是用物理上的一段连续的地址来存储数据元素。

如果第一个元素的在内存上的地址为a1,每个元素占用的空间是l,那么第n个元素的地址就是a1+(n-1) x l。

数组描述的线性表顺序结构表示:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define TRUE 1
  5 #define FALSE 0
  6 #define OK 1
  7 #define ERROR 0
  8 #define INIT_SIZE 10        //初始化表长
  9 #define INCREMENT_SIZE 5    //分配增量
 10
 11 typedef int Status;
 12 typedef int Elemtype;
 13
 14 /*
 15  * 存储结构
 16  */
 17 typedef struct
 18 {
 19     Elemtype *elem;    //存储空间基址
 20     int length;        //当前长度
 21     int size;        //当前分配的表长大小
 22 }SqList;
 23
 24 /*
 25  * 初始化一个空的线性表
 26  */
 27 Status InitList(SqList *L)
 28 {
 29     L->elem = (Elemtype *) malloc(INIT_SIZE * sizeof(Elemtype));
 30     if (!L->elem)
 31     {
 32         return ERROR;
 33     }
 34     L->length = 0;
 35     L->size = INIT_SIZE;
 36     return OK;
 37 }
 38
 39 /*
 40  * 销毁线性表
 41  */
 42 Status DestroyList(SqList *L)
 43 {
 44     free(L->elem);
 45     L->length = 0;
 46     L->size = 0;
 47     return OK;
 48 }
 49
 50 /*
 51  * 清空线性表
 52  */
 53 Status ClearList(SqList *L)
 54 {
 55     L->length = 0;
 56     return OK;
 57 }
 58
 59 /*
 60  * 判断线性表是否为空
 61  */
 62 Status isEmpty(const SqList L)
 63 {
 64     if (0 == L.length)
 65     {
 66         return TRUE;
 67     }
 68     else
 69     {
 70         return FALSE;
 71     }
 72 }
 73
 74 /*
 75  * 获取长度
 76  */
 77 Status getLength(const SqList L)
 78 {
 79     return L.length;
 80 }
 81
 82 /*
 83  * 根据位置获取元素
 84  */
 85 Status GetElem(const SqList L, int i, Elemtype *e)
 86 {
 87     if (i < 1 || i > L.length)
 88     {
 89         return ERROR;
 90     }
 91     *e = L.elem[i-1];
 92     return OK;
 93 }
 94
 95 /*
 96  * 比较两个元素是否相等
 97  */
 98 Status compare(Elemtype e1, Elemtype e2)
 99 {
100     if (e1 == e2)
101     {
102         return 0;
103     }
104     else if (e1 < e2)
105     {
106         return -1;
107     }
108     else
109     {
110         return 1;
111     }
112 }
113
114 /*
115  * 查找元素
116  */
117 Status FindElem(const SqList L, Elemtype e, Status (*compare)(Elemtype, Elemtype))
118 {
119     int i;
120     for (i = 0; i < L.length; i++)
121     {
122         if (!(*compare)(L.elem[i], e))
123         {
124             return i + 1;
125         }
126     }
127     if (i >= L.length)
128     {
129         return ERROR;
130     }
131 }
132
133 /*
134  * 查找前驱元素
135  */
136 Status PreElem(const SqList L, Elemtype cur_e, Elemtype *pre_e)
137 {
138     int i;
139     for (i = 0; i < L.length; i++)
140     {
141         if (cur_e == L.elem[i])
142         {
143             if (i != 0)
144             {
145                 *pre_e = L.elem[i - 1];
146             }
147             else
148             {
149                 return ERROR;
150             }
151         }
152     }
153     if (i >= L.length)
154     {
155         return ERROR;
156     }
157 }
158
159 /*
160  * 查找后继元素
161  */
162 Status NextElem(const SqList L, Elemtype cur_e, Elemtype *next_e)
163 {
164     int i;
165     for (i = 0; i < L.length; i++)
166     {
167         if (cur_e == L.elem[i])
168         {
169             if (i < L.length - 1)
170             {
171                 *next_e = L.elem[i + 1];
172                 return OK;
173             }
174             else
175             {
176                 return ERROR;
177             }
178         }
179     }
180     if (i >= L.length)
181     {
182         return ERROR;
183     }
184 }
185
186 /*
187  * 插入元素
188  */
189 Status InsertElem(SqList *L, int i, Elemtype e)
190 {
191     Elemtype *new_ele;
192     if (i < 1 || i > L->length + 1)
193     {
194         return ERROR;
195     }
196     if (L->length >= L->size)
197     {
198         new_ele = (Elemtype*) realloc(L->elem, (L->size + INCREMENT_SIZE) * sizeof(Elemtype));
199         if (!new_ele)
200         {
201             return ERROR;
202         }
203         L->elem = new_ele;
204         L->size += INCREMENT_SIZE;
205     }
206     Elemtype *p = &L->elem[i - 1];
207     Elemtype *q = &L->elem[L->length - 1];
208     for (; q >= p; q--)
209     {
210         *(q + 1) = *q;
211     }
212     *p = e;
213     ++L->length;
214     return OK;
215 }
216
217 /*
218  * 删除元素并返回其值
219  */
220 Status DeleteElem(SqList *L, int i, Elemtype *e)
221 {
222     if (i < 1 || i > L->length)
223     {
224         return ERROR;
225     }
226     Elemtype *p = &L->elem[i - 1];
227     *e = *p;
228     for (; p < &L->elem[L->length]; p++)
229     {
230         *(p) = *(p + 1);
231     }
232     --L->length;
233     return OK;
234 }
235
236 /*
237  * 访问元素
238  */
239 void visit(Elemtype e)
240 {
241     printf("%d ", e);
242 }
243
244 /*
245  * 遍历线性表
246  */
247 Status TraverseList(const SqList L, void (*visit)(Elemtype))
248 {
249     int i;
250     for(i = 0; i < L.length; i++)
251     {
252         visit(L.elem[i]);
253     }
254     return OK;
255 }
256
257 /*
258  * 主函数测试
259  */
260 int main()
261 {
262     SqList L;
263     if (InitList(&L))
264     {
265         Elemtype e;
266         printf("init_success\n");
267         int i;
268         for (i = 0; i < 10; i++)
269         {
270             InsertElem(&L, i + 1, i);
271         }
272         printf("length is %d\n", getLength(L));
273         if (GetElem(L, 1, &e)) {
274             printf("The first element is %d\n", e);
275         }
276         else
277         {
278             printf("element is not exist\n");
279         }
280         if (isEmpty(L))
281         {
282             printf("list is empty\n");
283         }
284         else
285         {
286             printf("list is not empty\n");
287         }
288         printf("The 5 at %d\n", FindElem(L, 5, *compare));
289         PreElem(L, 6, &e);
290         printf("The 6‘s previous element is %d\n", e);
291         NextElem(L, 6, &e);
292         printf("The 6‘s next element is %d\n", e);
293         DeleteElem(&L, 1, &e);
294         printf("delete first element is %d\n", e);
295         printf("list:");
296         TraverseList(L,visit);
297         if (DestroyList(&L))
298         {
299             printf("\ndestroy_success\n");
300         }
301     }
302 }
时间: 2024-11-22 21:19:04

线性表的顺序表示的相关文章

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几

线性表之顺序表奇偶调整和单链表就地逆置

线性表之顺序表奇偶调整,就是指将顺序表的奇数与偶数位置互换,以最优方法解决,因为方法很多,比如,开辟一个新的顺序表分别存放奇偶数,也可以从头向后寻找奇偶数放置到尾部或头部,但这些都会增大时间与空间的消耗.最优法则是前后分别寻找奇偶不同类型数,满足前奇后偶(或前偶后期),交换两数位置,实现时间复杂度O(n),空间O(1)的方案. void AdjustSqlist(SeqList *L) { int i=0,j=L->last; int temp; while(i<j) { while(L-&g

线性表之顺序表C++实现

线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件#include<iostream> const int MaxSize = 100;//定义顺序表SeqList的模板类template<class DataType>class SeqList{public: //顺序表无参构造器(创建一个空的顺序表) SeqList(){ length = 0 } //顺序表有参构造器(创建一个长度为n的顺序表) SeqList(DataType array[], int

线性表的顺序表示和实现

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 假设线性表的每个元素需占用L个存储单元,并能所占的第一个单元的存储地址作为数据元素的存储位置.则线性表中第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系: LOC(ai+1)=LOC(ai)+L 一般来说,线性表的第i个数据元素ai的存储位置为 LOC(ai)=LOC(a1)+(i-1)×L 式中LOC(a1)是线性表中第一个数据元素的存储位置,通常称做线性表的起始位置

线性表之顺序栈C++实现

线性表之顺序栈 栈是限定仅在表尾(栈顶)进行插入删除操作的线性表,FILO:先进后出 一.顺序栈的头文件:SeqStack.h //顺序栈头文件#include<iostream>using namespace std;//设置顺序栈的大小const int StackSize = 10;template<class DataType>//定义顺序栈的模板类型class SeqStack{public: //无参构造器,初始化栈顶指针 SeqStack(){ top = -1; }

数据结构算法C语言实现(一)---2.3线性表的顺序表示和实现

注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实现,主要操作包括建表,插入元素,删除元素,查找元素,合并表等操作,根据书中伪代码编写了C语言,使用int类型进行了测试,需要注意的是查找元素时使用了函数指针,C语言初学者不易理解,可查阅相关书籍学习. 二.头文件 1 //head.h 2 /** 3 My Code 4 */ 5 #include

线性表的顺序实现

线性表的顺序表示和实现时间:2006/02/14测试环境:TC2.0 #include "stdio.h" #define TRUE 1 #define FALSE 0 #define List_Init_Size 30 #define List_Increment 10 typedef int ElemType; typedef struct { ElemType *elem; int length; int listsize; }Sqlist; /*初始化一个线性表*/ int I

C#线性表之顺序表

线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数据元素: (2)除最后一个位置的数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是一个接一个的排列.因此,可以把线性表想象为一种数据元素序列的数据结构. 线性表的接口如下所示. public interface I

线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一个元素有前驱元素,单无后继元素. 可以抽象为如下表述: 元素1 元素2 元素3 元素4 元素5 元素6 然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)                  2.在内存中离散存储的线性表-----链表(如单链表,双链