1 /***顺序表上的基本操作实现***/
2
3 #include <iostream>
4
5 #define SIZE 1008
6
7 #define LIST_INIT_SIZE 100
8 #define LISTINCREMENT 10
9 #define OVERFLOW 0
10
11 #define OK 1
12 #define ERROR 0
13
14
15 using namespace std;
16
17 typedef int ElemType;
18
19 typedef struct
20 {
21 ElemType *elem;
22 int length;
23 int listsize;
24 } SqList;
25
26 ///初始化
27 int InitList_Sq(SqList &L)
28 {
29 //构造一个空的线性表L
30 L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
31 if(!L.elem)
32 {
33 exit(OVERFLOW);
34 }
35 L.length = 0;
36 L.listsize = LIST_INIT_SIZE;
37 return OK;
38 }
39
40 ///线性表的创建和插入
41 int ListInsert_Sq(SqList &L,int index,ElemType ELEM)
42 {
43 ElemType *newbase,*p,*q;
44 if(1 > index||index > L.length + 1)
45 {
46 return ERROR;
47 }
48 if(L.length >= L.listsize)
49 {
50 newbase = (ElemType*)realloc(L.elem,
51 (L.listsize + LISTINCREMENT)*sizeof(ElemType));
52 if(!newbase)
53 {
54 exit(0);
55 }
56 L.elem = newbase;
57 L.listsize += LISTINCREMENT;
58 }
59
60 q = &(L.elem[index - 1]);
61 for(p = &(L.elem[L.length - 1]); p >= q; --p)
62 {
63 *(p + 1) = *p;
64 }
65 *q = ELEM;
66 ++L.length;
67
68 return OK;
69 }
70
71 void Creat_List_Sq(SqList &L,int Length)
72 {
73 ElemType ELEM;
74 int index = 1;
75 while(index <= Length)
76 {
77 cout << "请输入元素 " << index << endl;
78 cin >> ELEM;
79 ListInsert_Sq( L, index, ELEM);
80 index ++;
81 }
82 }
83
84 ///线性表的输出
85 void Output_List_Sq(SqList L)
86 {
87 int i = 0;
88 if(L.length == 0)
89 {
90 cout << "This is a empty List.";
91 }
92 while(i < L.length)
93 {
94 cout << L.elem[i++] << " ";
95 }
96 cout << endl;
97 }
98
99 ///线性表元素删除
100 int ListDelete_Sq(SqList &L,int index,ElemType &ELEM)
101 {
102 ElemType *p,*q;
103 if(index < 1||index > L.length)
104 {
105 exit(0);
106 }
107 p = &(L.elem[index - 1]);
108 ELEM = *p;
109 q = L.elem + L.length -1;
110 for(++ p; p <= q; ++ p)
111 {
112 *(p - 1) = *p;
113 }
114 -- L.length;
115 return OK;
116 }
117
118 ///线性表元素的查找,==>二分法查找
119 int SearchList_Sq(SqList L,ElemType ELEM)
120 {
121 int low,high,mid;
122
123 low = 0;
124 high = L.length - 1;
125
126 while(low <= high)
127 {
128 mid = (low + high)/2;
129 if(ELEM > L.elem[mid])
130 {
131 high = mid - 1;
132 }
133 else if(ELEM < L.elem[mid])
134 {
135 low = mid + 1;
136 }
137 else
138 {
139 return mid+1;
140 }
141 }
142 return -1;
143 }
144
145 void SWAP(int *m,int *n)
146 {
147 int iTemp = *m;
148 *m = *n;
149 *n = iTemp;
150 }
151
152 ///逆转线性表元素
153 void ReversalList_Sq(SqList &L)
154 {
155 int m = 0,n = L.length - 1;
156 while(m <= n)
157 {
158 SWAP(&L.elem[m],&L.elem[n]);
159 m ++,n --;
160 }
161
162 }
163
164 ///线性表合并
165 void MergeList(SqList La,SqList Lb,SqList &Lc)
166 {
167 InitList_Sq(Lc);
168 int i,j;
169 i = j = 1;
170 int k = 0;
171 ElemType ai,bj;
172 int La_len = La.length,Lb_len = Lb.length;
173
174 while((i <= La_len)&&(j <= Lb_len))
175 {
176 ai = La.elem[i-1];
177 bj = Lb.elem[j-1];
178 if(ai <= bj)
179 {
180 ListInsert_Sq(Lc, ++k, ai);
181 ++ i;
182 }
183 else
184 {
185 ListInsert_Sq(Lc, ++k, bj);
186 ++ j;
187 }
188 }
189 while(i <= La_len)
190 {
191 ai = La.elem[i-1];
192 i ++;
193 ListInsert_Sq(Lc, ++k, ai);
194 }
195 while(j <= Lb_len)
196 {
197 bj = Lb.elem[j-1];
198 j ++;
199 ListInsert_Sq(Lc, ++k, bj);
200 }
201 }
202 int main(void)
203 {
204 int LENGTH_La,LENGTH_Lb;//线性表La的长度
205 SqList La,Lb,Lc; //
206
207 cout << "输入线性表长度: ";
208 cin >> LENGTH_La;
209 InitList_Sq(La);
210 Creat_List_Sq(La,LENGTH_La);
211 cout << "创建好的线性表La=";
212 Output_List_Sq(La);
213
214 int index;
215 ElemType ELEM_1;
216 cout << "请输入一个数以及要插入的位置" << endl;
217 cin >> ELEM_1 >> index;
218 ListInsert_Sq( La, index, ELEM_1);
219 cout << "插入一个元素后的线性表La=" << endl;
220 Output_List_Sq(La);
221
222 cout << "请输入一个要删除的元素位置:" << endl;
223 cin >> index;
224 ListDelete_Sq( La, index, ELEM_1);
225 cout << "删除一个元素后的线性表La=" << endl;
226 Output_List_Sq(La);
227
228 cout << "请输入一个要查找的元素:" << endl;
229 cin >> ELEM_1;
230 if(SearchList_Sq(La,ELEM_1) == -1)
231 {
232 cout << "没找到" << endl;
233 }
234 else
235 {
236 cout << "找到," << ELEM_1 << "在第" << SearchList_Sq(La,ELEM_1) << "个位置" << endl;
237 }
238
239 ReversalList_Sq(La);
240 cout << "逆置后的线性表La=";
241 Output_List_Sq(La);
242
243 cout << "输入Lb线性表长度:";
244 cin >> LENGTH_Lb;
245 InitList_Sq(Lb);
246 Creat_List_Sq(Lb,LENGTH_Lb);
247
248 MergeList( La, Lb, Lc);
249 cout << "合并La和Lb后的线性表=";
250 Output_List_Sq(Lc);
251
252 return 0;
253 }