通讯录工程的构建(二)

这一篇给大家介绍子函数,大多是对于链表的操作,就不一一赘述。

(代码复制的时候格式有点问题,空行较多)

 

 

  1 NODE *create()
  2 
  3 {
  4 
  5     NODE* p;
  6 
  7     p=OP;                                             // #define OP
  8 
  9  
 10 
 11     return p;
 12 
 13 }
 14 
 15  
 16 
 17 int revise(NODE* head)
 18 
 19 {
 20 
 21     NODE* p;
 22 
 23     char name[20],yn;
 24 
 25  
 26 
 27     puts("\n\n\t  Please enter the name of contacts that should be revised   ");
 28 
 29     getchar();
 30 
 31     gets(name);
 32 
 33  
 34 
 35 //---查找与所输入名字相同的节点
 36 
 37  
 38 
 39     p=head->next;
 40 
 41  
 42 
 43     while(p)
 44 
 45     {
 46 
 47         if(strcmp(p->name,name)==0)
 48 
 49         {
 50 
 51             printf("\n\t\t*    Name revise?(y/n)    *");
 52 
 53             yn=getchar();
 54 
 55             getchar();
 56 
 57  
 58 
 59             if(yn=='y')
 60 
 61             {
 62 
 63                 printf("\n*    Enter new name:    *");
 64 
 65                 gets(p->name);
 66 
 67             }
 68 
 69  
 70 
 71             printf("\n\t\t*    Tel revise?(y/n)    *");
 72 
 73             yn=getchar();
 74 
 75             getchar();
 76 
 77  
 78 
 79             if(yn=='y')
 80 
 81             {
 82 
 83                 printf("\n*    Enter new tel:    *");
 84 
 85                 gets(p->tel);
 86 
 87             }
 88 
 89  
 90 
 91             printf("\n\t\t*    Email revise?(y/n)    *");
 92 
 93             yn=getchar();
 94 
 95             getchar();
 96 
 97  
 98 
 99             if(yn=='y')
100 
101             {
102 
103                 printf("\n*    Enter new email:    *");
104 
105                 gets(p->email);
106 
107             }
108 
109  
110 
111             printf("\n\t\t*    Sort revise?(y/n)    *");
112 
113             yn=getchar();
114 
115             getchar();
116 
117  
118 
119             if(yn=='y')
120 
121             {
122 
123                 printf("\n*    Enter new sort:    *");
124 
125                 p->sort=getchar();
126 
127                 getchar();
128 
129                 //printf("\nnew sort:%d",p->sort);
130 
131             }
132 
133  
134 
135             puts("\n\n\t\t*    Revise succeed    *");
136 
137             return 1;
138 
139  
140 
141         }
142 
143         p=p->next;
144 
145     }
146 
147  
148 
149 //---没有找到则返回0
150 
151         puts("\n\n\t*    Not find this contacts    *");
152 
153         return 0;
154 
155  
156 
157  
158 
159  
160 
161  
162 
163 }
164 
165  
166 
167 void build(NODE* head,int len,NODE stu[])
168 
169 {
170 
171     NODE* p,*q;
172 
173     int i,j;
174 
175  
176 
177 //---建立链表并赋入结构体数组中的信息
178 
179     p=head;
180 
181  
182 
183     for(i=0;i<len;i++)
184 
185     {
186 
187         q=OP;
188 
189         p->next=q;
190 
191         for(j=0;stu[i].name[j] != '\0';j++)
192 
193             q->name[j]=stu[i].name[j];
194 
195         q->name[j]=stu[i].name[j];
196 
197  
198 
199         for(j=0;stu[i].tel[j] != '\0';j++)
200 
201             q->tel[j]=stu[i].tel[j];
202 
203         q->tel[j]=stu[i].tel[j];
204 
205  
206 
207         q->sort=stu[i].sort;
208 
209  
210 
211         for(j=0;stu[i].email[j] != '\0';j++)
212 
213             q->email[j]=stu[i].email[j];
214 
215         q->email[j]=stu[i].email[j];
216 
217  
218 
219         //printf("here?");
220 
221         p=q;
222 
223     }
224 
225     q->next=NULL;
226 
227  
228 
229 }
230 
231  
232 
233 //---将链表中的信息转存到结构体数组中
234 
235 void trans(NODE* head,int len,NODE lin[])
236 
237 {
238 
239     NODE* pt;
240 
241     int i,j;
242 
243  
244 
245         pt=head->next;
246 
247  
248 
249         for(i=0;(i<len)&&(pt);pt=pt->next,i++)
250 
251     {
252 
253         for(j=0;pt->name[j] != '\0';j++)
254 
255             lin[i].name[j]=pt->name[j];
256 
257         lin[i].name[j]='\0';
258 
259  
260 
261         for(j=0;pt->tel[j] != '\0';j++)
262 
263             lin[i].tel[j]=pt->tel[j];
264 
265         lin[i].tel[j]='\0';
266 
267  
268 
269         for(j=0;pt->email[j] != '\0';j++)
270 
271             lin[i].email[j]=pt->email[j];
272 
273         lin[i].email[j]='\0';
274 
275  
276 
277         lin[i].sort=pt->sort;                    // ?
278 
279     }
280 
281  
282 
283  
284 
285 }
286 
287  
288 
289 //---节点删除
290 
291 int del(NODE* head)
292 
293 {
294 
295     char cname[20];                     //contacts' name
296 
297     NODE* p,*pn;                        //pn: pointer next
298 
299     int flag=0;
300 
301  
302 
303     puts("\n\n\t  Please enter the name of contacts that should be deleted  ");
304 
305     getchar();
306 
307     gets(cname);
308 
309  
310 
311     p=head;
312 
313  
314 
315     while(p->next)
316 
317     {
318 
319         pn=p->next;
320 
321         if(strcmp(pn->name,cname)==0)
322 
323         {
324 
325             flag=1;
326 
327             p->next=pn->next;
328 
329             pn->next=NULL;
330 
331             free(pn);
332 
333             break;
334 
335         }
336 
337         p=p->next;
338 
339     }
340 
341  
342 
343     if(!flag)
344 
345     {
346 
347         puts("\n\n\t*    Not find this contacts    *");
348 
349         return 0;
350 
351     }
352 
353  
354 
355  
356 
357     puts("\n\n\t\t*    Delete succeed    *");
358 
359  
360 
361     return 1;
362 
363  
364 
365 }
366 
367  
368 
369 //---完全新建
370 
371 int _new(NODE *head,char filename[])
372 
373 {
374 
375     FILE *in,*f_name;
376 
377     NODE *p,*q,*pc,*pt;                     // pc : pointer check   pt: pointer transport
378 
379     int i,j,len;
380 
381     char yon;
382 
383     int getlen(NODE* head);
384 
385  
386 
387     // new file
388 
389  
390 
391                                                                      // if input right?
392 
393  
394 
395         printf("\n\n  Please enter file address( change character '\\' by '\\\\' .):         ");
396 
397         gets(filename);
398 
399         printf("\n\nFilename:  %s\n",filename);
400 
401  
402 
403         //for(i=0;filename[i]!='#';i++)
404 
405         //    ;
406 
407         //filename[i]='\0';
408 
409         if((in=fopen(filename,"wb"))==NULL)
410 
411         {
412 
413             puts("\n\n\t\t*    Cannot open the file    *");
414 
415             return 0;
416 
417         }
418 
419         fclose(in);
420 
421  
422 
423         if((f_name=fopen("D:\\file_name.dat","wb"))==NULL)                                 // note file address
424 
425         {
426 
427             puts("\n\n\t\t*    Cannot open the file    *");
428 
429             return 0;
430 
431         }
432 
433  
434 
435         rewind(f_name);
436 
437  
438 
439         //filename[i]=-1;
440 
441         fputs(filename,f_name);
442 
443  
444 
445         //fputs(&filename[i],f_name);                  // add '\0'
446 
447  
448 
449         fclose(f_name);
450 
451                                                                          // note file address end
452 
453  
454 
455     //new file end
456 
457  
458 
459  
460 
461  
462 
463     puts("\n\n*   Tips: When you enter 'sort' information, 'a' means official, 'b' means personal, 'c' means commercial.  *\n");
464 
465     p=head;
466 
467     for(i=0;i<15;i++)
468 
469     {
470 
471         q=OP;
472 
473         p->next=q;
474 
475         printf("\n\n     *******************   Enter information   *******************\n\n");
476 
477  
478 
479         printf("\t\tName:  ");
480 
481         scanf("%s",q->name);
482 
483  
484 
485         printf("\t\tTel :  ");
486 
487         scanf("%s",q->tel);
488 
489  
490 
491         printf("\t\tSort:  ");
492 
493         getchar();
494 
495         q->sort=getchar();
496 
497         getchar();
498 
499  
500 
501  
502 
503         printf("\n\t\tEmail: ");
504 
505         scanf("%s",q->email);
506 
507         puts("\n");
508 
509  
510 
511         haha: puts("\n\t*    Another person?(y/n)    *");
512 
513         getchar();
514 
515         q->yn=getchar();
516 
517         getchar();
518 
519  
520 
521         p=q;
522 
523  
524 
525         if(q->yn=='y') continue;
526 
527         else if (q->yn=='n') break;
528 
529         else
530 
531         {
532 
533             puts("\t*    Error    *");
534 
535             goto haha;
536 
537         }
538 
539  
540 
541     }
542 
543     if(i>=15) printf("\n\t\t*  The total number should be less than 15  *");
544 
545     q->next=NULL;
546 
547  
548 
549  
550 
551     len=getlen(head);
552 
553  
554 
555  
556 
557  
558 
559     puts("\n\n\t\t*    Create succeed    *");
560 
561  
562 
563     return len;
564 
565 }
566 
567  
568 
569 //---得到节点个数
570 
571 int getlen(NODE *head)
572 
573 {
574 
575     NODE *p;
576 
577     int i=0;
578 
579  
580 
581     p=head->next;
582 
583     while(p)
584 
585     {
586 
587         i++;
588 
589         p=p->next;
590 
591  
592 
593     }
594 
595  
596 
597     return i;
598 
599 }
600 
601  
602 
603  
604 
605  
606 
607 //---增加节点
608 
609 int add(NODE *head)
610 
611 {
612 
613     NODE* p,*pn;               //pn: pointer new
614 
615  
616 
617     p=head;
618 
619  
620 
621     while(p->next)
622 
623     {
624 
625         p=p->next;
626 
627     }
628 
629  
630 
631     pn=OP;
632 
633     p->next=pn;
634 
635  
636 
637     printf("\n\n     *******************   Enter information   *******************\n\n");
638 
639  
640 
641         printf("\t\tName:  ");
642 
643         scanf("%s",pn->name);
644 
645  
646 
647         printf("\t\tTel:   ");
648 
649         scanf("%s",pn->tel);
650 
651  
652 
653         printf("\t\tSort:  ");
654 
655         getchar();
656 
657         pn->sort=getchar();
658 
659         getchar();
660 
661  
662 
663         printf("\n\t\tEmail: ");
664 
665         scanf("%s",pn->email);
666 
667         puts("\n");
668 
669  
670 
671  
672 
673  
674 
675     pn->next=NULL;
676 
677  
678 
679  
680 
681  
682 
683     puts("\n\n\t\t*    Add succeed    *");
684 
685     getchar();
686 
687  
688 
689     return 1;
690 
691  
692 
693 }
694 
695  
696 
697 //---主界面
698 
699 int func()
700 
701 {
702 
703     int choose;
704 
705     printf("\n\n   ****************************   Function   ****************************\n");
706 
707     printf("\n\n\t\t      1. Check\n");
708 
709     printf("\n\t\t      2. Add\n");
710 
711     printf("\n\t\t      3. Revise\n");
712 
713     printf("\n\t\t      4. Delete\n");
714 
715     printf("\n\t\t      5. Create\n");
716 
717     printf("\n\t\t      6. Show telbook\n");
718 
719     printf("\n\n\t\tPlease enter the number you choose.\n");
720 
721  
722 
723  
724 
725     scanf("%d",&choose);
726 
727  
728 
729     return choose;
730 
731 }
732 
733  
734 
735 //---查找
736 
737 void check(NODE* head)
738 
739 {
740 
741     NODE *p;
742 
743     char chos;
744 
745     void output(char chos,NODE* p);
746 
747  
748 
749     p=head;
750 
751  
752 
753     puts("\n\n    Choose sort:   a.official   b.personal   c.commercial    ");
754 
755     getchar();
756 
757     chos=getchar();
758 
759     getchar();
760 
761  
762 
763     switch(chos)
764 
765     {
766 
767         case 'a':   ;
768 
769         case 'A':  output(chos,p);break;
770 
771         case 'b':   ;
772 
773         case 'B':  output(chos,p);break;
774 
775         case 'c':   ;
776 
777         case 'C': output(chos,p);break;
778 
779     }
780 
781 }
782 
783  
784 
785 //---查找函数中的输出函数
786 
787 void output(char chos,NODE* p)
788 
789 {
790 
791     while(p->next)
792 
793     {
794 
795         p=p->next;
796 
797         if(p->sort==chos)
798 
799         {
800 
801             printf("\n\t\tName: %s\n",p->name);
802 
803             printf("\t\tTel: %s\n",p->tel);
804 
805             printf("\n\t\tEmail: %s\n",p->email);
806 
807             puts("\n");
808 
809         }
810 
811     }
812 
813     puts("\n");
814 
815 }

 

posted @ 2015-06-04 16:09  Numerz  阅读(194)  评论(0编辑  收藏  举报