线性表运算--顺序存储结构实现

对于线性表我们应掌握如下要点:

1、  掌握线性表的结构特点:顺序存储和链式存储。

2、  掌握线性表的基本操作:初始化,插入,删除,查找,判空,求线性表长度等运算在顺序存储结构和链式存储结构上的实现。

顺序存储具有随机访问的特点,而链式存储具有顺序访问的特点。

对于不同的应用我们应当选择不同的结构。

顺序结构实现源代码如下:


 1 HList.h  //线性表头文件定义
2 //数据结构头文件在定义,
3 //链表的头文件
4 #ifndef _HLIST_H_
5 #define _HLIST_H_
6 //#define M_error -1
7 #include"stdlib.h"
8 #define Length_Size 100
9 #define add_Length 10
10 typedef int Element;
11 struct Link
12 {
13 Element *p; //链表表示的物理线形表
14 Element leg ; //线形表的当前长度
15 Element list_size; //线形表分配的数据的长度
16
17 };
18 //定义一个函数指针类型P_ptr
19 //用于compare();比较函数的调用
20 typedef bool (*P_ptr)(Element &a,Element &b);
21
22 //定义一个函数指针类型P_Vs
23 typedef bool (*P_Vs)(Element &a,Element &b);
24
25 //初始化一个线形表
26 //成功返回ture 失败返回false;
27 bool InitList(Link &L);
28
29 //销毁一个线形表
30 //显形表不存在提示错误
31 //销毁成功返回true,销毁失败返回false;
32 void DestroyList(Link &L);
33
34 //线形表不存在提示错误
35 //线形表存在清空
36 //清空成功返回ture,清空失败返回false;
37 bool ClearList(Link &L);
38
39 //线形表是否为空
40 //线形表存在不为空返回ture,线形表存在为空返回false
41 bool IsLink_Empty(Link &L);
42
43 //线形表存在,返回线形表数据元素的长度
44
45 int Get_Link_Length(Link &L);
46
47 //用e获得线形表中第i个元素
48 //前提线形表已经存在
49 //获得成功返回ture;获得非法,提示错误
50 bool Get_element(Link &L,int i,Element &e);
51
52 //线形表存在,e在线形表中第一个满足compare()
53 //条件的元素,若不满足,则提示错误,若不存在则提示
54 int Get_Compare(Link &L,Element &e,P_ptr p);
55
56 //获得前驱
57 //前提L存在,若cur是线形表中的元素,且cur不是第一元素,则返回
58 //cur的前面一个元素,若找不到则返回错误,
59 //若找到用pre_e返回,返回 ture
60 bool Get_Prior_Elm(Link &L,Element &cur,Element &pre_e);
61
62 //获得后继,
63 //前提L存在,若 cur是线形表中的元素,且cur不是第一元素,则返回
64 //cur的后面一个元素,若找不到则返回错误,
65 //若找到用next_e返回,返回为ture
66 bool Get_Next_Elm(Link &L,Element &cur,Element &next_e);
67
68 //链表存在,
69 //在链表的第i个元素前插入一个元素e。
70 //插入范围从i=1,到从末尾插入
71 //插入成功返回ture,失败返回错误提示
72 bool List_Insert(Link &L,int i,Element &e);
73
74 //链表存在,将链表中的第i个指定元素删除,
75 //删除成功返回ture,删除不合法或者错误返回false;
76 bool List_Delete(Link &L,int i);
77
78 //线形表存在,依次对线形表的每个元素调用vist();
79 //vist(),操作失败则返回false,操作成功返回ture;
80 bool ListTraverse(Link &L,P_Vs visit,Element &e);
81
82 //compare()函数的声明
83 bool Compare(Element &a,Element &b);
84
85
86 //输出打印线性表中的所有值
87 void Print_Link(Link &L);
88
89 bool visit(Element &a,Element &b);
90
91 #endif //_HLIST_H_

HList.cpp


  1 HList.cpp     //线性表实现文件
