纯C语言VC6环境实现通讯录系统,亦可以改为XXX信息管理系统
可键盘操作
界面截图如下:
源码如下:
/***********************************************************************************************************/ /* */ /*程序采用双向循环链表结构,来满足目录可以满足自由上下过渡,遍历的需求.头结点用来表示当前通讯录的人数等信息 */ /*程序有添加,查询,浏览的功能,基本满足通讯录的要求. */ /*程序最大特点是主菜单,用户列表以及每个结点的操作属性菜单均采用上W-A-S-D才选择,回车确认 */ /*程序核心功能有search()动态搜索函数,creat()创建函数,list()浏览函数构成 */ /* ---- By Giant */ /* */ /***********************************************************************************************************/ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> #include<string.h> //======================================================================================= #define LENTH 20 char path[20]="d:\\通讯录.txt"; //------------------------------------------------------------------------------- typedef struct person //结构体属性 { char count[10]; //序号 char name[LENTH]; //姓名 char number[LENTH]; //电话号码 struct person *prior; //前驱指针 struct person *next; //后继指针 }node; void control(int x,int p); void list(); void faceopration(char a[][60],int w); void opration(int x); void controlmain(int x); //---------------------------------------------------------------------------------- node *head=NULL; //全局变量-头节点 //=================================================================================== void check() //自检函数 标签至首 { node *p=head; do { p->count[1]=' '; p->count[2]=' '; // p->number[LENTH-2]=' '; // p->number[LENTH-3]=' '; if(p->next) p=p->next; }while(p->next && p->next!=head->next); if(head->next) { p=head->next; p->count[1]=16; p->count[2]=16; // p->number[LENTH-2]=17; //p->number[LENTH-3]=17; } } //----------------------------------------------------------------------------------------------- void filesite() //文件重写 { int i=0; node *p=head; FILE *fp=fopen(path,"at"); if(fp) { while(p->next && p->next!=head) { p=p->next; if(0==i) fprintf(fp,"%-4s %-12s %-12s\n","序号","姓名","电话号码"); fprintf(fp,"%-8s %-12s %-12s \n",p->count,p->name,p->number); i++; } } else printf("file memory error! please check\n"); } //===============================导航界面的两个函数============================ void face(char a[][80]) { int j=0; char x; int i=8,BC=8; //BC为control实参 while(x=getch()) { BC=8; if(x=='\r') { while(a[BC][5]!=16) BC=BC+2; controlmain(BC); } if(x=='w' || x=='a' ) { if(a[8][5]==16 ) continue; a[i][5]=' '; a[i][6]=' '; a[i][59]=' '; a[i][58]=' '; i=i-2; a[i][5]=16; a[i][6]=16; a[i][59]=17; a[i][58]=17; j=0; system("cls"); while(j<20) printf("%s\n",a+j++); } else if(x=='s' || x=='d') { if(a[14][5]==16) continue; a[i][5]=' '; a[i][6]=' '; a[i][59]=' '; a[i][58]=' '; i=i+2; a[i][5]=16; a[i][6]=16; a[i][59]=17; a[i][58]=17; j=0; system("cls"); while(j<20) printf("%s\n",a+j++); } else continue; } } //--------------------------------------------------------------------------- void picture() { int i=0; char a[20][80]={"\0", //0 "\0", //1 "\0", //2 "\0", //3 " ^^^^^^^^^^^^^^^^^^^^^ 欢迎使用 ^^^^^^^^^^^^^^^^^^^^^^", //4 "\0", //5 " 请选择要进行的操作: ", //6 "\0", //7 " 浏览全部 <----------> 1 ",//8 "\0", //9 " 新建用户 <----------> 2 ",//10 "\0", //11 " 查找用户 <----------> 3 ",//12 "\0", //13 " 退出程序 <----------> 4 "};//14 a[8][5]=16; a[8][6]=16; a[8][59]=17; a[8][58]=17; while(i<20) printf("%s\n",a+i++); face(a); } //===================================================================== void facenode() //节点操作表 { node *p=head; char x='z'; int AC=8; while(x=getch() ) { if(x=='\r') { p=head->next; AC=1; while(p->count[1]!=16) { AC=AC+1; p=p->next; } if(p==head) { controlmain(99);} //返回主菜单 else opration(AC); //AC为要修改或删除的节点序号 int型 } if(x=='w' || x=='a') { if(head->next->count[1]==16 ) continue; p->count[1]=' '; p->count[2]=' '; //p->number[LENTH-2]=' '; //p->number[LENTH-3]=' '; p=p->prior; p->count[1]=16; p->count[2]=16; //p->number[LENTH-2]=17; //p->number[LENTH-3]=17; system("cls"); list(); } else if(x=='s' || x=='d') { if(head->count[1]==16 ) continue; p->count[1]=' '; p->count[2]=' '; //p->number[LENTH-2]=' '; //p->number[LENTH-3]=' '; p=p->next; p->count[1]=16; p->count[2]=16; //p->number[LENTH-2]=17; //p->number[LENTH-3]=17; system("cls"); list(); } else continue; } } //------------------------------------------------------------------------- node *newone() //创建头节点 { node *p; p=(node *)malloc(sizeof(node)); memset(p->count,' ',LENTH); p->next=NULL; p->prior=NULL; return p; }//newone //-------------------------------------------------------------------------- void start() //链表初始化 { head=newone(); strcpy(head->name,"返回主菜单"); memset(head->count,' ',5); memset(&head->count[5],'\0',5); memset(head->number,'\0',LENTH); head->prior=head; } //---------------------------------------------------------------------- void creat() //添加新用户 { int i=0,j=0;char x,c; char arry[10][40]={"\0", //0 " 要继续新建联系人? ", //1 "\0", //2 " 确认 Y ", //3 "\0", //4 " 取消 N ", //5 "\0"}; //6 node *p; node *q,*temp; FILE *fp=fopen(path,"at"); temp=newone(); p=head->prior; //P指向最后一个节点 i=atoi(head->prior->count); //求出最后一个节点的序号,即总数 arry[3][3]=16; arry[3][4]=16; arry[3][22]=17; arry[3][23]=17; for(;;) { system("cls"); printf("\n\n\n\n\n\n\n\n"); j=0; while(j<10) printf(" %s\n",arry+j++); while(x=getch()) { system("cls"); printf("\n\n\n\n\n\n\n\n"); j=0; while(j<10) printf(" %s\n",arry+j++); if(x=='\r') { if(arry[3][3]==16) { system("cls"); memset(temp->name,'\0',LENTH); memset(temp->number,'\0',LENTH); printf("\n\n 请输入姓名和电话:\n"); scanf("%s%s",&temp->name,&temp->number); printf("\n\n_________________确定将%s的信息存入通讯录?Y/N________________\n",temp->name); c=getch(); if(c=='y' || c=='Y') { fp=fopen(path,"at"); q=newone(); //序号寸入 i++; sprintf(&q->count[5],"%d",i); // sprintf(&head->count[5],"%d",i); //导入姓名与电话 strcpy(q->name,temp->name); strcpy(q->number,temp->number); //接入链表 p->next=q; q->prior=p; q->next=head; head->prior=q; p=p->next; if(fp) { if(1==i) fprintf(fp,"%-4s %-12s %-12s\n","序号","姓名","电话号码"); fprintf(fp,"%-8s %-12s %-12s \n",q->count,q->name,q->number); printf("\n\n\n___________________________ 已成功导入%s\n",path); fclose(fp); Sleep(1000); } else printf("通讯录文件出错!请检查PATH\n"); if(1==i) { p->count[1]=16;p->count[2]=16; p->number[LENTH-2]=17;p->number[LENTH-3]=17; } } } if(arry[5][3]==16) { system("cls"); picture(); break; } } // =='\r' if(x=='w' || x=='a') { if(arry[3][3]==16) continue; arry[3][3]=16; arry[3][4]=16; arry[3][22]=17; arry[3][23]=17; arry[5][3]=' '; arry[5][4]=' '; arry[5][22]=' '; arry[5][23]=' '; system("cls"); printf("\n\n\n\n\n\n\n\n"); j=0; while(j<10) printf(" %s\n",arry+j++); } else if(x=='s' || x=='d') { if(arry[5][3]==16) continue; arry[3][3]=' '; arry[3][4]=' '; arry[3][22]=' '; arry[3][23]=' '; arry[5][3]=16; arry[5][4]=16; arry[5][22]=17; arry[5][23]=17; system("cls"); printf("\n\n\n\n\n\n\n\n"); j=0; while(j<10) printf(" %s\n",arry+j++); } else continue; } //while }//for }// creat //--------------------------------------------------------------------------- void del(int n) //删除用户,n为要删除的节点序号int { node *q=head,*p=head; int j=0; while(p!=head->prior) { q=p; p=p->next; if(atoi(&p->count[5])==n) { //sprintf(head->count+5,"%d",i); //当删除的为最后一个节点时yy if(p->next==head) { system("title 111"); q->next=head; head->prior=q; free(p); printf("删除完成!"); filesite(); //文件重写 Sleep(500); system("cls"); break; } //常规删除 q->next=p->next; p->next->prior=p->prior; //序号进一 do { q=q->next; j=atoi(q->count); j--; sprintf(&q->count[5],"%d",j); }while(q->next!=head); filesite(); //文件重写 printf("删除完成!\n"); Sleep(400); system("cls"); break; } //if } // while } // del //----------------------------------------------------------------------------- void search() //动态搜索 { char test[LENTH]={"\0"}; //定义测试关键码及长度 int i=0; char temp; // char arr[LENTH]={"\0"}; char arrname[LENTH]={"\0"}; char num[10]={"序号"},name[10]={"姓名"},tel[10]={"电话"}; node *p=head; system("cls"); printf("\n\n==================================查找===============================\n\n"); while(i<LENTH) { p=head; system("cls"); printf("\n\n\n %s %-12s %-12s\n",num,name,tel); while(p->next && p->next!=head) { p=p->next; memset(arr,'\0',LENTH); memset(arrname,'\0',LENTH); strncpy(arr,p->number,i); strncpy(arrname,p->name,i); if(0==strcmp(arr,test) || 0==strcmp(arrname,test)) { printf("_______________________________________________________________\n"); printf(" %s %12s\n",&p->count[3],p->name); printf(" %12s \n",p->number); } } printf("\n\n=========================查找=============================\n\n"); puts(test); putchar(10); temp=getch(); if(!i && temp=='\b') break; if(i && temp=='\b') { test[i-1]='\0'; i=i-2; } else if(!i && temp=='\b') continue; else { test[i]=temp; } i++; }//while输入 printf("查找结束\n"); Sleep(500); system("cls"); }//search //------------------------------------------------------------------------------ void list() //显示全部列表 { char num[10]={"序号"},name[10]={"姓名"},tel[10]={"电话"}; node *p; char x; putchar(10);putchar(10); p=head; if(!p->next) { printf("\n\n\n_______________ 通讯录目前为空! 是否开始新建? Y/N _________________\n\n"); x=getch(); if(x=='Y' || x=='y') { system("cls"); creat(); } else { system("cls"); picture(); } } else { printf(" %s %-12s %-12s\n\n",num,name,tel); do { p=p->next; printf("_______________________________________________________________\n"); printf(" %s %12s\n",p->count,p->name); printf(" %12s \n",p->number); }while(p->next && p->next!=head->next); printf("_______________________________________________________________\n"); printf("\n 共计%s 个人信息!\n\n",&head->prior->count[3]); } }// list //-------------------------------总控制台------------------------------------------ void control(int x,int p) //X为操作类型,P为操作码(int) { char temp[LENTH]={'\0'}; char c; //char pchar[LENTH]={'\0'}; node *q=head; //sprintf(pchar,"%s",p); /* if(p!=atoi(pchar)) { printf("need debug!!! please check!\n "); Sleep(100000); } */ q=head; while(atoi(&q->count[5])!=p) //目标节点定位 { q=q->next; } switch(x) { case 21: //修改用户姓名 { printf("请输入新的用户名:\n"); scanf("%s",temp); printf("\n确定修改名为%s的用户信息? Y/N\n",q->name); c=getch(); if(c=='Y' || c=='y') { memset(q->name,'\0',LENTH); strcpy(q->name,temp); filesite(); //文件重写 printf("修改成功!\n"); Sleep(500); check(); system("cls"); list(); facenode(); } else { printf("放弃存入!\n"); Sleep(500); check(); system("cls"); check(); list(); facenode(); } break; } case 23: //修改用户电话号码 { printf("请输入新的电话号码:\n"); scanf("%s",temp); printf("\n确定修改名为%s的用户信息? Y/N\n",q->name); c=getch(); if(c=='Y' || c=='y') { memset(q->number,'\0',LENTH); strcpy(q->number,temp); filesite(); //文件重写 printf("修改成功!\n"); Sleep(500); check(); system("cls"); list(); facenode(); } else { printf("放弃存入!\n"); Sleep(500); check(); system("cls"); list(); facenode(); } break; } case 25:del(p);check();list();facenode();break; //----------------------------以上为单个用户的修改删除---------------------------------------------- //返回当前列表 case 27: { check(); system("cls"); list(); facenode(); break; } default: printf("error!\n");break; } } //----------------------------------------------------------------------- void controlmain(int x) //主菜单对应的功能 { switch(x) { case 8: check();list();system("cls");check();list();facenode();break; case 10: creat();system("cls");picture();break; case 12: search();picture();break; case 14: exit(0);break; case 99: system("cls");picture();break; default: printf("\n12345678\n");break; }//-------------------------以上为主导航界面需要--20以内------------------------------------- } //----------------------------------------------------------------------- void opration(int p) //单个用户对应的操作 由facenode()调用 { int i=0; char arr[8][60]={"\0", //0 " 修改该用户姓名 ", //1 "\0", //2 " 修改该用户电话 ", //3 "\0", //4 " 删除该用户资料 ", //5 "\0", //6 " 返回 ", //7 }; printf("\n\n______________________________________________________\n"); arr[1][1]=16; arr[1][2]=16; arr[1][19]=17; arr[1][20]=17; system("cls"); printf("\n\n\n\n\n\n\n\n 您想做什么?\n\n"); while(i<8) printf(" %s\n",arr[i++]); faceopration(arr,p); //p为要修改或删除节点序号,int类型,由facenode()中调用opration()函数传入 } void faceopration(char a[][60],int p) //节点操作表 { int j=0; char x='z'; int i=1,CC=1; while(x=getch()) { if(x=='\r') { CC=1; while(a[CC][1]!=16) { CC=CC+2; } control(CC+20,p); //CC为操作码,P为要修改删除的节点序号int型由AC计数传入 } if(x=='w' || x=='a' ) { if(a[1][1]==16 ) continue; a[i][1]=' '; a[i][2]=' '; a[i][19]=' '; a[i][20]=' '; i=i-2; a[i][1]=16; a[i][2]=16; a[i][19]=17; a[i][20]=17; j=0; system("cls"); printf("\n\n\n\n\n\n\n\n 您想做什么?\n\n"); while(j<8) { printf(" %s\n",a+j++); } } else if(x=='s' || x=='d') { if(a[7][1]==16) continue; a[i][1]=' '; a[i][2]=' '; a[i][19]=' '; a[i][20]=' '; i=i+2; a[i][1]=16; a[i][2]=16; a[i][19]=17; a[i][20]=17; j=0; system("cls"); printf("\n\n\n\n\n\n\n\n 您想做什么?\n\n"); while(j<8) { printf(" %s\n",a+j++); } } else continue; } } ////////////////////////////////////////////////////////////////////////////////////////////// main() { system("title 通讯录 --by Giant"); start(); picture(); } /////////// // // // // // // // // //////// //////// ///////// // // ////// // // // // // // // ///// // // // // // // // // // // //// // // // // // // // // // // // // // /////////// // // // // ////// /////////////////////////////////////////////////////////////////////////////////////////////
C语言研究中心(www.dotcpp.com)