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

/***********************************************************
*版权所有  (C)2015. ChengAng
*
*文件名称:   zupu.cpp
*文件标识:   无
*内容摘要:   该项目的所有函数的实现
*其他说明:   无
*当前版本:   V1.0
*作   者:    程昂
*完成日期:   20151223
*
*修改记录1:
*修改日期:   20151223
*版本号:     V1.0
*修改人:     Cheng Ang
*修改内容:
********************************************************************/


#include"zupu.h"
/***********************************************************
*功能描述:  主函数,负责项目的调度
*输入参数:   无
*输出参数:   无
*返回值:     无
*其他说明:   无
*************************************************************/
int main()     //主函数
{
    creat();
    huanying();
	Save();
    return 0;
}
/***********************************************************
*功能描述:新建或者打开已经存在的文件,从中读取内容
*输入参数:   无
*输出参数:   无
*返回值:     无
*其他说明:   无
*************************************************************/
void creat()     //创建或读取文件
{
    int j;
    long k;
    fp=fopen("数据文件.txt","r t");
    if(fp!=NULL)
    {
        for(i=0; i<=maxlen; i++ )
        {
            j=fgetc(fp);

            if(j==EOF)

                return;
            k=i;
            fseek(fp,k*sizeof(struct persons),0);

            fread(&persons[i],sizeof(struct persons),1,fp);

            s=(linklist)malloc(sizeof(listnode));

            s->num=persons[i].num;

            strcpy(s->name,persons[i].name);

            strcpy(s->e_addr,persons[i].e_addr);

            strcpy(s->tel_no,persons[i].tel_no);

            s->sim_no=persons[i].sim_no;

            strcpy(s->arch,persons[i].arch);

            s->cishu=persons[i].cishu;

            if(head==NULL)   //若为空,则建立新节点
            {
                head=s;
                r=head;
                head->next=NULL;
            }
            else         //否则,插入节点
            {
                r->next=s;
                r=s;
                r->next=NULL;
            }
        }
        fclose(fp);
    }
    else                            //存入文件
    {
        fp=fopen("数据文件.txt","w");
        i=1;
    }
}
/***********************************************************
*功能描述:   开始界面,提供选择操作的界面
*输入参数:   选择键
*输出参数:   无
*返回值:     无
*其他说明:   通过选择进入各种功能
*************************************************************/
void huanying()     //选择界面
{
    system("cls");   //清屏
    do
    {
        xiaotu();
        cout<<"                欢迎使用通讯录管理系统~~~~~~~"<<endl;
        cout<<endl;
        cout<<"+---------------------------------------------------------+"<<endl;
        cout<<"+ 1.显示分组信息请按1           4.编辑信息请按4           +"<<endl;
        cout<<"+ 2.删除信息请按2               5.拨号请按5               +"<<endl;
        cout<<"+ 3.添加信息请按3               6.保存并退出请按6         +"<<endl;
        cout<<"+ 7.查找信息请按7               8.输出全部信息请按8       +"<<endl;
        cout<<"+---------------------------------------------------------+"<<endl;
        cout<<endl;
        cout<<"请输入您的的选择-----"<<endl;
        cin>>ch;
        switch(ch)           //选择操作
        {
        case '1':
            system("cls");
            Show();
            break;
        case '2':
            system("cls");
            Delete();
            break;
        case '3':
            system("cls");
            Input();
            break;
        case '4':
            system("cls");
            Alter();
            break;
        case '5':
            system("cls");
            Dial();
            break;
        case '6':
            system("cls");
            Save();
            fclose(fp);
            xiaotu();
            exit(0);
            break;
        case '7':
            system("cls");
            find();
            break;
        case '8':
            system("cls");
            shuchu();
            break;
        default:
            printf("\n\t*********************************\n");
            printf("\n\t 请输入 1-8!!! \n");
            printf("\n\t**********************************");
            break;
        }
    }
    while(1);
}
/***********************************************************
*功能描述:   添加一个人的信息;插入到链表
*输入参数:   联系人信息
*输出参数:   无
*返回值:     无
*其他说明:   会有判断该人是否存在的功能;
              若存在则有返回重新输入或者回到主界面的功能.
*************************************************************/
void Input()      //添加信息
{
    int choic;
    s=(linklist)malloc(sizeof(listnode));    //建立头节点
    cout<<"----------------------------------------------"<<endl;
    printf("\n\n\t            请输入该用户的信息:\n");
    cout<<"请输入姓名:        ";
    cin>>s->name;
    cout<<"请输入电话:        ";
    cin>>s->tel_no;
    cout<<"请设置快捷键(0-9): ";
    cin>>s->sim_no;
    cout<<"请输入地址:        ";
    cin>>s->e_addr;
    cout<<"请输分组名         ";
    cin>>s->arch;
    s->cishu=0;
    cout<<"----------------------------------------------"<<endl;
    if(head==NULL)
        printf("\n\n");
    else
    {
        p8=head;
        while(p8!=NULL&&strcmp(s->name,p8->name)!=0&&strcmp(s->tel_no,p8->tel_no)!=0)
            p8=p8->next;

        if(p8!=NULL)
        {
            cout<<"+----------------------------------------------+"<<endl;
            cout<<"+------------您添加的用户已存在!---------------+"<<endl;
            cout<<endl;
            cout<<"+       重新输入请按1,返回菜单请按 3          +"<<endl;
            cout<<endl;
            cout<<"+----------------------------------------------+"<<endl;
            cin>>choic;
            if(choic==1)
                Input();
            if(choic==3)
                huanying();
            free(s);
        }
    }
    if(head==NULL)
    {
        head=s;
        head->next=NULL;
    }
    else
    {
        r->next=s;
        r=s;
        r->next=NULL;        //尾插法
    }
}
/***********************************************************
*功能描述:   查找一个联系人信息的功能
*输入参数:   联系人姓名
*输出参数:   该联系人信息
*返回值:     无
*其他说明:   无
*************************************************************/
void find()           //查找功能
{
    int choic;
    system("cls");
    printf("\n\n\t             请输入姓名:");
    cin>>name1;
    p10=head;
    while(p10!=NULL&&strcmp(name1,p10->name)!=0)           //判断是否存在
        p10=p10->next;
    if(p10==NULL)
    {
        printf("\n\n\t             您选择的用户不存在!");
        printf("\n\n\t2   请重新输入,请选择是重新输入(1)还是返回主菜单(2)");
        cin>>choic;
        if(choic==1)
        {
            find();
        }
        if(choic==2)
        {
            system("cls");
            huanying();
        }
    }
    else
    {
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   名  字:  "<<p10->name<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   电  话:  "<<p10->tel_no<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   快捷键:  "<<p10->sim_no<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   分  组:  "<<p10->arch<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+  拨打次数: "<<p10->cishu<<endl;
        cout<<"----------------------------------------------"<<endl;
		cout<<"**********************************************"<<endl;

        cout<<endl;
        cout<<"返回界面请按1"<<endl;
        cout<<endl;
        cout<<"----------------------------------------------"<<endl;
        cin>>choic;
        if(choic==1)
		{
			system("cls");
            huanying();
		}
     }
}
/***********************************************************
*功能描述:  编辑一个联系人的信息
*输入参数:   联系人信息
*输出参数:   无
*返回值:     无
*其他说明:   这里运用了input()的功能,同样有input()的判断功能
*************************************************************/
void Alter()         //编辑信息
{
    int choic;
    cout<<"+----------------------------------------------+"<<endl;
    cout<<endl;
    printf("\n\n\t           请输入姓名:");
    cin>>name1;
    cout<<endl;
    cout<<"+----------------------------------------------+"<<endl;
    p3=head;
    while(p3!=NULL&&strcmp(name1,p3->name)!=0)
        p3=p3->next;
    if(p3==NULL)
    {
        cout<<"+----------------------------------------------+"<<endl;
        cout<<"+------------您选择的用户不存在!---------------+"<<endl;
        cout<<endl;
        cout<<"+       重新输入请按1,返回菜单请按 3          +"<<endl;
        cout<<endl;
        cout<<"+----------------------------------------------+"<<endl;
        cin>>choic;
        if(choic==1)
            Alter();
        if(choic==3)
            huanying();
    }
    else
    {
        cout<<endl;
        printf("\n\n\t           请输入该用户的新信息!");
        cout<<"----------------------------------------------"<<endl;
        printf("\n\n\t            请输入该用户的信息:\n");
        cout<<"请输入姓名:";
        cin>>s->name;
        cout<<"请输入电话:";
        cin>>s->tel_no;
        cout<<"请设置快捷键(0-9):";
        cin>>s->sim_no;
        cout<<"请输入地址:";
        cin>>s->e_addr;
        cout<<"请输分组名";
        cin>>s->arch;
        s->cishu=0;
        cout<<"----------------------------------------------"<<endl;
        while(p9!=NULL&&strcmp(name1,p9->name)!=0&&strcmp(tel_no1,p9->tel_no)!=0)
            p9=p9->next;
        if(p9==NULL)
        {
            strcpy(p3->name,name1);
            strcpy(p3->tel_no,tel_no1);
            strcpy(p3->e_addr,e_addr1);
            p3->sim_no=sim_no1;
            strcpy(p3->arch,arch1);
        }
        else
        {
            cout<<"+----------------------------------------------+"<<endl;
            cout<<"+------------您添加的用户已存在!---------------+"<<endl;
            cout<<endl;
            cout<<"+               返回菜单请按 1                 +"<<endl;
            cout<<endl;
            cout<<"+----------------------------------------------+"<<endl;
            cin>>choic;
            if(choic==1)
            {
                system("cls");
                huanying();
            }
        }
    }
}
/***********************************************************
*功能描述:  进行对分组的选择功能
*输入参数:  分组名字
*输出参数:  无
*返回值:    分组名字
*其他说明:  无
*************************************************************/
void Show()      //选择想要查看的分组
{
    p2=head;
    int choic;
    char ch1[10];

    if(p2==NULL)    //若为空
    {
        cout<<"----------------------------------------------"<<endl;
        cout<<"                暂时没有分组                  "<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"                按1返回主菜单                 "<<endl;
        cout<<"----------------------------------------------"<<endl;
        cin>>choic;
        if(choic==1)
            huanying();

    }
    else
    {
        printf("                 你想要查看哪个分组?              \n");
        while(p2!=NULL)                                       //通过不断指向下一个节点读取分组信息
        {

            cout<<"------------分组:    "<<p2->arch<<endl;
            p2=p2->next;
            continue;
        }
        cout<<"               请输入分组名字选择     "<<endl;
        cout<<"                                      "<<endl;
        cin>>ch1;
        ShowA(ch1);
    }

}
/***********************************************************
*功能描述:输出一个分组的全部联系人的信息
*输入参数:   选择键
*输出参数:   无
*返回值:     无
*其他说明:   无
*************************************************************/
void ShowA(char aa[10])    //打印分组联系人信息
{
    int choic;
    p11=head;
    if(p11==NULL)
    {
        cout<<"----------------------------------------------"<<endl;
        cout<<endl;
        cout<<"该分组暂时没人,返回界面请按1,继续选择请按3"<<endl;
        cout<<endl;
        cout<<"----------------------------------------------"<<endl;

        cin>>choic;
        if(choic==1)
            huanying();
        if (choic==3)
            Show();
    }

    else
        while(p11!=NULL)
        {
            if((strcmp(p11->arch,aa))==0)
            {
                cout<<"----------------------------------------------"<<endl;
                cout<<"+   名  字:  "<<p11->name<<endl;
                cout<<"----------------------------------------------"<<endl;
                cout<<"+   电  话:  "<<p11->tel_no<<endl;
                cout<<"----------------------------------------------"<<endl;
                cout<<"+   快捷键:  "<<p11->sim_no<<endl;
                cout<<"----------------------------------------------"<<endl;
                cout<<"+   分  组:  "<<p11->arch<<endl;
                cout<<"----------------------------------------------"<<endl;
                cout<<"+  拨打次数: "<<p11->cishu<<endl;
                cout<<"----------------------------------------------"<<endl;
				cout<<"**********************************************"<<endl;
            }
            p11=p11->next;
            continue;
        }
    cout<<endl;
    cout<<"返回界面请按1,继续选择请按3"<<endl;
    cout<<endl;
    cout<<"----------------------------------------------"<<endl;

    cin>>choic;
    if(choic==1)
    {
        system("cls");
        huanying();
    }
    if (choic==3)
    {
        system("cls");
        Show();
    }

}