2
3 //数据结构在定义实现文件
4 //数据结构头文件在定义,
5 #include<iostream>
6 #include"HList.h"
7 //初始化一个线形表,首选默认调用
8 //成功返回ture 失败返回false; 1
9 bool InitList(Link &L)
10 {
11 L.p = (Element*)malloc(Length_Size*sizeof(Element)); //分配100个元素的存储空间
12 if(!L.p)
13 {
14 std::cout<<"内存空间分配失败"<<std::endl;
15 return false;
16
17 }
18 else
19 {
20 L.list_size = Length_Size; //初始分配量
21 L.leg = 0; //当前线形表内容长度
22 int i = 0;
23 for(;i<6;i++)
24 {
25 L.p[i] = i+1;
26
27 }
28 L.leg = 6;
29 return true;
30 }
31
32 }
33
34
35 //销毁一个线形表 最后自动调用
36 //销毁成功返回true,销毁失败返回false; 2
37 void DestroyList(Link &L)
38 {
39 L.list_size = 0;
40 L.leg = 0;
41 free(L.p);
42 }
43
44 //线形表存在清空
45 //清空成功返回ture,清空失败返回false; 3
46 bool ClearList(Link &L)
47 {
48 if (L.leg>0)
49 {
50 L.leg = 0;
51 return true;
52
53 }
54 else if(0==L.leg)
55 {
56 return true;
57 }
58 else
59 {
60 return false;
61 }
62 }
63 //线形表是否为空
64 //线形表存在不为空返回ture,线形表存在为空返回false 4
65 bool IsLink_Empty(Link &L)
66 {
67 if(0 == L.leg && L.p!=NULL )
68 {
69 return true;
70 }
71 else
72 {
73 return false;
74
75 }
76 }
77
78 //线形表存在,返回线形表数据元素的长度 5
79 int Get_Link_Length(Link &L)
80 {
81 if (L.p!=NULL)
82 {
83 return L.leg;
84 }
85 else
86 {
87 return -2;
88 }
89 }
90
91 //用e获得线形表中第i个元素
92 //获得成功返回ture;获得非法,提示错误 6
93 bool Get_element(Link &L,int i,Element &e)
94 {
95 if(L.p!=NULL &&L.leg!=0 && 0<i &&i<=L.leg)
96 {
97 e = L.p[i-1];
98 return true;
99 }
100 else if (L.leg == 0)
101 {
102 std::cout<<"线性表为空"<<std::endl;
103 return false;
104 }
105 else if(i<1||i>L.leg)
106 {
107 std::cout<<"i值不合法"<<std::endl;
108 return false;
109 }
110 else
111 {
112 return false;
113 }
114
115 }
116
117 //b为比较元素e
118 //a为线性表元素
119 bool Compare(Element &a,Element &b)
120 {
121 if (a>b)
122 {
123 return true;
124 }
125 else
126 {
127 return false;
128 }
129 }
130
131 //线形表存在,e在线形表中第一个满足compare()
132 //条件的元素,若不满足,则提示错误,若不存在则提示
133 int Get_Compare(Link &L,Element &e,P_ptr p)
134 {
135 int i=0;
136 if(0 == L.leg)
137 {
138 return -1;
139 }
140 else
141 {
142 for(;i<L.leg;i++)
143 {
144 if(p(L.p[i],e))
145 {
146 return i+1;
147 }
148 }
149 return -2;
150 }
151 }
152 //获得前驱
153 bool Get_Prior_Elm(Link &L,Element &cur,Element &pre_e)
154 {
155 int i = 1;
156 if(0 ==L.leg)
157 {
158 std::cout<<"线性表为空,无法完成操作"<<std::endl;
159 return false;
160 }
161 else if (L.p[0] == cur)
162 {
163 std::cout<<"cur为线性表中第一个元素,没有前驱"<<std::endl;
164 return false;
165 }
166 else
167 {
168 for(;i<=L.leg;i++)
169 {
170 if(L.p[i]==cur)
171 {
172 pre_e = L.p[i-1];
173 return true;
174 }
175
176 }
177 std::cout<<"输入元素不存在"<<std::endl;
178 return false;
179 }
180
181 }
182
183 //获得后继,
184 bool Get_Next_Elm(Link &L,Element &cur,Element &next_e)
185 {
186 int i = 0;
187 if(0 ==L.leg)
188 {
189 std::cout<<"线性表为空,无法完成操作"<<std::endl;
190 return false;
191 }
192 else if (L.p[L.leg-1] == cur)
193 {
194 std::cout<<"cur为线性表中最后一个元素,没有后继"<<std::endl;
195 return false;
196 }
197 else
198 {
199 for(;i<L.leg-1;i++)
200 {
201 if(L.p[i]==cur)
202 {
203 next_e = L.p[i+1];
204 return true;
205 }
206 }
207 std::cout<<"输入元素不存在"<<std::endl;
208 return false;
209 }
210 }
211
212
213
214 bool List_Insert(Link &L,int i,Element &e)
215 {
216 int j=L.leg;
217 Element* new_p;
218 if(i<1&&i>L.leg+1)
219 {
220 std::cout<<"i值不合法"<<std::endl;
221 return false;
222
223 }
224 if(L.leg ==L.list_size)//内存不足,分配空间
225 {
226 new_p = (Element*)realloc(L.p,(L.list_size+add_Length)*sizeof(Element));
227 if(!new_p)
228 {
229 std::cout<<"内存扩展失败"<<std::endl;
230 return false;
231 }
232 L.p = new_p;
233 }
234 for(;j>=i;j--)
235 {
236 L.p[j]=L.p[j-1];
237 }
238
239 L.p[i-1] = e;
240 L.leg++;
241
242 return true;
243 }
244
245
246 bool List_Delete(Link &L,int i)
247 {
248 if(0==L.leg)
249 {
250 std::cout<<"线性表为空,无法执行删除操作"<<std::endl;
251 return false;
252 }
253 else
254 {
255 int j = i;
256 if(1<=i&&i<=L.leg)
257 {
258 while(j<L.leg)
259 {
260 L.p[j-1] = L.p[j];
261 j++;
262 }
263 L.leg--;
264 return true;
265 }
266 else if (i<1||i>L.leg)
267 {
268 std::cout<<"i值输入不合法"<<std::endl;
269 return false;
270 }
271 else
272 {
273 return false;
274 }
275 }
276 }
277
278 bool visit(Element &a,Element &b)
279 {
280 if(a<=b)
281 {
282 return false;
283 }
284 else
285 {
286 return true;
287 }
288 }
289 //测试,;依次对元素调用visit函数
290 //有一个不满足则返回false
291 bool ListTraverse(Link &L,P_Vs visit,Element &e)
292 {
293 if(0==L.leg)
294 {
295 std::cout<<"线性表为空"<<std::endl;
296 return false;
297 }
298 else
299 {
300 while(L.leg>=1)
301 {
302 if(!visit(L.p[L.leg-1],e))
303 {
304 return false;
305 }
306 L.leg--;
307 }
308 }
309 return true;
310
311 }
312
313
314 void Print_Link(Link &L)
315 {
316 int i = 1;
317 for(;i<=L.leg;i++)
318 {
319 std::cout<<L.p[i-1]<<" ";
320 }
321 }

