1 //练习2: 在练习1基础上添加通过电话号码搜索,注销用户。
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 struct list_node{
7 char name[20]; //姓名
8 int age; //年龄
9 char tel[20]; //电话
10 struct list_node *next; //指向下一个结构体的地址
11 };
12
13 struct list_node *init_list(struct list_node *head) //head = NULL
14 {
15 head = (struct list_node *)malloc(sizeof(struct list_node));
16 if(head == NULL)
17 printf("malloc head error!\n");
18 head->next = NULL;
19 return head;
20 }
21
22 int tail_add_list(struct list_node *head,char *name_buf,int age_buf,char *tel_buf)
23 {
24 struct list_node *Node = NULL;
25 Node = (struct list_node *)malloc(sizeof(struct list_node));
26 if(Node == NULL)
27 printf("malloc Node error!\n");
28 strcpy(Node->name,name_buf);
29 Node->age = age_buf;
30 strcpy(Node->tel,tel_buf);
31 Node->next = NULL;
32 struct list_node *p = NULL;
33 for(p=head;p->next!=NULL;p=p->next);
34 p->next = Node;
35 return 0;
36 }
37
38 void register_fun(struct list_node *head)
39 {
40 char name_buf[20] = {0};
41 int age_buf;
42 char tel_buf[20] = {0};
43
44 printf("pls input your name:");
45 scanf("%s",name_buf);
46 printf("pls input your age:");
47 scanf("%d",&age_buf);
48 printf("pls input your tel:");
49 scanf("%s",tel_buf);
50 tail_add_list(head,name_buf,age_buf,tel_buf);
51 return;
52 }
53
54 void show_fun(struct list_node *head)
55 {
56 struct list_node *p = NULL;
57 for(p=head->next;p!=NULL;p=p->next)
58 {
59 printf("====================\n");
60 printf("name = %s\n",p->name);
61 printf("age = %d\n",p->age);
62 printf("tel = %s\n",p->tel);
63 }
64 return;
65 }
66
67 int cancel_fun(struct list_node *head)
68 {
69 char cancel_buf[20] = {0};
70 printf("pls input cancel tel:");
71 scanf("%s",cancel_buf);
72 struct list_node *p = NULL;
73 struct list_node *q = NULL;
74 for(q=head,p=head->next;p!=NULL;q=p,p=p->next)
75 {
76 if(strcmp(p->tel,cancel_buf) == 0)
77 {
78 q->next=p->next;
79 free(p);
80 }
81 }
82 return 0;
83 }
84
85 void show_node(struct list_node *p)
86 {
87 printf("name = %s\n",p->name);
88 printf("age = %d\n",p->age);
89 printf("tel = %s\n",p->tel);
90 return;
91 }
92
93 int search_fun(struct list_node *head)
94 {
95 char name_buf[20] = {0};
96 printf("pls input search name:");
97 scanf("%s",name_buf);
98 struct list_node *p = NULL;
99 for(p=head->next;p!=NULL;p=p->next)
100 {
101 if(strcmp(p->name,name_buf) == 0)
102 {
103 show_node(p);
104 }
105 }
106
107 return 0;
108 }
109
110 int main(int argc,char *argv[])
111 {
112 //1. 初始化链表
113 struct list_node *head = NULL;
114 head = init_list(head);
115 //2. 显示主界面
116 int choice;
117 while(1)
118 {
119 printf("================================\n");
120 printf(" 1. register \n");
121 printf(" 2. show \n");
122 printf(" 3. exit \n");
123 printf(" 4. cancel \n");
124 printf(" 5. search \n");
125 printf("================================\n");
126 printf("pls input your choice:");
127 scanf("%d",&choice);
128 switch(choice)
129 {
130 case 1:
131 register_fun(head);
132 break;
133 case 2:
134 show_fun(head);
135 break;
136 case 3:
137 return -1;
138 break;
139 case 4:
140 cancel_fun(head);
141 break;
142 case 5:
143 search_fun(head);
144 break;
145 default:
146 printf("error!\n");
147 break;
148 }
149 }
150 return 0;
151 }
152 // 练习3: 在一个目录下有几张BMP格式图片,点击屏幕任意位置,切换到下一张图
153 //片,实现单向链表完成。
154 #include <stdlib.h>
155 #include <stdio.h>
156 #include <string.h>
157 #include <sys/types.h>
158 #include <dirent.h>
159 #include <sys/stat.h>
160 #include <fcntl.h>
161 #include <unistd.h>
162 #include <linux/input.h>
163 #include <strings.h>
164
165
166 int show_bmp(char *pname)
167 {
168 char bmp_buf[800*480*3];//BMP格式图片缓冲区
169 char lcd_buf[800*480*4];//LCD液晶缓冲区
170 char show_buf[800*480*4];
171
172 int ret,lcd;
173 int i,j,x,y;
174
175 //1. 访问BMP图片
176 FILE *fp = fopen(pname,"r");
177 if(fp == NULL)
178 printf("fopen error!\n");
179
180 //2. 跳过BMP图片的54个头数据
181 ret = fseek(fp,54,SEEK_SET);
182 if(ret != 0)
183 printf("fseek error!\n");
184
185 //3. 读取BMP图片的数据
186 ret = fread(bmp_buf,sizeof(bmp_buf),1,fp);
187 if(ret != 1)
188 printf("fread error!\n");
189
190 //4. 访问LCD液晶
191 lcd = open("/dev/fb0",O_WRONLY);
192 if(lcd < 0)
193 printf("open error!\n");
194
195 //5. 像素点赋值
196 for(i=0,j=0;i<800*480*4;i+=4,j+=3)
197 {
198 lcd_buf[i] = bmp_buf[j];
199 lcd_buf[i+1] = bmp_buf[j+1];
200 lcd_buf[i+2] = bmp_buf[j+2];
201 lcd_buf[i+3] = 0;
202 }
203
204 //6. 上下翻转
205 for(y=0;y<480;y++)
206 {
207 for(x=0;x<800*4;x++)
208 {
209 show_buf[(479-y)*800*4+x] = lcd_buf[y*800*4+x];
210 }
211 }
212
213 //7. 将图片数据写入到LCD液晶屏幕上
214 ret = write(lcd,show_buf,sizeof(show_buf));
215 if(ret != sizeof(show_buf))
216 printf("write error!\n");
217
218 //8. 关闭设备与文件
219 close(lcd);
220 fclose(fp);
221
222 return 0;
223 }
224
225
226 struct list_node{
227 char picname[50];
228 struct list_node *next;
229 };
230
231 struct list_node *init_list(struct list_node *head) //head = NULL
232 {
233 head = (struct list_node *)malloc(sizeof(struct list_node));
234 if(head == NULL)
235 printf("malloc head error!\n");
236
237 head->next = NULL;
238
239 return head;
240 }
241
242 int tail_add_list(struct list_node *head,char *picname)
243 {
244 struct list_node *Node = NULL;
245 Node = (struct list_node *)malloc(sizeof(struct list_node));
246 if(Node == NULL)
247 printf("Node malloc error!\n");
248
249 strcpy(Node->picname,picname);
250 Node->next = NULL;
251
252 struct list_node *p = NULL;
253 for(p=head;p->next!=NULL;p=p->next);
254
255 p->next = Node;
256
257 return 0;
258 }
259
260 int touch_fun(struct list_node *head)
261 {
262 int fd;
263 struct input_event buf;
264 int x;
265 struct list_node *p = NULL;
266 p=head->next;
267
268 //9. 读取触摸屏数据
269 while(1)
270 {
271 fd = open("/dev/input/event0",O_RDONLY);
272 if(fd < 0)
273 printf("open ts error!\n");
274 bzero(&buf,sizeof(buf));
275 read(fd,&buf,sizeof(buf));
276 if(buf.type == EV_KEY && buf.code == BTN_TOUCH && buf.value == 0);
277 for(;p!=NULL;)
278 {
279 show_bmp(p->picname);
280 printf("%s\n",p->picname);
281 p=p->next;
282 break;
283 }
284 if(p==NULL)
285 break;
286 close(fd);
287 }
288
289 return 0;
290 }
291
292 int delete_list(struct list_node *head)
293 {
294 struct list_node *p = NULL;
295 struct list_node *q = NULL;
296
297 for(p=q=head;p!=NULL;p=q)
298 {
299 q=p->next;
300 free(p);
301 }
302
303 return 0;
304 }
305
306 int main(int argc,char *argv[])
307 {
308 //0. 初始化链表
309 struct list_node *head = NULL;
310 head = init_list(head);
311
312 //1. 打开目录
313 DIR *dp = opendir("./pic/");
314 if(dp == NULL)
315 printf("opendir error!\n");
316
317 //2. 切换目录
318 chdir("./pic/");
319
320 //3. 读取目录中内容
321 struct dirent *ep = NULL;
322 while(1)
323 {
324 ep = readdir(dp);
325 if(ep == NULL)
326 break;
327
328 if(ep->d_name[0] == '.')
329 continue;
330
331 tail_add_list(head,ep->d_name);
332 }
333 show_bmp(head->next->picname);
334 touch_fun(head);
335 delete_list(head);
336 return 0;
337 }
338 //练习4: 完成单向循环链表接口。
339 #include <stdio.h>
340 #include <stdlib.h>
341
342 //设计节点模型
343 struct list_node{
344 int a;
345 struct list_node *next;
346 };
347
348 struct list_node *init_list_head(struct list_node *head) //head = NULL
349 {
350 //为头节点申请空间
351 head = (struct list_node *)malloc(sizeof(struct list_node));
352 if(head == NULL)
353 printf("head malloc error!\n");
354
355 //为头节点的指针域赋值
356 head->next = head;
357
358 return head;
359 }
360
361 int tail_add_list(struct list_node *head,int num)
362 {
363 //为新节点申请空间
364 struct list_node *Node = NULL;
365 Node = (struct list_node *)malloc(sizeof(struct list_node));
366
367 //为新节点赋值
368 Node->a = num;
369 Node->next = head;
370
371 //寻找最后一个节点,并尾插
372 struct list_node *p = NULL;
373 for(p=head;p->next!=head;p=p->next);
374 //从循环出来时,p->next=NULL,也就是说,p指向最后一个节点!
375
376 p->next = Node;
377
378 return 0;
379 }
380
381 int show_list_node(struct list_node *head)
382 {
383 struct list_node *p = NULL;
384 for(p=head->next;p!=head;p=p->next)
385 {
386 printf("%d\n",p->a);
387 }
388
389 return 0;
390 }
391
392 int head_add_list(struct list_node *head,int num)
393 {
394 struct list_node *Node = NULL;
395 Node = (struct list_node *)malloc(sizeof(struct list_node));
396 struct list_node *p = NULL;
397 struct list_node *q = NULL;
398 for(q=head,p=head->next;p!=head;q=p,p=p->next)
399 {
400 Node->a = num;
401 Node->next = p;
402 q->next = Node;
403 }
404
405 return 0;
406 }
407
408 void show_node(struct list_node *p)
409 {
410 printf("p->a = %d\n",p->a);
411 return ;
412 }
413
414 int search_list_node(struct list_node *head,int num)
415 {
416 struct list_node *p = NULL;
417 for(p=head;p->next!=head;p=p->next)
418 {
419 if(p->a == num)
420 {
421 show_node(p);
422 return 0;
423 }
424 }
425
426 printf("Not Found:%d\n",num);
427 return -1;
428 }
429
430 int delete_list_node(struct list_node *head,int num)
431 {
432 struct list_node *p = NULL;
433 struct list_node *q = NULL;
434
435 for(q=head,p=head->next;p!=head;q=p,p=p->next)
436 {
437 if(p->a == num)
438 {
439 q->next = p->next;
440 free(p);
441 return 0;
442 }
443 }
444
445 return -1;
446 }
447
448 int delete_list(struct list_node *head)
449 {
450 struct list_node *p = NULL;
451 struct list_node *q = NULL;
452 for(q=head,p=head->next;p!=head;q=p,p=p->next);
453 q->next=NULL;
454 for(q=head,p=head->next;p!=NULL;q=p,p=p->next)
455 {
456 q=p->next;
457 free(p);
458 }
459
460 return 0;
461 }
462
463 int main(int argc,char *argv[])
464 {
465 //1. 初始化链表头
466 struct list_node *head = NULL;
467 head = init_list_head(head);
468
469 //2. 尾插数据
470 tail_add_list(head,10);
471 tail_add_list(head,20);
472 tail_add_list(head,30);
473 tail_add_list(head,40);
474
475 //3. 头插数据
476 head_add_list(head,8);
477 head_add_list(head,5);
478 head_add_list(head,3);
479
480 //4. 遍历链表
481 //show_list_node(head);
482
483 //5. 根据特征值来寻找节点
484 search_list_node(head,30);
485
486 //6. 根据特征值删除节点
487 delete_list_node(head,8);
488
489 //7. 遍历链表
490 show_list_node(head);
491
492 //8. 释放整条链表的内存空间
493 delete_list(head);
494
495 return 0;
496 }
497 //练习5: 使用单向循环链表完成练习3,要求点击最后一张回到第一张。
498 #include <stdlib.h>
499 #include <string.h>
500 #include <sys/types.h>
501 #include <dirent.h>
502 #include <sys/stat.h>
503 #include <fcntl.h>
504 #include <stdio.h>
505 #include <unistd.h>
506 #include <linux/input.h>
507 #include <strings.h>
508
509 struct list_node{
510 char picname[20];
511 struct list_node *next;
512 };
513
514 struct list_node *init_list_head(struct list_node *head)
515 {
516 head = (struct list_node *)malloc(sizeof(struct list_node));
517 if(head == NULL)
518 printf("malloc head error!\n");
519
520 head->next = head;
521
522 return head;
523 }
524
525 int tail_add_list(struct list_node *head,char *picname)
526 {
527 struct list_node *Node = NULL;
528 Node = (struct list_node *)malloc(sizeof(struct list_node));
529 if(Node == NULL)
530 printf("malloc Node error!\n");
531
532 strcpy(Node->picname,picname);
533 Node->next = head;
534
535 struct list_node *p = NULL;
536 for(p=head;p->next!=head;p=p->next); //p->next=head
537
538 p->next = Node;
539
540 return 0;
541 }
542
543 void show_bmp(char *name)
544 {
545 char bmp_buf[800*480*3];//BMP格式图片缓冲区
546 char lcd_buf[800*480*4];//LCD液晶缓冲区
547 char show_buf[800*480*4];
548
549 int ret,lcd;
550 int i,j,x,y;
551
552 //1. 访问BMP图片
553 FILE *fp = fopen(name,"r");
554 if(fp == NULL)
555 printf("fopen error!\n");
556
557 //2. 跳过BMP图片的54个头数据
558 ret = fseek(fp,54,SEEK_SET);
559 if(ret != 0)
560 printf("fseek error!\n");
561
562 //3. 读取BMP图片的数据
563 ret = fread(bmp_buf,sizeof(bmp_buf),1,fp);
564 if(ret != 1)
565 printf("fread error!\n");
566
567 //4. 访问LCD液晶
568 lcd = open("/dev/fb0",O_WRONLY);
569 if(lcd < 0)
570 printf("open error!\n");
571
572 //5. 像素点赋值
573 for(i=0,j=0;i<800*480*4;i+=4,j+=3)
574 {
575 lcd_buf[i] = bmp_buf[j];
576 lcd_buf[i+1] = bmp_buf[j+1];
577 lcd_buf[i+2] = bmp_buf[j+2];
578 lcd_buf[i+3] = 0;
579 }
580
581 //6. 上下翻转
582 for(y=0;y<480;y++)
583 {
584 for(x=0;x<800*4;x++)
585 {
586 show_buf[(479-y)*800*4+x] = lcd_buf[y*800*4+x];
587 }
588 }
589
590 //7. 将图片数据写入到LCD液晶屏幕上
591 ret = write(lcd,show_buf,sizeof(show_buf));
592 if(ret != sizeof(show_buf))
593 printf("write error!\n");
594
595 //8. 关闭设备与文件
596 close(lcd);
597 fclose(fp);
598 }
599
600 int main(int argc,char *argv[])
601 {
602 //0. 初始化链表
603 struct list_node *head = NULL;
604 head = init_list_head(head);
605
606 //1. 打开目录
607 DIR *dp = opendir("./pic/");
608 if(dp == NULL)
609 printf("opendir error!\n");
610
611 //2. 切换目录
612 chdir("./pic/");
613
614 //3. 读取目录中内容
615 struct dirent *ep = NULL;
616 while(1)
617 {
618 ep = readdir(dp);
619 if(ep == NULL)
620 break;
621
622 if(ep->d_name[0] == '.')
623 continue;
624
625 tail_add_list(head,ep->d_name);
626 }
627
628 //4. 显示第一张图片
629 struct list_node *p = head->next;
630 show_bmp(p->picname);
631
632 //5. 访问触摸屏设备
633 int fd = open("/dev/input/event0",O_RDONLY);
634 if(fd < 0)
635 printf("open event0 error!\n");
636
637 //6. 不断读取触摸屏数据
638 struct input_event buf;
639 while(1)
640 {
641 bzero(&buf,sizeof(buf));
642 read(fd,&buf,sizeof(buf));
643 if(buf.type == EV_KEY && buf.code == BTN_TOUCH && buf.value == 0)
644 {
645 p=p->next;
646 if(p==head)
647 {
648 p=p->next;
649 }
650 show_bmp(p->picname);
651 }
652 }
653 close(fd);
654 closedir(dp);
655 return 0;
656 }