/***********************************************************
*功能描述:  删除一个联系人的信息
*输入参数:  联系人姓名
*输出参数:   无
*返回值:     无
*其他说明:   先进行查找是否有该联系人
*************************************************************/
void Delete()        //删除通讯人信息
{
    printf("\n\n\t          请输入要删除用户的姓名:");
    cin>>name1;
    p4=head;
    if(strcmp(p4->name,name1)==0)
    {
        p4=p4->next;
        head=p4;
    }
    else
    {
        while(strcmp(p4->next->name,name1)!=0)
            p4=p4->next;

        p5=p4->next;
        p4->next=p5->next;
        free(p5);
    }
}

/***********************************************************
*功能描述:   拨号动画的功能;该联系人拨号次数+1
*输入参数:   选择键1、2;(1)输入姓名、(2)输入快捷键
*输出参数:   联系人电话,拨号次数
*返回值:     拨号次数
*其他说明:   动画过程用了时间函数
*************************************************************/
void Dial()       //拨号功能
{
    int c,choic;
    int a;
    char b;
	cout<<"+----------------------------------------------+"<<endl;
    cout<<"+     拨叫用户请按(1)    使用单键拨号请按(2)   +"<<endl;  //两种拨号方式
    cout<<"+----------------------------------------------+"<<endl; 
    cin>>a;
    p0=head;
    if(a==1)
    {
        cout<<"                    请输入拨叫用户的姓名:";
        cin>>name1;
        while(strcmp(name1,p0->name)!=0&&p0!=NULL)
            p0=p0->next;
        if(p0==NULL)
        {
			cout<<"+----------------------------------------------+"<<endl;
            cout<<"                 您选择的用户不存在!";
			cout<<"+----------------------------------------------+"<<endl;
            cout<<"+       重新输入请按(1)    返回主菜单(2)        +"<<endl;
			cout<<"+----------------------------------------------+"<<endl;
            cin>>choic;
            if(choic==1)
            {
				system("cls");
                Dial();
            }
            if(choic==2)
            {
				system("cls");
                huanying();
            }
        }
        else
        {
            cout<<endl;
            cout<<"                                               "<<endl;
            cout<<"        loding------                           "<<endl;
            for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
            {
                Sleep(100);
                cout<<"■";
            }
            cout<<"                                               "<<endl;
            cout<<"                                               "<<endl;
            Sleep(500);
            cout<<endl;
            cout<<p0->tel_no<<endl;
            p0->cishu=p0->cishu+1;
            cout<<"+----------------------------------------------+"<<endl;
            cout<<"拨打次数:    "<<p0->cishu<<endl;
            cout<<"+----------------------------------------------+"<<endl;
            cout<<endl;
        }
    }
    else
    {
        cout<<"请输入单键号码:";
        cin>>b;
        while(p0!=NULL&&b!=p0->sim_no)                   //遍历链表比较查询
            p0=p0->next;
        if(p0==NULL)
        {
            cout<<"	您输入的单键号码不存在!";
			cout<<"+----------------------------------------------+"<<endl;
            cout<<"+      重新输入请按(1)    返回主菜单(2)        +"<<endl;
			cout<<"+----------------------------------------------+"<<endl;
            cin>>choic;
            if(choic==1)
            {
                find();
            }
            if(choic==2)
            {
                system("cls");
                huanying();
            }
        }
        else
        {
            cout<<endl;
            cout<<"                                               "<<endl;
            cout<<"        loding------                                        "<<endl;
            for(int j=0; j<20; j++)
            {
                Sleep(100);
                cout<<"■";
            }
            cout<<"                                               "<<endl;
            cout<<"                                               "<<endl;
            Sleep(500);
            cout<<p0->name<<endl;
            cout<<p0->tel_no;
            p0->cishu=p0->cishu+1;
            cout<<"+----------------------------------------------+"<<endl;
            cout<<"拨打次数:    "<<p0->cishu<<endl;
            cout<<"+----------------------------------------------+"<<endl;
            cout<<endl;
        }
    }
}
/***********************************************************
*功能描述:   输出全部联系人的信息
*输入参数:   无
*输出参数:   信息
*返回值:     无
*其他说明:   无
*************************************************************/
void shuchu()         //输出全部信息
{
    int choic;
    p10=head;
    while(p10!=NULL)
    {
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   名  字:  "<<p10->name<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   电  话:  "<<p10->tel_no<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   快捷键:  "<<p10->sim_no<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+   分  组:  "<<p10->arch<<endl;
        cout<<"----------------------------------------------"<<endl;
        cout<<"+  拨打次数: "<<p10->cishu<<endl;
        cout<<"----------------------------------------------"<<endl;
        p10=p10->next;                              //遍历输出信息
        continue;
    }
    cout<<endl;
    cout<<"返回界面请按1,继续选择请按3"<<endl;
    cout<<endl;
    cout<<"----------------------------------------------"<<endl;
    cin>>choic;
    if(choic==1)
        huanying();
    if (choic==3)
        Show();
}