时间: 2024-10-21 04:53:56

线性表运算--顺序存储结构实现的相关文章

线性表的顺序存储结构和链式存储结构

前言 上一篇<栈>中提到了栈的顺序存储结构和链式存储结构,现在就对此做个简单的比较.因为栈是线性表的一种,顺序存储结构和链式存储结构实际是线性表的两种存储方式.而栈和队列都是两种重要的线性表结构.所以本文标题直接为线性表的顺序存储结构和链式存储结构. 开始比较两种不同的存储方式 一.顺序存储结构(也可称为顺序表) 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑

线性表的顺序存储结构

1.顺序表: 线性表占用的存储空间=n*sizeof(ElemType) n为线性表的长度,ElemType为线性表的元素类型,sizeof(ElemType)为每个元素所占存储空间大小(即字节数) 线性表的顺序存储结构利用数组实现,数组的基本类型是线性表中元素类型,数组大小大于等于线性表的长度. 基本运算实现: (1)建立顺序表 void CreateList(SqList *&L,ElemType a[],int n)    //由a中的n个元素建立顺序表 {  int i;    L=(S

线性表之顺序存储结构实现(上)

一,线性表的概念以及数学定义 1.线性表的概念 零个或多个数据元素的有限序列.首先说明这是一个序列,也就是说数据元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有且仅有一个前驱和后继. 2.数学定义 若将线性表记为(a1...ai-1,ai,ai+1....an),则线性表中,ai-1领先于ai,ai领先于ai+1,则称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素,当i=1,2....n-1的时候,ai有且仅有一个直接后继元素,当i=2,3

