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

多功能电子通讯录(涉及到了双向链表的使用,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文件描述符!173174 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 else223 {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 else450 {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 -1535 #define MALLOC_SUCCSE 0536 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.o678 ebook:$(main)679 @gcc $(main) -o ebook 680 main.o: main.c681 @gcc main.c -c 682 help.o: help.c 683 @gcc help.c -c 684 looplist.o: looplist.c685 @gcc looplist.c -c686 search.o:search.c687 @gcc search.c -c688 file.o:file.c689 @gcc file.c -c690 .PHONY: clean cleanall691 clean:692 @rm *.o693 cleanall:694 @rm *.o ebook