数据结构之顺序表(一)

  顺序表和数组的操作特别相近,我在学习数据结构的时候采用的是郝斌老师推荐的书籍《数据结构算法实现与分析》,这本书是由西安交大高义凡教授

编写的,是一本特别好的教材,该教材实现了严蔚敏版的《数据结构》中的所有伪代码。我在随笔中用的大部分是高义凡老师的代码,因为我经常忘记一些

知识点,所以想把这些优秀的代码,添加进随笔里面,方便我日后进行学习。现在国家在版权方面控制的特别严,希望高老师看见后,理解一下,我也会注

名这些程序的引用。

  顺序表头文件:

 1 #pragma once
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<iostream>
 5 #include<string>
 6 #include<malloc.h>
 7 #include<io.h>
 8 #include<math.h>
 9 
10 #define TRUE   1
11 #define FALSE  0
12 #define OK     1
13 #define ERROR  0
14 
15 typedef int ElemType;
16 typedef int Boolean;
17 typedef int Status;
18 
19 using namespace std;
20 
21 #define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量
22 #define LIST_INCREMENT 2 // 线性表存储空间的分配增量
23 
24 struct SqList
25 {
26     ElemType *elem;  //存储空间
27     int length;     //元素个数
28     int listsize;  //当前分配的容量
29 };
30 
31 
32 void InitSeqList(SqList &L); //初始化
33 int ListLength(SqList &L);   //线性表长度
34 Status GetElem(SqList &L, int pos, int &elem); //获取指定位置的元素
35 int LocateElem(SqList &L, ElemType e);  //找到指定元素的位置
36 Status ListInsert(SqList &L, int pos, ElemType elem); //插入元素
37 void Union(SqList &La, SqList &Lb);  //合并
38 void ListTraverse(SqList &L);
View Code

  顺序表函数模块实现(实现顺序表的增、删、改、查):

但是在该模块中,实现两个顺序表的合并。

 1 #include"SeqList.h"
 2 
 3 
 4 void InitSeqList(SqList &L) {
 5     L.elem = (ElemType*)malloc(LIST_INIT_SIZE * sizeof(ElemType));
 6     if (L.elem == NULL) {
 7         exit(0);
 8     }
 9     L.length = 0;
10     L.listsize = LIST_INIT_SIZE;
11 }
12 
13 int ListLength(SqList &L) {
14     return L.length;
15 }
16 
17 Status GetElem(SqList &L, int pos, int &elem) {
18     if (pos<1 || pos>L.length) {
19         return FALSE;
20     }
21     elem = *(L.elem + pos - 1);
22     return TRUE;
23 
24 }
25 
26 int LocateElem(SqList &L, ElemType e) {
27     int pos = 1;
28     while (pos<=L.length && e!=*(L.elem+pos-1))
29     {
30         ++pos;
31     }
32     if (pos <= L.length)
33         return pos;
34     else
35         return 0;
36 }
37 
38 Status ListInsert(SqList &L, int pos, ElemType elem) {
39     ElemType *newbase=NULL;
40     ElemType *p, *q;
41     if (pos<1 || pos>L.length + 1)
42         return FALSE;
43     if (L.length >= L.listsize) {
44         newbase = (ElemType *)realloc(L.elem, (L.listsize + LIST_INCREMENT) * sizeof(ElemType));
45         if (newbase) {
46             L.elem = newbase;
47             L.listsize += LIST_INCREMENT;
48         }
49         else
50         {
51             exit(0);
52         }
53     }
54     q = L.elem + pos - 1; //q插入的位置
55     for (p = L.elem + L.length - 1; p >= q; --p) {
56         *(p + 1) = *p;
57     }
58     *q = elem;
59     ++L.length;
60     return OK;
61 
62 }
63 
64 void Union(SqList &La, SqList &Lb) {
65     ElemType e;
66     int La_len, Lb_len;
67     La_len = ListLength(La); // 求线性表的长度
68     Lb_len = ListLength(Lb);
69     for (int i = 1; i <= Lb_len; i++) {
70         GetElem(Lb, i, e); // 取Lb中第i个数据元素赋给e
71         if (!LocateElem(La, e)) // La中不存在和e相同的元素,则插入之
72             ListInsert(La, ++La_len, e);
73     }
74 }
75 
76 void ListTraverse(SqList &L) {
77     ElemType *p = NULL;
78     p = L.elem;
79     for (int i = 1; i <= L.length; i++) {
80         cout << *(p + i - 1) << " ";
81     }
82     cout << endl;
83 }
View Code

  接下来是主函数的实现:

  

 1 #include"SeqList.h"
 2 
 3 int main(int argc, char *argv[]) {
 4     SqList La, Lb;
 5     InitSeqList(La);
 6     for (int j = 1; j <= 5; j++) {
 7         ListInsert(La, j, j);
 8     }
 9     cout << "LA=";
10     ListTraverse(La);
11     InitSeqList(Lb);
12     for (int i = 0; i <= 5; i++) {
13         ListInsert(Lb, i, 2 * i);
14     }
15     cout << "LB=";
16     ListTraverse(Lb);
17     Union(La, Lb);
18     cout << "LC=";
19     ListTraverse(La);
20     return 0;
21 }
View Code

在vs2015上运行如图所示:

  

猜你喜欢

转载自www.cnblogs.com/xuelanga000/p/11373294.html