/***********************************************************
*功能描述:输出兔子图案
*输入参数:   无
*输出参数:   无
*返回值:     无
*其他说明:   无
*************************************************************/
void xiaotu()          //兔子图案
{
    cout<<endl;
    cout<<"                       ┏━┓ ┏━┓"<<endl;
    cout<<"                       ★│┃  ┃│┃"<<endl;
    cout<<"                       ┃│┗灬┛│┃"<<endl;
    cout<<"                       ┃     ┃"<<endl;
    cout<<"                       ┃ ^   ^  ┃"<<endl;
    cout<<"                          ﹌ ˇ ﹌   "<<endl;
    cout<<"                       ┗○━━━○┛"<<endl;
}

/***********************************************************
*功能描述:  将操作完成后的信息存储到文件
*输入参数:  无
*输出参数:   无
*返回值:     无
*其他说明:   方便下次运行时的调用
*************************************************************/
void Save()            //存入文件
{
    int j;
    fp=fopen("数据文件.txt","w");
    for(p2=head,j=0; p2!=NULL; j++ ,p2=p2->next)
    {
        strcpy(persons[j].name,p2->name);
        strcpy(persons[j].tel_no,p2->tel_no);
        persons[j].sim_no=p2->sim_no;
        strcpy(persons[j].e_addr,p2->e_addr);
        strcpy(persons[j].arch,p2->arch);
        persons[j].cishu=p2->cishu;
        fwrite(&persons[j],sizeof(struct persons),1,fp);
    }
}