线性表之顺序存储结构(C语言动态数组实现)

线性表的定义:N个数据元素的有限序列 线性表从存储结构上分为:顺序存储结构(数组)和 链式存储结构(链表) 顺序存储结构:是用一段连续的内存空间存储表中的数据 L=(a1,a2,a3....an) 链式存储结构:是用一段一段连续的内存空间存储表中每一行的数据,段与段之间通过一个引用(指针)相互连接来,形成一个链式的存储结构 看到顺序存储结构的图示,我们可能会马上联想到C语言的数组.是的,数组就是一种典型的顺序存储数据结构.下面我通过一个实例,来实现对顺序存储结构中的数据增.删.改.查的操作. 首

线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文--线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构--顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素,元素在内存的物理存储次序与它们在线性表中的逻辑次序相同,即元素ai与其直接前驱ai-1及直接后继ai+1的存储位置相邻.顺序存储的线性表也成为顺序表(sequential list). 顺序表类SeqList提供线性表基于顺序存储结构的一种实现,它有两个私有成员变量table和n,

02.线性表(一)顺序存储结构

顺序存储结构 一.线性表基本概念 1.线性表定义 线性表(list)是指零个或多个数据元素的有限序列,所有数据元素为相同数据类型且一个数据元素可以由多个数据项组成.若将线性表记为(a1,..ai-1,ai,ai+1...,an),线性表元素的个数n(n>0,n=0时为空表)定义为线性表的长度,其中ai-1是ai 的直接前驱元素,ai+1是ai的直接后继元素. 2.线性表的抽象数据类型 ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,....an},每个元素的类型均匀Da

数据结构之线性表之顺序存储结构(3)

1 前言 经过前两张的理论基础,我相信大家都能简单的明白了数据结构和算法一些常用的概念了,从今天开始我们开始学习数据结构中线性表,一起叩响数据结构的大门. 2 详述 线性表(List):零个或者多个数据元素的有限序列. 如果用数学语言来进行定义: (声明:由于下标不是很好弄出来,所以只能表示下面这种方式了,请见谅!) 若线性表记作(a1,...ai-1,ai,ai+1,...,an),则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素.当i

2.2_线性表的顺序存储结构

[线性表的顺序存储从结构] 指的是用一段连续的存储单元一次储存线性表的数据元素. [线性表的顺序存储的结构代码] #define MAXSIZE 20 /*存储空间初始分配量*/ typedef int ElemType; /*ElemType类型依实际情况而定*/ typedef struct { Element data[MAXSIZE]; /*数组存储数据元素,最大值为MAXSIZE*/ int length; /*线性表当前长度为length*/ }SqlList; [线性表的顺序存储结

简要比较线性表的顺序存储结构和链式存储结构

我们分别从存储分配方式.时间性能.空间性能三方面来做对比. 存储分配方式 顺序存储结构用一段连续的存储单元依次存储线性表的数据元素. 单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 时间性能 <1>查找 顺序存储结构O(1) 单链表O(n) <2>插入和删除 顺序存储结构需要平均移动表长一半的元素,时间为O(n) 单链表在计算出某位置的指针后,插入和删除时间仅为O(1) 空间性能 顺序存储结构需要预分配存储空间,分大了,容易造成空间浪费,分小了,容易发生溢出. 单链