通讯录工程的构建(二)
这一篇给大家介绍子函数,大多是对于链表的操作,就不一一赘述。
(代码复制的时候格式有点问题,空行较多)
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 }