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

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

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 }
书到用时方恨少,是非经过不知难。 博观而约取,厚积而薄发。@karllen 每天进步一点点。
原文地址:https://www.cnblogs.com/Forever-Kenlen-Ja/p/3734349.html