<pre name="code" class="cpp">/***********************************************************
*版权所有  (C)2015. ChengAng
*
*文件名称:   zupu.cpp
*文件标识:   无
*内容摘要:   该文件用于对结构体以及各函数的定义
*其他说明:   无
*当前版本:   V1.0
*作   者:    程昂
*完成日期:   20151223
*
*修改记录1:
*修改日期:   20151223
*版本号:     V1.0
*修改人:     Cheng Ang
*修改内容:
********************************************************************/
#include <iostream>
#include<stdlib.h>
#include<windows.h>
#include<stdio.h>
using namespace std;
#define maxlen 100  //最多100个信息

void find();     //查找功能
void huanying(); //选择界面
void creat();    //创建或打开文件
void ShowA(char aa[10]);    //显示分组信息
void Show();     //选择分组
void Delete();   //删除功能
void find();     //查找功能
void Save();     //存入文件
void Input();     //添加信息
void xiaotu();    //兔子图案
void shuchu();    //输出全部信息
void Alter();     //编辑信息
void Dial();      //拨号功能

//存放通讯表的结构体数组peisons[maxlen]的定义
struct persons
{
    int num;
    char name[20];    //姓名
    char e_addr[20];  //地址
    char tel_no[15];  //电话
    char sim_no;      //快捷键
    char arch[10];    //分组
	int cishu;        //拨打次数
} persons[maxlen];

//存放通讯表的链表的节点类型 listnode 的定义
typedef struct lnode
{
    int num;
    char name[20];    //姓名
    char e_addr[20];  //地址
    char tel_no[15];  //电话
    char sim_no;      //快捷键
    char arch[10];    //分组
	int cishu;        //拨打次数
    struct lnode *next;  //储存指向下一个人的指针
} listnode, *linklist;

linklist head=NULL,r=NULL;   //初始化链表

listnode *s,*p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7,*p8,*p9,*p10,*p11,*p12;  //定义指针

//结构体外信息
int i;
char name1[10],ch;
char tel_no1[15];
char arch1[10];
char sim_no1;
char e_addr1[20];
int  cishu_1=0;

FILE *fp;  //定义文件指针


 
<img src="https://img-blog.csdn.net/20151225230006811?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20151225230053193?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-family: Arial, Helvetica, sans-serif;" alt="" />
<img src="https://img-blog.csdn.net/20151225230141170?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20151225230153784?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20151225230203081?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值