1 /***顺序表上的基本操作实现***/
2
3
4 #include <iostream>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #define SIZE 1008
9
10 #define LIST_INIT_SIZE 100
11 #define LISTINCREMENT 10
12
13 #define OK 1
14 #define ERROR 0
15
16
17 using namespace std;
18
19 typedef int ElemType;
20
21 typedef struct
22 {
23 ElemType *elem;
24 int length;
25 int listsize;
26 } SqList;
27
28 ///初始化
29 int InitList_Sq(SqList &L)
30 {
31 //构造一个空的线性表L
32 L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
33 if(!L.elem)
34 {
35 exit(0);
36 }
37 L.length = 0;
38 L.listsize = LIST_INIT_SIZE;
39 return OK;
40 }
41
42 ///线性表的创建和插入
43 int ListInsert_Sq(SqList &L,int index,ElemType ELEM)
44 {
45 ElemType *newbase,*p,*q;
46 if(1 > index||index > L.length + 1)
47 {
48 return ERROR;
49 }
50 if(L.length >= L.listsize) //当前存储空间已满,增加分配
51 {
52 newbase = (ElemType*)realloc(L.elem,
53 (L.listsize + LISTINCREMENT)*sizeof(ElemType));
54 if(!newbase)
55 {
56 exit(0);
57 }
58 L.elem = newbase;
59 L.listsize += LISTINCREMENT;
60 }
61
62 q = &(L.elem[index - 1]);
63 for(p = &(L.elem[L.length - 1]); p >= q; --p)
64 {
65 *(p + 1) = *p;
66 }
67 *q = ELEM;
68 ++L.length;
69
70 return OK;
71 }
72 void Creat_List_Sq(SqList &L,int Length)
73 {
74 ElemType ELEM;
75 int index = 1;
76 while(index <= Length)
77 {
78 scanf("%d",&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 puts("This is a empty List./n");
91 }
92 while(i < L.length)
93 {
94 printf("%d ",L.elem[i++]);
95 }
96 printf("/n");
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 ///逆转线性表元素
146 void SWAP(int *m,int *n)
147 {
148 int iTemp = *m;
149 *m = *n;
150 *n = iTemp;
151 }
152 void ReversalList_Sq(SqList &L)
153 {
154 int m = 0,n = L.length - 1;
155 while(m <= n)
156 {
157 SWAP(&L.elem[m],&L.elem[n]);
158 m ++,n --;
159 }
160
161 }
162
163 ///线性表合并
164 void MergeList(SqList La,SqList Lb,SqList &Lc)
165 {
166 InitList_Sq(Lc);
167 int i,j;
168 i = j = 1;
169 int k = 0;
170 ElemType ai,bj;
171 int La_len = La.length,Lb_len = Lb.length;
172
173 while((i <= La_len)&&(j <= Lb_len))
174 {
175 ai = La.elem[i-1];
176 bj = Lb.elem[j-1];
177 if(ai <= bj)
178 {
179 ListInsert_Sq(Lc, ++k, ai);
180 ++ i;
181 }
182 else
183 {
184 ListInsert_Sq(Lc, ++k, bj);
185 ++ j;
186 }
187 }
188 while(i <= La_len)
189 {
190 ai = La.elem[i-1];
191 i ++;
192 ListInsert_Sq(Lc, ++k, ai);
193 }
194 while(j <= Lb_len)
195 {
196 bj = Lb.elem[j-1];
197 j ++;
198 ListInsert_Sq(Lc, ++k, bj);
199 }
200 }
201 int main(void)
202 {
203 int LENGTH_La,LENGTH_Lb;//线性表La的长度
204 SqList La,Lb,Lc; //
205
206 scanf("%d",&LENGTH_La);
207 InitList_Sq(La);
208 Creat_List_Sq(La,LENGTH_La);
209 printf("创建好的线性表La=");
210 Output_List_Sq(La);
211
212 int index;
213 ElemType ELEM_1;
214 scanf("%d%d", &ELEM_1, &index);
215 ListInsert_Sq( La, index, ELEM_1);
216 printf("插入一个元素后的线性表La=");
217 Output_List_Sq(La);
218
219 scanf("%d", &index);
220 ListDelete_Sq( La, index, ELEM_1);
221 printf("删除一个元素后的线性表La=");
222 Output_List_Sq(La);
223
224 scanf("%d",&ELEM_1);
225 if(SearchList_Sq(La,ELEM_1) == -1)
226 {
227 puts("没找到");
228 }
229 else
230 {
231 printf("找到,%d在第%d个位置/n",ELEM_1,SearchList_Sq(La,ELEM_1));
232 }
233
234 ReversalList_Sq(La);
235 printf("逆置后的线性表La=");
236 Output_List_Sq(La);
237
238 scanf("%d",&LENGTH_Lb);
239 InitList_Sq(Lb);
240 Creat_List_Sq(Lb,LENGTH_Lb);
241
242 MergeList( La, Lb, Lc);
243 printf("合并La和Lb后的线性表=");
244 Output_List_Sq(Lc);
245
246 return 0;
247 }