对于线性表我们应掌握如下要点:
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 }
线性表运算--顺序存储结构实现,布布扣,bubuko.com
原文:http://www.cnblogs.com/Forever-Kenlen-Ja/p/3734349.html