数据结构课程设计—通讯录管理系统

来源:互联网 发布:sql server 教程 高级 编辑:程序博客网 时间:2024/04/27 18:45
/**************************** 
*版权所有  (C)2016.ccx 

*文件名称:   ccx.cpp 
*文件标识:   无 
*内容摘要:   该项目的所有函数的实现 
*其他说明:   无 
*当前版本:   V1.0 
*作   者:    郗传秀
*完成日期:   20161225 

*修改记录:   6 
*修改日期:   20161229 
*版本号:     V1.0 
*修改人:     郗传秀 
*修改内容: 

********************************************************************/  

#include"ccx.h"void choose();//主菜单void searchmenu();//查询菜单void add();//添加新纪录   添加新用户void searchna();//按条件(姓名)搜索记录void display();//显示全部记录void load();//载入文件内容void save();//写入文件void del();//删除记录void listinsert();//插入结点函数void bianji();//编辑void dial();//拨号/***********************主函数************************************//************************************************************功能描述:  主函数*输入参数:   无*输出参数:   无*返回值:     无*************************************************************/int main() //主函数{load();listinsert();while (1)choose(); //进入主菜单,有非法输入仍停留在主菜单    return 0;}/***********************主函数************************************//***********************load函数*****************************//************************************************************功能描述:  装载导入文件*输入参数:   无*输出参数:   无*返回值:     无*************************************************************/void load()//装载已有文件信息{if((fp=fopen("txl.txt","rb"))==NULL){printf("\n\t\t通讯录文件不存在");if ((fp=fopen("txl.txt","wb"))==NULL){printf("\n\t\t建立失败");exit(0);{printf("\n\t\t通讯录文件已建立");printf("\n\t\t按任意键进入主菜单");getch();        }}elsereturn;exit(0);}//导入文件功能部分fseek(fp,0,2);if (ftell(fp)>0){rewind(fp);for(len=0;!feof(fp)&&fread(&yong[len],sizeof(struct yonghu),1,fp);len++);printf("\n\t\t文件导入成功");printf("\n\t\t按任意键返回主菜单");getch();return;}printf("\n\t\t文件导入成功");printf("\n\t\t通讯录文件中无任何纪录");printf("\n\t\t按任意键返回主菜单");getch();return;}void listinsert()//增加新结点{linklist s,p=l;for(int i=0;i<len;i++){s=(linklist)malloc(sizeof(pnode));        strcpy(s->data.name,yong[i].name);        strcpy(s->data.fm,yong[i].fm);        strcpy(s->data.addr,yong[i].addr);        strcpy(s->data.tel,yong[i].tel);        strcpy(s->data.group,yong[i].group);        strcpy(s->data.kuaijie,yong[i].kuaijie);        s->data.tms=yong[i].tms;     if(head==NULL)   //若为空,则建立新节点//////////////////////////////////////////////////            {                head=s;                r=head;                head->next=NULL;            }            else         //否则,插入节点////////////////////////尾插法            {                r->next=s;                r=s;                r->next=NULL;            }///////////////////////////////////}}/*********************主菜单界面********************************//************************************************************功能描述:  提供选择界面*输入参数:   选择键*输出参数:   无*返回值:     无*************************************************************/void choose()//主菜单{char ch;system("cls");printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");printf("\n\t\t***************欢迎进入通讯录系统***************");printf("\n\t\t******************1-新添纪录     ***************");printf("\n\t\t******************2-查找联系人   ***************");printf("\n\t\t******************3-删除联系人   ***************");printf("\n\t\t******************4-保存         ***************");        printf("\n\t\t******************5-退出         ***************");        printf("\n\t\t******************6-编辑         ***************");        printf("\n\t\t******************7-拨号         ***************");        printf("\n\t\t******************7-发送信息     ***************");        printf("\n\t\t************************************************");        printf("\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");printf("\n\t\t请选择:");printf("%c ",ch=getch());switch (ch){case '1':add();break;case '2':searchmenu();break;case '3':del();break;case '4':save();break;case '5':exit(0);case '6':bianji();break;case '7':dial();break;default:choose();}}/*********************主菜单界面********************************//************************************************************功能描述:  添加新用户*输入参数:   新用户信息*输出参数:   无*返回值:     无*************************************************************/void add()//添加新纪录{    int x;    int a=0,i,findmark;l=(linklist)malloc(sizeof(pnode));    //建立头节点printf("\n\t\t**************** 请输入用户信息 ****************\n");printf("\n\t\t姓名:");scanf("%s",&yong[len].name);printf("\n\t\t性别:");scanf("%s",&yong[len].fm);                printf("\n\t\t地址:");                scanf("%s",&yong[len].addr);            printf("\n\t\t联系方式:");            scanf("%s",&yong[len].tel);            printf("\n\t\t分组:");            scanf("%s",&yong[len].group);            printf("\n\t\t快捷键:");            scanf("%s",&yong[len].kuaijie);            len++;            printf("\n\t\t==============新用户添加成功=============================\n");            printf("\n\t\t=============是否继续添加新用户==========================\n");            printf("\n\t\t======继续添加请选1      返回主界面请选2=============\n");            scanf("%d",&x);            if(x==1)                    {                        add();                    }                if(x==2)                    {                        choose();                    }}/************************************************************功能描述:  查询选择菜单*输入参数:   选择键*输出参数:   无*返回值:     无*************************************************************/void searchmenu()//查询菜单{char ch;system("cls");printf("\n\t\t=================查询菜单 =======================");printf("\n\t\t================1-显示所有记录===================");printf("\n\t\t================2-按姓名查询=====================");printf("\n\t\t================3-返回主菜单=====================");printf("\n\t\t=================================================");printf("\n\t\t请选择:");printf("%c",ch=getch());switch (ch){case '1':display();break;case '2':searchna();break;case '3':choose();break;}}/************************************************************功能描述:  按照输入的用户姓名进行查找*输入参数:   用户姓名*输出参数:   用户所有信息*返回值:     无*************************************************************/void searchna()////查找按姓名{printf("\n\t\t======================按姓名查找 =============================");char name[20];printf("\n\t\t请输入姓名:");scanf("%s",name);printf(" \n\t\t查询到的信息:\n");printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");//格式控制输出printf(" -----------------------------------------------------------------------------\n");for (int i=0;i<len;i++){if(strcmp(name,yong[i].name)==0)printf(" %-10s%-10s%-10s%-10s%-10s%-s\n",yong[i].name,yong[i].addr,yong[i].tel,yong[i].group,yong[i].kuaijie,yong[i].fm);if (i+1<len) continue;//重名纪录再检索}printf(" -----------------------------------------------------------------------------\n");printf("\n\t\t按任意键返回查询菜单");getch();searchmenu();}/************************************************************功能描述:  显示此通讯录总所有用户的信息*输入参数:   无*输出参数:   所有用户信息*返回值:     无*************************************************************/void display()//显示所有纪录{int i;system("cls");if(len!=0){printf("\n\t\t=================== 以下为通讯录所有信息=====================\n\n");printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");printf(" -----------------------------------------------------------------------------\n");for (i=0;i<len;i++){printf(" %-10s%-10s%-10s%-10s%-10s%-s\n",yong[i].name,yong[i].addr,yong[i].tel,yong[i].group,yong[i].kuaijie,yong[i].fm);if (i+1<len) continue;}printf(" -----------------------------------------------------------------------------\n");}elseprintf("\n\t\t通讯录中无任何纪录");printf("\n\t\t按任意键返回查询菜单:");getch();searchmenu();}/************************************************************功能描述:  查找到要删除的用户,进行删除,进行同名检索*输入参数:   用户姓名*输出参数:   无*返回值:     无*************************************************************/void del() //删除纪录{    int ch;int a=0,i,j,findmark; //findmark为查找结果标志 //   int findmark=0,delmark=0;    char name[20];    printf("\n\t\t请输入要删除学生姓名:");    scanf("%s",name);for (i=a;i<len;i++){if (findmark=strcmp(yong[i].name,name)==NULL) //找到一条符合条件的记录{//findmark++;printf("\n\t\t以下是您要删除的用户记录:\n");printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");printf(" -----------------------------------------------------------------------------\n");printf(" %-10s%-10s%-10s%-10s%-10s%-s\n",yong[i].name,yong[i].addr,yong[i].tel,yong[i].group,yong[i].kuaijie,yong[i].fm);printf(" -----------------------------------------------------------------------------\n");printf("\n\t\t是否删除?(y/n)");if (getch()=='y'){for (j=i;j<len-1;j++)yong[j]=yong[j+1];len--;i--;//delmark++;printf("\n\t\t删除成功");if((i+1)<len){printf("\n\t\t是否继续删除相同姓名的同学信息?(y/n)\n"); //是否删除同名纪录if (getch()=='y'){a=i;continue; //删除上一条记录之后搜索是否有同名纪录}else                    {                        printf("返回主界面");                        Sleep(3000);                        choose();                    }}} //endifif((i+1)<len){printf("\n\t\t是否继续删除相同姓名的同学信息?(y/n)\n"); //不删前一条纪录,删当前纪录if (getch()=='y'){a=i;continue;}else                {                    printf("返回主界面");                    Sleep(2000);                    choose();                }}} //endifelsecontinue;} //endforif(!findmark)//没有找到任何符合条件的记录  输入为注册过的用户时printf("\n\t\t没有符合条件的记录!");printf("\n\t\t继续删除请按1     返回主界面请按2  \n"); //无同名纪录,是否继续删除其他纪录scanf("%d",&ch);if (ch==1)del();    if(ch==2)        Sleep(3000);        choose();//继续删除其他纪录}/************************************************************功能描述:  将操作完成后的信息存储到文件*输入参数:  无*输出参数:   无*返回值:     无*************************************************************/void save()//写入文件//将文件存起来下次打开可看{int i;if ((fp=fopen("txl.txt","wb"))==NULL){printf("\n\t\t文件打开失败");}for (i=0;i<len;i++){if (fwrite(&yong[i],sizeof(struct yonghu),1,fp)!=1)printf("\n\t\t写入文件错误!\n");}fclose(fp); //关闭文件指针printf("\n\t\t通讯录文件已保存,按任意键继续...");getch();return;}/************************************************************功能描述:  对已存在的用户进行编辑*输入参数:  用户姓名*输出参数:   无*返回值:     无*************************************************************/void bianji()//编辑{    int ch,xuan;    pnode *s;int a=0,i,j,findmark; //findmark为查找结果标志    char name[20];    printf("\n\t\t请输入要编辑的用户姓名:");    scanf("%s",name);for (i=a;i<len;i++){if (findmark=strcmp(yong[i].name,name)==NULL) //找到一条符合条件的记录{printf("\n\t\t以下是您要改变的用户记录:\n");printf(" %-10s%-10s%-10s%-10s%-10s%-s\n","姓名","地址","联系方式","分组","快捷键","性别");printf(" -----------------------------------------------------------------------------\n");printf(" %-10s%-10s%-10s%-10s%-10s%-s\n",yong[i].name,yong[i].addr,yong[i].tel,yong[i].group,yong[i].kuaijie,yong[i].fm);printf(" -----------------------------------------------------------------------------\n");printf("\n\t\t是否改变?(y/n)");if (getch()=='y'){    printf("\n\t\t===============================================\n");    printf("\n\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");    printf("\n\t\t请选择要编辑的内容\n");                printf("\n\t\t编辑姓名请选择1       编辑地址请选择2\n");    printf("\n\t\t编辑联系方式请选择3       编辑分组请选择4\n");    printf("\n\t\t编辑快捷键请选择5\n");    printf("\n\t\t请输入要改变的内容\n");    printf("\n\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★");    printf("\n\t\t===============================================\n");    scanf("%d",&xuan);    if(xuan==1)                {                    printf("请输入新用户名\n");                    scanf("%s",&s->data.name);                    strcpy(yong[i].name,s->data.name);                }                if(xuan==2)                {                    printf("请输入新用户地址\n");                    scanf("%s",&s->data.addr);                    strcpy(yong[i].addr,s->data.addr);                }                if(xuan==3)                {                    printf("请输入新联系方式\n");                    scanf("%s",&s->data.tel);                    strcpy(yong[i].tel,s->data.tel);                }                if(xuan==4)                {                    printf("请输入新用户分组\n");                    scanf("%s",&s->data.group);                    strcpy(yong[i].group,s->data.group);                }                if(xuan==5)                {                    printf("请输入新用户快捷键\n");                    scanf("%s",&s->data.kuaijie);                    strcpy(yong[i].kuaijie,s->data.kuaijie);                }printf("\n\t\t编辑成功");} //endif} //endifelsecontinue;} //endforif(!findmark)//没有找到任何符合条件的记录  输入为注册过的用户时printf("\n\t\t没有其他符合条件的记录!");printf("\n\t\t继续编辑请按1     返回主界面请按2  \n"); //无同名纪录,是否继续删除其他纪录scanf("%d",&ch);if (ch==1)bianji();    if(ch==2)        Sleep(3000);        choose();//继续删除其他纪录}/************************************************************功能描述:  拨号或者发送信息*输入参数:  选择键,姓名,快捷键*输出参数:   tms*返回值:     无*************************************************************/void dial()       //拨号功能{    int c,choic;int ch,xuan;    int r;    pnode *p;pnode *s;int a=0,i,j,findmark; //findmark为查找结果标志    char name[20];    char b[20];    printf("         \n");    printf("+------------------------------------------------+\n");    printf("\n\t\t   请按要求输入您的选择\n");    printf("+     使用用户姓名联系请按(1)    使用快捷键联系请按(2)   +\n");  //两种拨号方式    printf("+----------------------------------------------+\n");    scanf("%d",&r);    p=head;    if(r==1)    {        printf("                    请输入联系用户的姓名:\n");        scanf("%s",name);for (i=a;i<len;i++){if (findmark=strcmp(yong[i].name,name)==NULL) //找到一条符合条件的记录{printf("\n\t\t呼叫此用户请按1,发送信息到此用户请按2\n");int v;scanf("%d",&v);            if(v==1)            {                 printf("+----------------------------------------------+\n");            printf("        loding------                           \n");            for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面            {                Sleep(100);                printf("■■");            }            printf("                                               \n");            printf("                                               \n");            Sleep(1000);            printf("\n\t\t此用户联系方式为:%s\n",yong[i].tel);            yong[i].tms=yong[i].tms+1;            printf("\n\t\t+----------------------------------------------+\n");            printf("\n\t\t拨打次数:    %d",yong[i].tms);            printf("\n\t\t+----------------------------------------------+\n");            printf("\n\t\t稍后返回主界面\n");            Sleep(3000);            }            if(v==2)            {                printf("\n\t\t\=========\n");                char neirong[200];                printf("\n\t\t请输入要发送的内容\n");                scanf("%s",neirong);                printf("\n\t\t发送中......\n");                for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面                {                    Sleep(100);                    printf("■■");                }                printf("\n\t\t发送成功\n");                Sleep(1000);                printf("\n\t\t稍后返回主界面\n");                Sleep(3000);            }}}if(!findmark)    {        printf("\n\t\t没有符合条件的记录!");        Sleep(1000);    }}else{    printf("\n\t\t请输入要编辑的用户快捷键:");     scanf("%s",&b);for (i=a;i<len;i++){if (findmark=strcmp(yong[i].kuaijie,b)==NULL) //找到一条符合条件的记录{  printf("呼叫此用户请按1,发送信息到此用户请按2");            int v;            scanf("%d",&v);            if(v==1)            {                 printf("+----------------------------------------------+\n");            printf("        loding------                           \n");            for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面            {                Sleep(100);                printf("■■");            }            printf("                                               \n");            printf("                                               \n");            Sleep(2000);            printf("%s\n",yong[i].tel);            yong[i].tms=yong[i].tms+1;            printf("\n\t\t+----------------------------------------------+\n");            printf("拨打次数:    %d",yong[i].tms);            printf("\n\t\t+----------------------------------------------+\n");            printf("\n\t\t稍后返回主界面\n");            Sleep(3000);            }            if(v==2)            {                printf("\n\t\t\=========\n");                char neirong[200];                printf("\n\t\t请输入要发送的内容\n");                scanf("%s",neirong);                printf("\n\t\t发送中......\n");                for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面                {                    Sleep(100);                    printf("■■");                }                printf("\n\t\t发送成功\n");                Sleep(1000);                printf("\n\t\t稍后返回主界面\n");                Sleep(3000);            }}}if(!findmark)    {        printf("\n\t\t没有符合条件的记录!");        Sleep(1000);    }//没有找到任何符合条件的记录  输入为注册过的用户时    }}/*void dial()       //拨号功能{    int c,choic;    int a;    pnode *p;    char name[10];    char b[20];    printf("         \n");    printf("+------------------------------------------------+\n");    printf("\n\t\t   请按要求输入您的选择\n");    printf("+     使用用户姓名联系请按(1)    使用快捷键联系请按(2)   +\n");  //两种拨号方式    printf("+----------------------------------------------+\n");    scanf("%d",&a);    p=head;    if(a==1)    {        printf("                    请输入联系用户的姓名:\n");        scanf("%s",name);        while(strcmp(name,p->data.name)!=0&&p!=NULL)//进行查找   查找用户名为name的用户            p=p->next;        if(p==NULL)//用户不存在        {            printf("+----------------------------------------------+\n");            printf("                 您选择的用户不存在!\n");            printf("+----------------------------------------------+\n");            printf("+       重新输入请按(1)    返回主菜单(2)        +\n");            printf("+----------------------------------------------+\n");            scanf("%d",&choic);            if(choic==1)            {                system("cls");                dial();            }            if(choic==2)            {                system("cls");                choose();            }        }        else//找到此用户  名为name        {            printf("呼叫此用户请按1,发送信息到此用户请按2");            int v;            scanf("%d",&v);            if(v==1)            {                 printf("+----------------------------------------------+\n");            printf("        loding------                           \n");            for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面            {                Sleep(100);                printf("■■");            }            printf("                                               \n");            printf("                                               \n");            Sleep(2000);            printf("%s\n",&p->data.tel);            p->data.tms=p->data.tms+1;            printf("+----------------------------------------------+\n");            printf("拨打次数:    %d",p->data.tms);            printf("+----------------------------------------------+\n");            printf("\n\t\t稍后返回主界面\n");            Sleep(5000);            }            if(v==2)            {                printf("\n\t\t\=========\n");                char neirong[200];                printf("\n\t\t请输入要发送的内容\n");                scanf("%s",neirong);                printf("\n\t\t发送中......\n");                for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面                {                    Sleep(100);                    printf("■■");                }                printf("\n\t\t发送成功\n");                Sleep(2000);                printf("\n\t\t稍后返回主界面\n");                Sleep(5000);            }        }    }    else    {        printf("\n\t\t请输入快捷键号码:\n");        scanf("%s",&b);        while(p!=NULL&&strcmp(b,p->data.kuaijie)!=0)                   //遍历链表比较查询   遍历查询  利用快捷键            p=p->next;        if(p==NULL)        {            printf("\n\t\t   您输入的单键号码不存在!\n");            printf("\n\t\t+----------------------------------------------+\n");            printf("\n\t\t+      重新输入请按(1)    返回主菜单(2)        +\n");            printf("\n\t\t+----------------------------------------------+\n");            scanf("%d",&choic);            if(choic==1)            {                dial();            }            if(choic==2)            {                Sleep(2000);                system("cls");                choose();            }        }        else        {            printf("呼叫此用户请按1,发送信息到此用户请按2");            int v;            scanf("%d",&v);            if(v==1)            {                             printf("                                               \n");            printf("        loding------                                        \n");            for(int j=0; j<20; j++)            {                Sleep(100);                printf("■■");            }             printf("                                               \n");             printf("                                               \n");            Sleep(5000);            printf("%s\n",p->data.name);            printf("%s\n",p->data.tel);            p->data.tms=p->data.tms+1;            printf("\n\t\t+----------------------------------------------+\n");            printf("拨打次数:    %d",p->data.tms);                  //显示拨打次数            printf("\n\t\t+----------------------------------------------+\n");            printf("\n\t\t稍后回到主界面\n");            Sleep(5000);            }            if(v==2)            {                printf("\n\t\t=============\n");                char neirong[200];                printf("\n\t\t请输入要发送的内容\n");                scanf("%s",neirong);                printf("\n\t\t发送中......\n");                for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面                {                    Sleep(100);                    printf("■■");                }                printf("\n\t\t发送成功\n");                Sleep(2000);                printf("\n\t\t稍后返回主界面\n");                Sleep(5000);            }        }    }}*/



头文件
ccx.h
#ifndef CCX_H_INCLUDED#define CCX_H_INCLUDED#include <stdio.h>#include<iostream>#include <stdlib.h>#include <string.h>#include<windows.h>#include <conio.h>#define maxl 1000struct yonghu{char name[20];//姓名char fm[20];//性别char addr[20];//地址char tel[20];//联系方式char group[20]; //分组char kuaijie[20];//快捷键int tms;//拨打次数}yong[maxl];//1000个记录,可修改struct pnode{yonghu data;struct pnode *next/*, *prior*/;//双循环链表};typedef  pnode * linklist;linklist head=NULL,r=NULL;   //初始化链表   单链表linklist l;int len=0;//链表长度FILE *fp; //文件指针#endif // CCX_H_INCLUDED

运行结果
主界面
新添记录
查询
删除
编辑
拨号/发送信息
设计心得:
利用了单链表,将每个独立的用户已一个个节点的形式连到一起,在基本的“增删改查”中加入了退出、保存以及拨号和发送信息界面
讲头文件与cpp文件链接运行,实现以上功能

0 0
原创粉丝点击