2019年7月30日星期二(数据结构)例题代码

  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 }

猜你喜欢

转载自www.cnblogs.com/zjlbk/p/11278414.html
今日推荐