1 #ifndef __STATIC_SEQ__
2 #define __STATIC_SEQ__
3 #include
4 #include
5 #define MAX 40
6 typedef int datatype;
7 typedef struct
8 {
9 int len;
10 datatype data[MAX];
11 }seq,*snode;
12
13 //创建顺序表
14 seq * create_seq();
15 //判空
16 int list_empty(seq *s);
17 //判满
18 int list_full(seq *s);
19 //添加元素
20 int add_list(seq*s,datatype x);
21 //遍历
22 void output_list(seq*s);
23 //任意位置插入
24 int insert_node(seq*s,int i,datatype x);
25 //任意位置删除
26 datatype delete_node(seq*s,int i);
27 //按位置修改
28 int pos_change_node(seq*s,int i,datatype x);
29 //按值修改
30 int values_change(seq*s,datatype x,datatype y);
31 //查询指定位置元素
32 datatype query_value(seq*s,int i);
33 //按值进行查找元素
34 int list_search_value(seq*s,datatype x);
35 //将顺序表排序,选择排序 0为降序1为升序
36 void list_sort(seq*s ,int st);
37 //顺序表去重
38 int delete_revalue(seq*s);
39 //扩容
40 seq *expand(seq*s);
41 //求最值
42 datatype list_mvalue(seq*s,int flag);
43 //顺序表反转
44 int list_revers(seq *s);
45 #endif
1 #ifndef __STATIC_SEQ__
2 #define __STATIC_SEQ__
3 #include
4 #include
5 #define MAX 40
6 typedef int datatype;
7 typedef struct
8 {
9 int len;
10 datatype data[MAX];
11 }seq,*snode;
12
13 //创建顺序表
14 seq * create_seq();
15 //判空
16 int list_empty(seq *s);
17 //判满
18 int list_full(seq *s);
19 //添加元素
20 int add_list(seq*s,datatype x);
21 //遍历
22 void output_list(seq*s);
23 //任意位置插入
24 int insert_node(seq*s,int i,datatype x);
25 //任意位置删除
26 datatype delete_node(seq*s,int i);
27 //按位置修改
28 int pos_change_node(seq*s,int i,datatype x);
29 //按值修改
30 int values_change(seq*s,datatype x,datatype y);
31 //查询指定位置元素
32 datatype query_value(seq*s,int i);
33 //按值进行查找元素
34 int list_search_value(seq*s,datatype x);
35 //将顺序表排序,选择排序 0为降序1为升序
36 void list_sort(seq*s ,int st);
37 //顺序表去重
38 int delete_revalue(seq*s);
39 //扩容
40 seq *expand(seq*s);
41 //求最值
42 datatype list_mvalue(seq*s,int flag);
43 //顺序表反转
44 int list_revers(seq *s);
45 #endif
ubuntu@ubuntu:03day$
ubuntu@ubuntu:03day$ cat -n static_seq_fun.c
1 #include"static_seq.h"
2 //创建顺序表表
3 seq * create_seq()
4 {
5 seq * s = (seq *)malloc(sizeof(seq));
6 if (!s)
7 {
8 printf("申请空间失败,建表失败!\n");
9 return NULL;
10 }
11 else
12 {
13 printf("建表成功!\n");
14 //memset(s->data,0,sizeof(s->data));
15 s->len = 0;
16 printf("初始化完成!\n");
17 }
18 return s;
19 }
20
21 //判空
22 int list_empty(seq *s)
23 {
24 if (!s)
25 {
26 printf("未创建顺序表!\n");
27 return 0;
28 }
29 return s->len == 0;
30 }
31 //判满
32 int list_full(seq *s)
33 {
34 if (!s)
35 {
36 printf("未创建顺序表!\n");
37 return 0;
38 }
39 return (s->len >= MAX);
40 }
41
42 //添加元素
43 int add_list(seq*s,datatype x)
44 {
45 if (!s)
46 {
47 printf("申请空间失败,建表失败!\n");
48 return 0;
49 }
50 if (list_full(s))
51 {
52 printf("表满,插个p!\n");
53 return 0;
54 }
55 s->data[s->len] = x;
56 (s->len)++;
57 printf("第%d添加成功!\n",s->len);
58 return 1;
59 }
60
61 //遍历
62 void output_list(seq*s)
63 {
64 if (!s)
65 {
66 printf("创建表了吗?滚犊子!\n");
67 return;
68 }
69 if (list_empty(s))
70 {
71 printf("表空,打印个锤子!\n");
72 return;
73 }
74 int i;
75 for (i=0;ilen;i++)
76 printf("%d\n",s->data[i]);
77 printf("输出完成!\n");
78 }
79 //任意位置插入
80 int insert_node(seq*s,int i,datatype x)
81 {
82 if (!s)
83 {
84 printf("创建表了吗?滚犊子!\n");
85 return 0;
86 }
87 if (list_full(s))
88 {
89 printf("没位置了兄弟,插个鬼哦!\n");
90 return 0;
91 }
92 if (i-1>s->len || i<0)
93 {
94 printf("插你身上\n");
95 }
96 int j;
97 for (j=s->len;j>i-1;j--)
98 s->data[j] = s->data[j-1];
99 s->data[i-1] = x;
100 (s->len)++;
101 printf("插入成功!\n");
102 return 1;
103
104 }
105 //任意位置删除
106 datatype delete_node(seq*s,int i)
107 {
108 if (!s)
109 {
110 printf("创建表了吗?滚犊子!\n");
111 return 0;
112 }
113 if (list_empty(s))
114 {
115 printf("表空,把你删了!\n");
116 return 0;
117 }
118 if (i>s->len || i<0)
119 {
120 printf("没有这个位置啊哥哥!\n");
121 }
122 int j;
123 datatype x= s->data[i-1];
124 for (j=i-1;jlen;j++)
125 s->data[j]=s->data[j+1];
126 (s->len)--;
127 printf("已经删除第%d个数据:%d\n",i,x);
128 return x;
129 }
130 //按位置修改
131 int pos_change_node(seq*s,int i,datatype x)
132 {
133 if (!s)
134 {
135 printf("创建表了吗?滚犊子!\n");
136 return 0;
137 }
138 if (list_empty(s))
139 {
140 printf("表空!\n");
141 return 0;
142 }
143 if (i>s->len || i<0)
144 {
145 printf("没有这个位置啊哥哥!\n");
146 }
147 datatype data = s->data[i-1];
148 s->data[i-1]=x;
149 printf("第%d个元素修改前:%d,修改后:%d\n",i,data,s->data[i-1]);
150 }
151 //按值修改
152 int values_change(seq*s,datatype x,datatype y)
153 {
154 if (!s)
155 {
156 printf("创建表了吗?滚犊子!\n");
157 return 0;
158 }
159 if (list_empty(s))
160 {
161 printf("表空!\n");
162 return 0;
163 }
164 int i;
165 for (i=0;ilen;i++)
166 {
167 if (s->data[i] == y)
168 {
169 s->data[i] = x;
170 }
171 }
172 printf("修改完成!\n");
173 return 1;
174 }
175 //查询指定位置元素
176 datatype query_value(seq*s,int i)
177 {
178 if (!s)
179 {
180 printf("创建表了吗?滚犊子!\n");
181 return 0;
182 }
183 if (list_empty(s))
184 {
185 printf("表空!\n");
186 return 0;
187 }
188 printf("第%d个元素是%d\n",i,s->data[i-1]);
189 return s->data[i-1];
190 }
191 //按值进行查找元素
192 int list_search_value(seq*s,datatype x)
193 {
194 if (!s)
195 {
196 printf("创建表了吗?滚犊子!\n");
197 return 0;
198 }
199 if (list_empty(s))
200 {
201 printf("表空!\n");
202 return 0;
203 }
204 int j;
205 int flag=0;
206 printf("第");
207 for (j=0;jlen;j++)
208 {
209 if (s->data[j] == x)
210 {
211 printf("%d ",j+1);
212 flag = 1;
213 }
214 }
215 if (flag)
216 {
217 printf("个元素的值是%d\n",x);
218 }
219 else
220 {
221 printf("没找到!\n");
222 }
223
224 return 1;
225
226 }
227 //将顺序表排序,选择排序 0为降序1为升序
228 void list_sort(seq*s ,int st)
229 {
230 if (!s)
231 {
232 printf("创建表了吗?滚犊子!\n");
233 return;
234 }
235 if (list_empty(s))
236 {
237 printf("表空!\n");
238 return;
239 }
240 int i,j;
241 int id;
242 for (i=0;ilen-2;i++)
243 {
244 id = i;
245 for (j=i+1;jlen;j++)
246 {
247 if (s->data[id]data[j] && st == 0 || s->data[id]data[j] && st == 0 )
248 {
249 id = j;
250 }
251 }
252 datatype temp = s->data[i];
253 s->data[i] = s->data[id];
254 s->data[id] = temp;
255 }
256 }
257 //顺序表去重
258 int delete_revalue(seq*s)
259 {
260 if (!s)
261 {
262 printf("创建表了吗?滚犊子!\n");
263 return 0;
264 }
265 if (list_empty(s))
266 {
267 printf("表空!\n");
268 return 0;
269 }
270 int i,j;
271 for (i=0;ilen-1;i++)
272 {
273 for (j=i+1;jlen;j++)
274 {
275 if (s->data[i] == s->data[j])
276 {
277 delete_node(s,j+1);
278 j=j-1;
279 }
280 }
281 }
282 return 1;
283 }
284 //扩容
285 seq *expand(seq*s)
286 {
287 char flag;
288 printf("是否扩容(y/n):");
289 scanf("%c",&flag);
290 if (flag == 'y' || flag == 'Y')
291 {
292 seq *p = realloc(s,sizeof(seq)+sizeof(s->data));
293 if (p==NULL)
294 {
295 printf("扩容失败!");
296 return NULL;
297 }
298 return p;
299 }
300 }
301 //求最值
302 datatype list_mvalue(seq*s,int flag)
303 {
304 if (!s)
305 {
306 printf("创建表了吗?滚犊子!\n");
307 return 0;
308 }
309 if (list_empty(s))
310 {
311 printf("表空!\n");
312 return 0;
313 }
314 datatype num=s->data[0];
315 for (int j=1;jlen;j++)
316 {
317 if (num < s->data[j] && flag == 1 || num > s->data[j] && flag == 0)
318 num = s->data[j];
319 }
320 if (flag == 1)
321 printf("max:%d\n",num);
322 else
323 printf("min:%d\n",num);
324 }
325 //顺序表反转
326 int list_revers(seq *s)
327 {
328 if (!s)
329 {
330 printf("创建表了吗?滚犊子!\n");
331 return 0;
332 }
333 if (list_empty(s))
334 {
335 printf("表空!\n");
336 return 0;
337 }
338 int l=0,r=s->len-1;
339 while(ldata[l];
342 s->data[l] = s->data[r];
343 s->data[r] = temp;
344 l++;
345 r--;
346 }
347 }
348 //释放顺序表
1 #include"static_seq.h"
2
3 int main(int argc, const char *argv[])
4 {
5 seq * s = create_seq();
6 #if 0
7 add_list(s,8);
8 add_list(s,4);
9 add_list(s,2);
10 add_list(s,9);
11 add_list(s,7);
12 int i;
13 for (i=0;i<3;i++)
14 {
15 add_list(s,10);
16 }
17 add_list(s,11);
18 delete_revalue(s);
19 output_list(s);
20 insert_node(s,1,3);
21 output_list(s);
22 delete_node(s,1);
23 output_list(s);
24 pos_change_node(s,1,3);
25 output_list(s);
26 values_change(s,8,4);
27 output_list(s);
28 query_value(s,3);
29 list_search_value(s,8);
30 list_sort(s,0);
31 list_mvalue(s,0);
32 output_list(s);
33 list_revers(s);
34 output_list(s);
35 #endif
36 #if 1
37 printf("%ld %ld\n",sizeof(seq),sizeof(s->data));
38 int i;
39 for (i=0;i<40;i++)
40 {
41 add_list(s,7);
42 }
43 s = expand(s);
44 s->data[41]=3;
45 s->data[42]=45;
46 printf("%d\n",s->data[42]);
47 printf("%ld %ld\n",sizeof(seq),sizeof(s->data));
48
49 #endif
50 return 0;
51 }
Static,顾名思义是静态、静止的意思,个人理解的含义是私有、静态。
私有就是隐藏。
static函数只能声明后的本文中调用
static全局变量只能声明后的本文中调用
static局部变量只能声明后的本函数调用
静态就是一直存在,相对于每次调用动态分配而言。
static函数(未验证是否每次调用代码地址都是一致的)
static全局变量生命周期到程序或进程结束;
static局部变量生命周期到程序或进程结束。
const
在C语言中的用法==const==修饰的变量是只读的,本质还是变量
==const==修饰的局部变量在栈上分配空间
==const==修饰的全局变量在全局数据区分配空间
==const==只在编译期有用,在运行期无用
C语言中的==const==使得变量具有只读属性
现代C编译器中的==const==将具有全局生命周期的变量存储于只读存储区
==const==不能定义真正意义上的常量
==const==修饰函数参数表示在函数体内不喜欢改变参数的值
==const==修饰函数返回值表示返回值不可改变,多用于返回指针的情形
C语言中的字符串字面量存储于只读存储区中,在程序中需要使用==const char*==指针
==const==全局变量:只读,值不可改变
==const==局部变量:
==const==局部变量:只读,值不可改变
普通局部变量:只读,值可改变
C语言中的==struct==可以看作变量的集合
C语言中的结构体,不能封装函数
一般而言,结构体的大小是各个成员变量所占内存之和
特殊而言,结构体需要进行字节对齐,有利于数据偏移,和寻址功能
字节对齐内容
在结构体中的每个属性会根据自己所占内存大小,来设置起始存储位置,起始存储位置,必须是自身类型的整数倍
在上面对齐的基础上,最后整体会进行一次对齐,整体的字节个数要是一个数据的整数倍,这个数据是系统字节对齐和结构体中最大成员所占字节的之间取最小值。(系统对齐字节数,结构体中所占内存最大字节数)
逻辑结构:表示数据元素之间的关联情况,根据元素间的关联情况,分为以下四种
集合结构:任意两个数据元素之间没用任何关系,只是单纯存储在同一个同一个集合中
线性结构:数据元素之间存在一对一的关系,在该结构中,除了第一个元素没有前驱,最后一个元素没有后继,其余所有数据都有且只有一个前驱和一个后继
树形结构:数据元素之间存在一对多的关系
图形结构:数据元素之间存在多对多的关系
存储结构:数据的逻辑结构在计算机中的映射存储
顺序存储:将逻辑上连续的数据元素,存储在物理内存也连续的空间内
链式存储:将逻辑上相邻的数据元素,存储在物理内存上随机位置
索引存储:在存储数据元素时,单独创建一个索引表记录数据元素所在位置
散列存储:也叫哈希存储,将数据元素存储的位置跟数据元素的关键字有关
宏表达式被预处理器处理,编译器不知道宏表达式的存在
宏表达式用 “实参” 完全替代形参,不进行任何运算
宏表达式没有任何 “调用” 开销
宏表达式中不能出现递归定义
执行时间不一样,预处理只执行简单的替换
宏定义不能连续定义指针类型,typedef可以