多功能电子通讯录(涉及到了双向链表的使用,Linux文件编程等等)

  readme.txt //作为一个程序员,我们咋么能不写用户手册呢!MSP的我觉得用户体验是王道,苹果手机的用户体验的确不错!不过WP加油!我去,扯远了!赶紧看我的程序吧!
 歡迎使用多功能電子通訊錄V1.0版本     
   如有BUG敬請原諒  
   make  之後便可以使用  
   ./ebook  運行本程序   
  make clean 清理本程序中間文件  
   make cleanall 清除所有非源程序文件
PS:我本想直接给大家看代码的,但是在这个过程中,重要不仅仅是代码,首先你要在你的脑海有一个大体的框架,你打算咋么写?如何去写得更加规范化,当然我自己写的地方也有不好的地方,纵观
全局,你打算使用什么来实现,比如,我特喜欢把一个系统模块化!第一个,链表操作吧,好那我就给一个文件专门用来存放链表的函数,第二个,该是界面吧!那我就拿个HELP.C专门来存放它的函数等等,
有人就奇怪了,你把那些模块化了,咋么组装起来?声明都文件吗?每个都带一个,不错 这是个方法,但是你的写多少个头文件呢来声明函数呢?不要忘了编译器只是找你的MIAN函数的入口,我们直接用
makefile把他们连起来就行了!头文件只用用来定义我们的数据结构,方便我们的函数调用!
还有一个思想也是非常重要的,不要一蹴而就!我们不是大神,更不要说C本来就是一个有缺陷的语言,因而,你如何去完善及调试C,那才是我们应该关注的要点!而不是代码的本身!
好了,这回我的废话真的结束了!
1
首先大家看到的是我定义的一个data.h的头文件,我在头文件中写好了数据框架和应当包括的头文件!这个程序大概写了3天, 2 #ifndef __DATA__ 3 #define __DATA__ 4 #define MAXSIZE 100 5 #include<stdio.h> 6 #include<stdlib.h> 7 #include<string.h> 8 #include<sys/types.h> 9 #include<sys/stat.h> 10 #include <fcntl.h> 11 struct node 12 { 13 int id; //ID 14 char name[MAXSIZE]; //姓名 15 char phone[MAXSIZE]; //電話 16 char add[MAXSIZE]; //公司地址 17 char comp[MAXSIZE]; //公司電話 18 19 struct node *pr; 20 struct node *next; 21 }; 22 typedef struct node Node; 23 typedef struct node* link; 24 #endif 25 这边呢!就是我写的主函数了!具体的功能,将在这个文件中一一诉述! 26 /**************************************************************************** 27 * 函數列表 * 28 * int insert_cmd() 命令選擇 * 29 * int input_num_ok(char *temp) 判斷數字 * 30 * int input_char_ok(char *temp) 判斷字符 * 31 * link input_list() 輸入數據 * 32 * int is_choose(char ch) 選擇查詢模式 * 33 ****************************************************************************/ 34 #include"data.h"//调用自己定义的头文件 35 36 int insert_cmd() 37 { 38 char cmd[MAXSIZE]; 39 printf("请输入相应的命令:(提示:INSERT/DISPLAY/SEARCH/DELETE/EXIT:)\n"); 40 scanf("%s",cmd); 41 if( strcmp(cmd,"INSERT") == 0) 42 { 43 return 1;//INSERT CMD ID 44 } 45 else if( strcmp(cmd ,"DISPLAY") == 0) 46 { 47 return 2;//DISPLAY CMD ID 48 } 49 else if( strcmp(cmd , "SEARCH") == 0) 50 { 51 return 3;//SEARCH CMD ID 52 } 53 else if( strcmp(cmd , "DELETE") == 0) 54 { 55 return 4;//EDLETE CMD ID 56 } 57 else if( strcmp(cmd , "EXIT") == 0) 58 { 59 return 5;//EXIT CMD ID 60 } 61 else 62 { 63 return 0;//ERROR CMD ID 64 } 65 66 } 67 68 int input_num_ok(char *temp) //0~9返回1 其他直接返回0 69 { 70 int len = strlen(temp); 71 int i; 72 for(i = 0; i < len; i++) 73 { 74 if(temp[i] >= '0'&&temp[i] <= '9' ) 75 { 76 } 77 else 78 { 79 return 0; 80 } 81 } 82 return 1; 83 } 84 int input_char_ok(char *temp) //a~z或者A~Z返回1 其他直接返回0 85 { 86 int len = strlen(temp); 87 int i; 88 for(i = 0; i < len; i++) 89 { 90 if((temp[i] >= 'a'&&temp[i] <= 'z')||(temp[i] >= 'A'&&temp[i] <= 'Z' )) 91 { 92 } 93 else 94 { 95 return 0; 96 } 97 } 98 return 1; 99 } 100 link input_list() 101 { 102 link temp; 103 is_malloc_ok(&temp); 104 char tempchar[MAXSIZE]; 105 printf("请输入您好友的名字(名字必须英文):\n"); 106 scanf("%s",tempchar); 107 int flag = 0; 108 flag = input_char_ok(tempchar); 109 while(flag != 1) 110 { 111 printf("您输入的名字有误!请重新输入您好友的名字(名字必须英文):\n"); 112 scanf("%s",tempchar); 113 flag = input_char_ok(tempchar); 114 } 115 strcpy(temp->name,tempchar); 116 printf("请输入您想要设置的ID(该ID必须0~300):\n"); 117 scanf("%d",&temp->id); 118 while(temp->id < 0 || temp->id > 300) 119 { 120 printf("您输入的ID已经超过了限定ID,请重新输入ID:\n"); 121 scanf("%d",&temp->id); 122 } 123 printf("请输入您好友的手机号码:\n"); 124 scanf("%s",tempchar); 125 flag = 0; 126 flag = input_num_ok(tempchar); 127 while(flag != 1) 128 { 129 printf("您输入的手机号码有误!请重新输入号码(号码必须为数字):\n"); 130 scanf("%s",tempchar); 131 flag = input_num_ok(tempchar); 132 } 133 strcpy(temp->phone,tempchar); 134 printf("请输入公司地址:\n"); 135 scanf("%s",temp->add); 136 printf("请输入公司电话(电话须为数字):\n"); 137 scanf("%s",tempchar); 138 flag = 0; 139 flag = input_num_ok(tempchar); 140 while(flag != 1) 141 { 142 printf("您输入的公司电话有误!请重新输入公司电话(号码必须数字):\n"); 143 scanf("%s",tempchar); 144 flag = input_num_ok(tempchar); 145 } 146 strcpy(temp->comp,tempchar); 147 return temp; 148 } 149 int is_choose(char ch) 150 { 151 while(1) 152 { 153 if(ch == 'i' || ch =='I') 154 { 155 return 0; 156 } 157 if(ch == 'N' || ch == 'n') 158 { 159 return 1; 160 } 161 printf("请正确输入!\n"); 162 scanf("%c",&ch); 163 } 164 } 165 int main() 166 { 167 system("clear"); 168 insert_help();//包含在help.c文件中的函数 169 link head; 170 link newnode; 171 create_list(&head);//包含在looplist.c文件的函数 172 int fd; //file id文件描述符! 173 174 int cmdid; 175 char sc;//用于判断查询的模式 176 int id; 177 char name[MAXSIZE]; 178 fd = is_open_creat("data.txt",O_RDONLY|O_CREAT,0755);//文件编程 打开或者创建一个文件 179 // null_fd = is_open_creat("null.txt",O_RDWR|O_CREAT,0755); 180 int count = 0; 181 count = read_countline(fd);//我是以行读取文件中的内容的!因为要判定data.txt文件中有多少行 182 lseek(fd,0,SEEK_SET); 183 int i = 0; 184 for(i = 0; i < count; i++) 185 { 186 analysis(fd,&head);//解析文件内容 187 } 188 cmdid = insert_cmd(); 189 while(cmdid != 5) //主程序 190 { 191 switch(cmdid) 192 { 193 case 1: 194 { 195 system("clear"); 196 is_malloc_ok(&newnode); 197 newnode = input_list(); 198 insert_list(&head,&newnode); 199 sleep(1); 200 break; 201 } 202 case 2: 203 { 204 system("clear"); 205 display_list(&head);//凡带list的函数都是我调用了looplist.c的文件函数 206 printf("请按回车键返回首页"); 207 getchar(); 208 getchar(); 209 break; 210 } 211 case 3: 212 { 213 system("clear"); 214 printf("请选择你所需要搜索的模式 ID搜素请输入I或者i 名字搜索请输入N或者n\n"); 215 scanf("%c",&sc); 216 if(is_choose(sc) == 0) 217 { 218 printf("请输入要搜素的ID号\n"); 219 scanf("%d",&id); 220 display_id(&head,id); 221 } 222 else 223 { 224 printf("请输入要搜索的名字\n"); 225 scanf("%s",name); 226 display_name(&head,name); 227 } 228 printf("请按回车键返回首页"); 229 getchar(); 230 getchar(); 231 break; 232 } 233 case 4: 234 { 235 system("clear"); 236 printf("你想删除谁?请输入他的名字!\n"); 237 scanf("%s",name); 238 display_name(&head,name);//这是调用了search.c的函数 239 printf("已找到你想删除的人,注意:如果您的通讯录本来就为空,請不要輸入Y!\n"); 240 printf("您是否要刪除?確定請輸入Y,取消请输入N\n"); 241 char chcmd; 242 scanf("%c",&chcmd); 243 while(chcmd != 'N') 244 { 245 if(chcmd == 'Y'||chcmd == 'y') 246 { 247 printf("請輸入對應的ID!\n"); 248 scanf("%d",&id); 249 delete_list(&head,id); 250 break; 251 } 252 scanf("%c",&chcmd); 253 } 254 255 printf("请按回车键返回首页"); 256 getchar(); 257 getchar(); 258 break; 259 260 } 261 case 5: 262 { 263 system("clear"); 264 printf("tui chu chengxue"); 265 sleep(2); 266 break; 267 } 268 case 0: 269 { 270 printf("你所输入的命令不正确,等待1秒后,请重新输入!\n"); 271 sleep(1); 272 break; 273 } 274 } 275 system("clear"); 276 insert_help(); 277 cmdid = insert_cmd(); 278 } 279 close(fd); 280 FILE *fp; 281 fp = fopen("data.txt","w"); 282 fd = fileno(fp); 283 lseek(fd,0,SEEK_SET); 284 write_all(fd,&head); 285 close(fd); 286 //close(null_fd); 287 return 0; 288 } 289 好了,下面大家将看看到我写的一些用makefile关联起来的一些文件
这个就是file.c文件 用于解析文件内容和文件操作的函数
290 #include"data.h" 291 292 int is_open_creat(char *filename,int flags,mode_t mode) 293 { 294 int fd; 295 if((fd = open(filename,flags,mode)) < 0) 296 { 297 perror("can't open file"); 298 exit(1); 299 } 300 return fd; 301 } 302 303 int is_open(char *filename,int flags) 304 { 305 int fd; 306 if((fd = open(filename,flags)) < 0) 307 { 308 perror("can't open file"); 309 exit(1); 310 } 311 } 312 int is_read(int fd,char *buf,int maxsize) 313 { 314 int btye; 315 if((btye = read(fd,buf,maxsize)) < 0) 316 { 317 perror("can't read this file"); 318 exit(1); 319 } 320 return btye; 321 } 322 int read_countline(int fd) 323 { 324 int count = 0; 325 int btye; 326 char buf[1024]; 327 btye = is_read(fd,buf,1024); 328 int i = 0; 329 for(i = 0; i < btye; i++) 330 { 331 if(buf[i] == '\n') 332 { 333 count++; 334 } 335 } 336 return count; 337 338 } 339 int read_line(int fd,char *buf,int maxsize) 340 { 341 int i; 342 char ch; 343 for(i = 0; i < maxsize - 1; i++) 344 { 345 if(read(fd,&ch,1) < 0) 346 { 347 perror("can't read this file"); 348 exit(1); 349 } 350 if(ch == '\n') 351 { 352 buf[i] = '\0'; 353 return i; 354 } 355 buf[i] = ch; 356 } 357 buf[i] = '\0'; 358 return maxsize; 359 } 360 void analysis(int fd,link *head) 361 { 362 link temp; 363 is_malloc_ok(&temp); 364 char buf[1024]; 365 char ptr[1024]; 366 int size; 367 size = read_line(fd,buf,1024); 368 int i = 0; 369 int count = 0; 370 while(buf[i] != ':') 371 { 372 ptr[count++] = buf[i++]; 373 } 374 ptr[count] = '\0'; 375 i++; 376 count = 0; 377 temp->id = atoi(ptr); 378 while(buf[i] != ':') 379 { 380 ptr[count++] = buf[i++]; 381 } 382 ptr[count] = '\0'; 383 count = 0; 384 i++; 385 strcpy(temp->name,ptr); 386 while(buf[i] != ':') 387 { 388 ptr[count++] = buf[i++]; 389 } 390 ptr[count] = '\0'; 391 count = 0; 392 i++; 393 strcpy(temp->phone,ptr); 394 while(buf[i] != ':') 395 { 396 ptr[count++] = buf[i++]; 397 } 398 ptr[count] = '\0'; 399 count = 0; 400 i++; 401 strcpy(temp->add,ptr); 402 while(buf[i] != ':') 403 { 404 ptr[count++] = buf[i++]; 405 } 406 ptr[count] = '\0'; 407 count = 0; 408 strcpy(temp->comp,ptr); 409 insert_list(head,&temp); 410 } 411 int is_write(int fd,char *buf,int maxsize) 412 { 413 int btye; 414 if((btye = write(fd,buf,maxsize)) < 0) 415 { 416 perror("can't write this file"); 417 exit(1); 418 } 419 return btye; 420 } 421 422 FILE *is_fopen(const char *fname,const char *mode) 423 { 424 FILE *fp; 425 if((fp = fopen(fname,mode)) == NULL) 426 { 427 perror("无法打开信息文件!请检查信息文件是否安全!"); 428 exit(1); 429 } 430 return fp; 431 } 432 void write_data(int fd,link *newnode) 433 { 434 char buf[1024]; 435 int id; 436 int i = 0; 437 id = (*newnode)->id; 438 if( id <= 9) 439 { 440 buf[i++] = id + '0'; 441 buf[i++] = ':'; 442 } 443 else if(id > 9 && id <= 99) 444 { 445 buf[i++] = id / 10 + '0'; 446 buf[i++] = id % 10 + '0'; 447 buf[i++] = ':'; 448 } 449 else 450 { 451 buf[i++] = id / 100 + '0'; 452 buf[i++] = id % 100 / 10 + '0'; 453 buf[i++] = id % 10 + '0'; 454 buf[i++] = ':'; 455 } 456 int j = 0; 457 while((*newnode)->name[j] != '\0') 458 { 459 buf[i++] = (*newnode)->name[j++]; 460 } 461 j = 0; 462 buf[i++] = ':'; 463 while((*newnode)->phone[j] != '\0') 464 { 465 buf[i++] = (*newnode)->phone[j++]; 466 } 467 j = 0; 468 buf[i++] = ':'; 469 while((*newnode)->add[j] != '\0') 470 { 471 buf[i++] = (*newnode)->add[j++]; 472 } 473 j = 0; 474 buf[i++] = ':'; 475 while((*newnode)->comp[j] != '\0') 476 { 477 buf[i++] = (*newnode)->comp[j++]; 478 } 479 j = 0; 480 buf[i++] = ':'; 481 buf[i++] = '\n'; 482 is_write(fd,buf,i); 483 } 484 void write_all(int fd,link *head) 485 { 486 link temp = (*head)->next; 487 if(temp == *head) 488 { 489 printf("您的通讯录是空的!\n"); 490 } 491 while(temp != *head) 492 { 493 write_data(fd,&temp); 494 temp = temp->next; 495 } 496 printf("已经录入文件完毕\n"); 497 }
这个就是我的help.c文件主要是为了显示我的主界面,display在我的主函数中 没有用到,仅仅是用来调用调试的!
498 /*************************************************** 499 * 函數列表 * 500 * insert_help() 幫助界面顯示 * 501 * display(link *temp) 查看數據 * 502 ***************************************************/ 503 #include"data.h" 504 void insert_help() 505 { 506 printf("\033[;35m \t************************多功能电子通讯录*********************************\n\033[0m"); 507 printf("\033[;35m \t* 功能介绍 *\n\033[0m"); 508 printf("\033[;35m \t* A、添加好友信息 *\n\033[0m"); 509 printf("\033[;35m \t* B、列表好友信息 *\n\033[0m"); 510 printf("\033[;35m \t* C、搜索好友信息 *\n\033[0m"); 511 printf("\033[;35m \t* D、删除好友信息 *\n\033[0m"); 512 printf("\033[;35m \t* 如在本界面出现录入成功,表示正在读取文件信息 *\n\033[0m"); 513 printf("\033[;35m \t**************************欢迎您的使用***********************************\n\033[0m"); 514 } 515 void display(link *temp) 516 { 517 printf("\033[;32m \t********************您的联系人的基本信息*********************************\n\033[0m"); 518 printf("\033[;32m \t* ID = %d \n\033[0m",(*temp)->id); 519 printf("\033[;32m \t* 姓名:%s \n\033[0m",(*temp)->name); 520 printf("\033[;32m \t* 电话号码:%s \n\033[0m",(*temp)->phone); 521 printf("\033[;32m \t* 公司地址:%s \n\033[0m",(*temp)->add); 522 printf("\033[;32m \t* 公司电话:%s \n\033[0m",(*temp)->comp); 523 printf("\033[;32m \t*************************************************************************\n\033[0m"); 524 }
这是looplist.c文件用来对我的双向链表进行相应的操作!
525 /*************************************************************** 526 * 函數列表 * 527 * void is_malloc_ok(link *list)判斷空間分配 * 528 * void create_list(link *list) 創建鏈表 * 529 * int insert_list(link *head,link*newnode)錄入信息* 530 * void display_list(link *head)遍歷鏈表 * 531 * int delete_list(link *head,int num)刪除節點 * 532 ***************************************************************/ 533 #include"data.h" 534 #define MALLOC_ERROR -1 535 #define MALLOC_SUCCSE 0 536 void is_malloc_ok(link *list) 537 { 538 *list = (link)malloc(sizeof(Node)); 539 if(*list == NULL) 540 { 541 exit(MALLOC_ERROR); 542 } 543 } 544 545 void create_list(link *list) 546 { 547 is_malloc_ok(list); 548 (*list)->next = (*list); 549 (*list)->pr = (*list); 550 } 551 int insert_list(link *head,link *newnode) 552 { 553 link temp = (*head)->next; 554 while(temp != *head) 555 { 556 if((*newnode)->id < temp->id) 557 { 558 (*newnode)->next = temp; 559 (*newnode)->pr = temp->pr; 560 (temp->pr)->next = *newnode; 561 temp->pr = *newnode; 562 printf("\t\t\t录入信息成功!\n"); 563 return 0; 564 } 565 temp = temp->next; 566 } 567 (*newnode)->next = temp; 568 (*newnode)->pr = temp->pr; 569 (temp->pr)->next = *newnode; 570 temp->pr = *newnode; 571 printf("\t\t\t录入信息成功!\n"); 572 return 0; 573 } 574 void display_list(link *head) 575 { 576 link temp = (*head)->next; 577 if(temp == *head) 578 { 579 printf("您尚未录入任何信息\n"); 580 } 581 while(temp != *head) 582 { 583 printf("\033[;32m \t********************您的联系人的基本信息*********************************\n\033[0m"); 584 printf("\033[;32m \t* ID = %d \n\033[0m",temp->id); 585 printf("\033[;32m \t* 姓名:%s \n\033[0m",temp->name); 586 printf("\033[;32m \t* 电话号码:%s \n\033[0m",temp->phone); 587 printf("\033[;32m \t* 公司地址:%s \n\033[0m",temp->add); 588 printf("\033[;32m \t* 公司电话:%s \n\033[0m",temp->comp); 589 printf("\033[;32m \t*************************************************************************\n\033[0m"); 590 temp = temp->next; 591 } 592 593 } 594 595 int delete_list(link *head,int num) 596 { 597 link temp = (*head)->next; 598 while(temp != *head) 599 { 600 if(temp->id == num) 601 { 602 (temp->pr)->next = temp->next; 603 (temp->next)->pr = temp->pr; 604 free(temp); 605 temp->next = NULL; 606 printf("\t\t刪除成功!\n"); 607 return 0; 608 } 609 temp = temp->next; 610 } 611 return -1;
这是search.c文件 用于操作搜索!
612 }/*************************************************************** 613 * 函數列表 * 614 * void display_id(link *head,int id)ID查詢 * 615 * void display_name(link *head,char *name)名字查詢 * 616 ***************************************************************/ 617 #include"data.h" 618 void display_id(link *head,int id) 619 { 620 int flag = 0; 621 link temp = (*head)->next; 622 if(temp == *head) 623 { 624 printf("您的通讯录是空的!\n"); 625 } 626 printf("\t\t以下为ID寻找方式得到的信息\n"); 627 while(temp != *head) 628 { 629 if(temp->id == id) 630 { 631 printf("\033[;32m \t********************您的联系人的信息*********************************\n\033[0m"); 632 printf("\033[;32m \t* ID = %d \n\033[0m",temp->id); 633 printf("\033[;32m \t* 姓名:%s \n\033[0m",temp->name); 634 printf("\033[;32m \t* 电话:%s \n\033[0m",temp->phone); 635 printf("\033[;32m \t* 公司地址:%s \n\033[0m",temp->add); 636 printf("\033[;32m \t* 公司电话:%s \n\033[0m",temp->comp); 637 printf("\033[;32m \t********************************************************************\n\033[0m"); 638 flag = 1; 639 } 640 temp = temp->next; 641 } 642 if(flag == 0) 643 { 644 printf("查无此人!\n"); 645 } 646 } 647 void display_name(link *head,char *name) 648 { 649 int flag = 0; 650 link temp = (*head)->next; 651 if(temp == *head) 652 { 653 printf("您的联系簿中是空的\n"); 654 } 655 printf("以下为按照名字查询所得信息\n"); 656 while(temp != *head) 657 { 658 if(strcmp(name,temp->name) == 0) 659 { 660 printf("\033[;32m \t********************您的联系人信息*********************************\n\033[0m"); 661 printf("\033[;32m \t* ID = %d \n\033[0m",temp->id); 662 printf("\033[;32m \t* 姓名:%s \n\033[0m",temp->name); 663 printf("\033[;32m \t* 电话:%s \n\033[0m",temp->phone); 664 printf("\033[;32m \t* 公司地址:%s \n\033[0m",temp->add); 665 printf("\033[;32m \t* 公司电话:%s \n\033[0m",temp->comp); 666 printf("\033[;32m \t*************************************************************************\n\033[0m"); 667 flag = 1; 668 } 669 temp = temp->next; 670 } 671 if(flag == 0) 672 { 673 printf("查无此人!"); 674 } 675 } 676 这是我写的makefile文件: 677 main = help.o ebook.o looplist.o search.o file.o 678 ebook:$(main) 679 @gcc $(main) -o ebook 680 main.o: main.c 681 @gcc main.c -c 682 help.o: help.c 683 @gcc help.c -c 684 looplist.o: looplist.c 685 @gcc looplist.c -c 686 search.o:search.c 687 @gcc search.c -c 688 file.o:file.c 689 @gcc file.c -c 690 .PHONY: clean cleanall 691 clean: 692 @rm *.o 693 cleanall: 694 @rm *.o ebook

 

 

 

posted @ 2014-08-10 22:06  King_Alex  阅读(950)  评论(0编辑  收藏  举报