顺序表静态存储
数组空间由编译器固定分配,程序执行结后此空间自动释放,可按照数组元素的下标(位置)存取任一元素的值,所化费时间相同。一旦数据空间占满,再加入新的数据就将产生
溢出,此时存储空间不能扩充,就会导致程序停止工作
1 //顺序表静态存储
2 #define maxSize 100
3 typedef int DataType;
4 typedef struct
5 {
6 DataType data[maxSize];
7 int n;
8 }SeqList;
9
10
顺序表动态存储
通过动态存储分配的语句malloc或new动态分配的,一旦数据空间占满,可以另外再分配一块更大的空间,用以代换原来的存储空间,而达到扩充存储数组空间的目的
11 //顺序表动态存储
12 #define initSize 100
13 typedef int DataType;
14 typedef struct
15 {
16 DataType *data;
17 int maxSize, n;
18 }SeqList;
19 //顺序表主要操作实现
20 //顺序表的动态存储表示的初始化处理
21 void initList(SeqList &L)
22 {
23 L.data = new DataType[initList];
24 if(!L.data)
25 {
26 cerr<<"存储分配错误!\n";
27 exit(1);
28 }
29 L.maxSize = initSize;
30 L.n = 0;
31 }
32 //清空顺序表
33 void clearList(SeqList& L)
34 {
35 L.n = 0;//顺序表当前长度置为0
36 }
37 //计算顺序表长度
38 void Length(SeqList)
39 {
40 return L.n;//返回顺序表的当前长度
41 }
42 //判表空否
43 int ieEmpty(SeqList& L)
44 {
45 return (L.n == 0)?1:0;
46 }
47 //判表满否
48 int is Full(SeqList)
49 {
50 return (L.n == L.maxSize)?1:0;
51 }
52 //顺序表查找算法
53 int Search(SeqList& L, int i)// 在顺序表查找与值x匹配的位置,查找成功则函数返回该元素的位置,否则函数返回0
54 {
55 for(i = 1; i<=L.n; i++)
56 {
57 if(L.data[i-1] == x)//顺序查找
58 return i;
59 }
60 return 0;//查找失败
61 }
62 //顺序表定位算法
63 int Locate(SeqList& L, int i)//函数返回第i个元素的位置
64 {
65 if(i>1 && i<L.n)
66 return i;
67 else
68 return 0;
69 }
70 //顺序表复制算法
71 int Copy(SeqList& L1, SeqList& L2)//L1,L2存在且L1为空,将L2复制到L1中
72 {
73 L1.maxSize = L2.maxSize;
74 L1.n = L2.n;
75 if(!L1.data)
76 {
77 L1.data = new DataType[L1.maxSize];//创建顺序表存储数组
78 if(!L1.data)//链接stdlib.h和iostream.h
79 {
80 cout<<"内存分配错误!"<<endl;
81 exit(1);
82 }
83 }
84 for(int i=1; i<=L; i++)
85 {
86 L1.data[i-1] = L2.data[i-1];
87 }
88 }
89 //顺序表插入算法
90 int Insert(SeqList& L, int i;, DataType& x)
91 {
92 //将新元素插入到表中第i个位置,若插入成功函数返回1,否则返回0
93 if(L.n == L.maxSize)//表满,不能插
94 return 0;
95 if(i<0 || i>L.n+1)//参数i不合理,不能插入
96 return 0;
97 for(int j=L.n; j>=i; j--)//依次后移,空出第i号位置
98 {
99 L.data[j] = L.data[j-1];
100 }
101 L.data[i-1] = x;//插入
102 L.n++; //表长度加1
103 return 1; //插入成功
104 }
105 //顺序表删除算法
106 int Remove(SeqList& L, int i, DataType& x)
107 {
108 //删除顺序表第i个元素,通过引用型参数x返回删除元素的值
109 //若删除成功则函数返回1,否则返回0
110 if(!L.n)//表空,不能删除
111 return 0;
112 if(i<0 || i>L.n)//参数i不合理,不能删除
113 return 0;
114 x = L.sata[i-1];//存被删元素的值
115 for(int j = i; j<L.n; j++)//依次前移,填补
116 L.data[j-1] = L.data[j];
117 L.n--; //表长度减1
118 return 1;//删除成功
119 }
120
121
122
123
124 //举例
125 //集合的并运算的实现
126 void Merge(SeqList& LA, SeqList& LB)
127 {
128 //合并顺序表LA和LB,结果存于LA,重复元素只留一个
129 int n=Length(LA), m=Length(LB), i, k, x;
130 for(i=1; i<=m; i++)
131 {
132 x = LB.data[i-1];//在LB中取一元素
133 k = Search(LA, x);//在LA中查找它
134 if(k == 0)//若在LA中未找到则将它插入到LA中
135 {
136 Insert(LA, n+1, x);//插入到第n个元素后
137 n++;
138 }
139 }
140 }
141 //集合的交运算的实现
142 void Intersection(SeqList& LA, SeqList& LB)
143 {
144 //求顺序表LA和LB中的共有元素,结果存于LA
145 int n=Length(LA), m=Length(LB), i=1, k, x;
146 while(i <= n)
147 {
148 x = LA.data[i-1]; //在LA取一元素
149 k = Search(LB, x);//在LB中查找它
150 if(k == 0)//若在LB中未找到则从LA中删除它
151 {
152 Remove(LA, i, x);//在LA中删除它
153 n--;
154 }
155 else
156 i++;
157 }
158 }