1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #define N 64 //宏定义
5 typedef int datatype;
6 //线性表的结构体定义,连续存储空间,last用于表明最后一个数据元素的存储元素
7 typedef struct list
8 {
9 //线性表是一个连续存储空间,用数组表示
10 datatype data[N];
11 //连续存储空间,last用于表明最后一个数据元素的存储元素
12 int last;
13 }sqlist;//tyedef关键字表示 sqlist替代 struct sqlist
14 //给线性结构分配空间
15 sqlist * creat_list();
16 //为线性结构插入元素(在线性空间的最后一个元素之后插入)
17 int insert_list(sqlist * L,datatype value);//函数第一个形参需传入结构体指针,第二个形参传入的是插入的元素值
18 //判断线性结构是否满
19 int full_list(sqlist * L);
20 //打印输出线性结构内容
21 void show_list(sqlist * L);
22 //删除线性结构元素,删除线性空间最后一个元素
23 int del_list(sqlist * L);
24 //判断线性结构是否为空
25 int empty_list(sqlist * L);
26 //向线性结构按位置插入元素 需传入的参数为 构造体,插入位置,插入元素值
27 int add_pos_list(sqlist * L ,int pos,datatype value);
28 //删除指定位置元素
29 int del_pos_list(sqlist * L,int pos);
30 //根据数值更改数据元素
31 int change_bynum(sqlist * L,datatype old,datatype new);
32 //查找元素
33 int find_list(sqlist * L, datatype value);
34 //查找元素,删除重复项,比如输入1234554321,执行此函数之后是12345
35 void purge_list(sqlist *L);
36 void unio_list(sqlist *L1,sqlist *L2);
37 //L1和L2两个线性表,将两个线性表拼接在一起,比如L1:12345,
38 //L2:345678,执行函数结果为L1:12345678, L2:345678
39 int main(int argc, const char *argv[])
40 {
41 //定义sqlist结构体指针,并将由creat_list()开辟的内存空间首地址赋值给指针L
42 sqlist * L1 = creat_list();
43 sqlist * L2 = creat_list();
44 //判断是否成功调用creat_list()
45 if((L1=creat_list()) == NULL)
46 {
47 printf("函数调用失败");
48 //如果满足判断条件,表示creat_list()调用失败,返回值为-1,函数结束
49 return -1;
50 }
51 if((L2=creat_list()) == NULL)
52 {
53 printf("函数调用失败");
54 //如果满足判断条件,表示creat_list()调用失败,返回值为-1,函数结束
55 return -1;
56 }
57 insert_list(L1,1);
58 insert_list(L1,2);
59 insert_list(L1,3);
60 insert_list(L1,4);
61 insert_list(L1,5);
62 insert_list(L1,7);
63 insert_list(L1,8);
64 insert_list(L2,1);
65 insert_list(L2,3);
66 insert_list(L2,4);
67 insert_list(L2,5);
68 insert_list(L2,9);
69 insert_list(L2,2);
70 insert_list(L2,8);
71 unio_list(L1,L2);
72 show_list(L1);
73 show_list(L2);
74 free(L1);
75 free(L2);
76 return 0;
77 }
78
79 //给线性结构分配空间
80 sqlist * creat_list()
81 {
82 sqlist * L = NULL;
83 //sizeof表示结构体所占用的字节数,malloc该函数分配了的字节数,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)
84 L = (sqlist *)malloc(sizeof(sqlist));
85 //如果分配空间失败,返回以下内容
86 if (NULL == L)
87 {
88 printf("空间创建失败\n");
89 return NULL;
90 }
91 L->last = -1;
92 //需要返回值类型为结构体指针
93 return L;
94 }
95
96 //为线性结构插入元素
97 int insert_list(sqlist * L,datatype value)
98 {
99 //判断线性体元素是否已满
100 if(full_list(L))
101 {
102 printf("线性结构已存满\n");
103 insert_list(L,1);
104 return -1;
105 }
106 //L->last表示结构体中的last的值
107 L->data[L->last+1]=value;
108 //连续存储空间,last用于表明最后一个数据元素的存储元素
109 L->last++;
110 return 0;
111 }
112 //判断线性表是否满
113 int full_list(sqlist * L)
114 {
115 //last从0开始,需要<N-1,当等于N-1时表示表空间已满
116 return L->last==N-1?1:0;
117 }
118
119 //打印输出线性结构内容
120 void show_list(sqlist * L)
121 {
122 int i;
123 //遍历结构体
124 for(i = 0; i <= L->last; i++)
125 {
126 printf("%d ",L->data[i]);
127 }
128 printf("\n");
129 }
130
131 //删除线性结构元素
132 int del_list(sqlist * L)
133 {
134 //判断线性表是否满
135 if(empty_list(L))
136 {
137 printf("线性空间已空,没有元素");
138 return -1;
139 }
140 if(empty_list(L))
141 L->last--;
142 return 0;
143 }
144
145 //判断线性结构是否为空
146 int empty_list(sqlist * L)
147 {
148 return L->last == -1 ?1:0;
149 }
150
151 //向线性结构按位置插入元素
152 int add_pos_list(sqlist * L ,int pos,datatype value)
153 {
154 int i;
155 if(full_list(L))
156 {
157 printf("线性结构已存满\n");
158 return -1;
159 }
160 if(pos < 0||pos > L->last+1)
161 {//判断如果所查找位置已超出线性表空间,注意在last+1(即在最后一个元素之后插入也满足线性表)
162 printf("超出范围,插入失败\n");
163 return -1;
164 }
165 for(i = L->last+1; i > pos; i--)
166 {
167 L->data[i] = L->data[i-1];
168 }
169 L->data[pos] = value;
170 L->last++;
171 return 0;
172 }
173
174 //删除指定位置元素
175 int del_pos_list(sqlist * L,int pos)
176 {
177 int i;
178 //判断线性表是否为空
179 if(empty_list(L))
180 {
181 printf("线性空间为空,无法删除\n");
182 return -1;
183 }
184 if(pos < 0 || pos >L->last)
185 {
186 printf("超出范围,无法删除\n");
187 return -1;
188 }
189 for(i = pos; i < L->last; i++)
190 {
191 L->data[i] = L->data[i+1];
192 }
193 L->last--;
194 return 0;
195 }
196
197
198 //根据数值更改数据元素,根据特定值进行替换
199 int change_bynum(sqlist * L,datatype old, datatype new)
200 {
201 int i;
202 for(i = 0; i <= L->last;i++)
203 {
204 if(old == L->data[i])
205 {
206 L->data[i] = new;
207 }
208 }
209 return 0;
210 }
211
212
213 //查找元素,根据特定值
214 int find_list(sqlist * L, datatype value)
215 {
216 int i;
217 for(i = 0; i <= L->last;i++)
218 {
219 if(L->data[i] == value)
220 return 1;
221 }
222 return 0;
223 }
224 //查找元素,删除重复项,比如输入1234554321,执行此函数之后是12345
225 void purge_list(sqlist *L)
226 {
227 int i,j;
228 for(i = 0; i < L->last; i++)
229 {
230 for(j = i + 1; j <=L->last; j++)
231 {
232 if(L->data[i] == L->data[j])
233 {
234 del_pos_list(L,j);
235 j--;
236 }
237 }
238 }
239 }
240
241
242 //L2:345678,执行函数结果为L1:12345678, L2:345678
243 //L1和L2两个线性表,将两个线性表拼接在一起,比如L1:12345,
244 void unio_list(sqlist *L1,sqlist *L2)
245 {
246 int i,j;
247 for(i = 0; i <= L2->last; i++)
248 {
249 if(find_list(L1,L2->data[i]) == 0)
250 {
251 insert_list(L1,L2->data[i]);
252 }
253 }
254 }