数据结构通讯录问题

1、问题描述

通讯录是用来记载和查询联系人通讯信息的工具。电子通讯录已成为手机、电子词典等电子设备中不可缺少的工具软件。基本功能模块

输入:记录的录入。

显示:通讯录显示。

查找:按指定方式,输入关键字,查找指定记录。

插入:实现记录的添加或在指定位置插入新纪录。

删除:提供指定记录的删除功能。

保存:将内存中正在被操作的通讯录以文件形式保存到磁盘。

读入:保存的逆操作,将存在磁盘中的通讯录文件读到内存中。

排序:按指定关键字对通讯录数据进行排序。

修改:提供修改某条记录的功能。

移动:移动记录在通讯录中的存储位置,使其被查找或被显示时的位序前移或后移。

    退出:结束程序运行

#include
#include//字符串
#include//fstream用于文件使用
#include
#include//系统功能
using namespace std;
struct people                    //创建结构体
{
    char ID[15];                 //ID
    char name[15];               //姓名
    char unit[15];               //单位
    char adds[20];                 //住址
    char num[15];                //电话
    struct people *next;         //因为要频繁插入删除,因此用链表
}People;

people *head;
people *rear;//由题目可知应该用循环链表

void Input()       //输入通讯录
{
    system("cls");//清屏
    people *p;
    p=new people;
    cout<<"  请输入ID:";
    cin>>p->ID;
    cout<<"  请输入姓名:";
    cin>>p->name;
    cout<<"  请输入单位:";
    cin>>p->unit;
    cout<<"  请输入住址:";
    cin>>p->adds;
    cout<<"  请输入电话号码:";
    cin>>p->num;
    rear->next=p;
    rear=p;
    rear->next=NULL;//初始化通讯录
}

void Display()       //显示通讯录
{
    system("cls");//清屏
    people *p;
    p=head->next;//初始化指针p
    cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";                 //格式
    cout << "ID   姓名   单位   住址     电话\n";
    cout << "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n";
    while (p)
    {
        cout<ID<name<unit<adds<num<next;//指针向后移
    }
}

void Search()        //查找联系人
{   system("cls");
    people *p;
    int i=0,n;//n表示选择哪种查询,i表示查询种类的序号,i=0对i进行初始化
    while(i!=1)
    {
        cout<<"\t\n请选择查询方式:\n";
        cout<<"\t^^^^^^^^^^^^^^^^^\n";
        cout<<"\t@      1-姓名 \n";
        cout<<"\t@      2-住址 \n";
        cout<<"\t@      3-电话 \n";
        cout<<"\t@      4-返回 \n";
        cout<<"\t^^^^^^^^^^^^^^^^^\n";
        cout<<"请选择查找方式:";
        cin>>n;
        if(n!=1&&n!=2&&n!=3&&n!=4)
        {
            cout<<"$$输入错误,请重新选择:";
            cin>>n;
        }
        else if(n==1)//根据姓名查找
        {
            char name[100];
            int flag=0;//flag==0查找失败(通讯录没有这个人),flag==1查找成功
            cout<<"\t请输入想查询的姓名:";
            cin>>name;
            p=head->next;
            while(p)
            {
                if(strcmp(p->name,name)==0)//通讯录里面有这个名字
                {
                    cout<<"\t此人ID:"<ID<unit<adds<num<next;
        }
        if(n==2)//根据住址查找
        {
            char adds[20];
            int flag=0;
            cout<<"\t请输入想查询的地址:";
            cin>>adds;
            p=head->next;
            while(p)
            {
                if(strcmp(p->adds,adds)==0)
                {
                    cout<<"\tID:"<ID<name<unit<num<next;
            
        }
        if(n==3)//根据电话号码查找
        {
            char num[20];
            int flag=0;
            cout<<"\t请输入想查询的电话:";
            cin>>num;
            p=head->next;
            while(p)
            {
                if(strcmp(p->num,num)==0)
                {
                    cout<<"\tID:"<ID<name<unit<adds<next;
        }
        if(n==4) {break;}
    }
    
}

void Delete()                //删除联系人
{
    system("cls");//清屏
    people *p;
    p=new people;//初始化指针p
    int i=0;
    while (i!=1)
    {
        people *m;
        m=head;//初始化指针m
        cout<<"\t请输入想删除联系人的名字:";
        cin>>p->name;
        cout<<"\t请输入想删除联系人的电话号码:";
        cin>>p->num;
        while (m->next&&strcmp(m->next->name,p->name)&&strcmp(m->next->num,p->num))
            m=m->next;
        if (m==NULL) cout<<"\t通讯录中没有此人!\n";
        else
        {
            people *q;
            q=m->next;
            m->next=q->next;
            delete q;
            cout<<"已经成功删除!\n";
        }
        cout << "1-返回主菜单    2-继续";
        cin>>i;
    }
}

void savefile()                   //保存文件
{
    system("cls");//清屏
    ofstream f;//输出文件流类
    f.open("mypeople.txt", ios_base::out);//用文件流对象的成员函数open()打开文件,将文件流对象与某个磁盘文件联系起来;
    //ios_base::out写方式打开文件
    if(!f) {cerr<<"打开文件失败!"; return; }
    people *p;
    p=head->next;//p指向第一个人的数据
    while(p)
    {
        f<ID<<'\t'<name<<'\t'<unit<<'\t'<adds<<'\t'<num;
        if(!p->next) f<<'#';//如果没有循环。输出#
        else f<next;
    }
    f.close();//关闭
    cout << "保存成功!";
    return;
}

int readfile()                    //读入文件
{
    system("cls");//清屏
    head=new people;
    head->next=NULL;
    rear=head;
    ifstream f;//文件输入
    f.open("mypeople.txt");
    if(!f) {cerr<<"打开文件失败!";return 1; }//cerr和cout用法相同
    char ch;
    f.get(ch);//读入对象ch
    f.putback(ch);
    while(ch!='#')
    {
        people *p=new people;
        f>>p->ID>>p->name>>p->unit>>p->adds>>p->num;
        rear->next=p;
        rear=p;
        rear->next=NULL;
        f.get(ch);
    }//while
    f.close();
    return 0;
}

void  sort()                             //排序
{
    system("cls");//清屏
    people *p, *q, *s;
    s=new people;
    int i=0,n;
    while(i!=1)
    {
        cout<<"1--按姓名排序   2--按号码排序"<>n;
        p=head->next;
        if(n==1)
        {
            while(p)
            {
                q=p->next;
                while(q)
                {
                    if(strcmp(p->name, q->name)>0)
                    {
                        strcpy(s->ID,p->ID);
                        strcpy(s->name,p->name);
                        strcpy(s->unit,p->unit);
                        strcpy(s->adds,p->adds);
                        strcpy(s->num,p->num);
                        strcpy(p->ID,q->ID);
                        strcpy(p->name,q->name);
                        strcpy(p->unit,q->unit);
                        strcpy(p->adds,q->adds);
                        strcpy(p->num,q->num);
                        strcpy(q->ID,s->ID);
                        strcpy(q->name,s->name);
                        strcpy(q->unit,s->unit);
                        strcpy(q->adds,s->adds);
                        strcpy(q->num,s->num);
                    }
                    q=q->next;
                }
                p=p->next;
            }
        }
        if(n == 2)
        {
            while(p)
            {
                q=p->next;
                while(q)
                {
                    if(strcmp(p->num,q->num)>0)
                    {
                        strcpy(s->ID,p->ID);
                        strcpy(s->name,p->name);
                        strcpy(s->unit,p->unit);
                        strcpy(s->adds,p->adds);
                        strcpy(s->num,p->num);
                        strcpy(p->ID,q->ID);
                        strcpy(p->name,q->name);
                        strcpy(p->unit,q->unit);
                        strcpy(p->adds,q->adds);
                        strcpy(p->num,q->num);
                        strcpy(q->ID,s->ID);
                        strcpy(q->name,s->name);
                        strcpy(q->unit,s->unit);
                        strcpy(q->adds,s->adds);
                        strcpy(q->num,s->num);
                    }
                    q=q->next;
                }
                p=p->next;
            }
        }
        cout<<"1--返回主菜单    2--继续";
        cin>>i;
    }
}

void  change()          //修改联系人信息
{
    system("cls");//清屏
    people *p,*s,*q;
    p=new people;
    q=new people;
    s=new people;
    int i=0;
    while(i!=1)
    {
        people *m;
        m=head;
        cout<<"\t请输入想修改的记录中的名字:";
        cin>>p->name;
        while(m->next&&strcmp(m->next->name, p->name))
        {
            m=m->next;
        }
        s=m->next;
        if(s==NULL)
        {
            cout<<"\t通讯录中没有此人!\n";
            return;
        } //if
        else
        {
            cout<<"请输入修改后此人的信息:\n";
            cout<<"\t请输入ID:";
            cin>>q->ID;
            cout<<"\t请输入姓名:";
            cin>>q->name;
            cout<<"\t请输入单位:";
            cin>>q->unit;
            cout<<"\t请输入住址:";
            cin>>q->adds;
            cout<<"\t请输入电话号码:";
            cin>>q->num;
            m->next = s->next;
            delete  s;
            q->next=m->next;
            m->next=q;
        }//else
        cout<<"1--返回主菜单    2--继续";
        cin>>i;
    }//while
}

void  Insert()                //插入记录
{
    system("cls");
    people *p;
    p=new people;
    int i=0,n;
    while(i!=1)
    {
        cout<<"1--记录添加  2--指定位置插入记录";
        cin>>n;
        cout<<"\t请输入ID:";
        cin>>p->ID;
        cout<<"\t请输入姓名:";
        cin>>p->name;
        cout<<"\t请输入单位:";
        cin>>p->unit;
        cout<<"\t请输入地址:";
        cin>>p->adds;
        cout<<"\t请输入电话号码:";
        cin>>p->num;
        if(n==1)
        {
            rear->next=p;
            rear=p;
            rear->next=NULL;
        }
        else
        {
            people *q, *m;
            q=new  people;
            cout<<"插在哪个结点后面:";
            cout<<"\t请输入ID:";
            cin>>q->ID;
            cout<<"\t请输入姓名:";
            cin>>q->name;
            cout<<"\t请输入单位:";
            cin>>q->unit;
            cout<<"\t请输入地址:";
            cin>>q->adds;
            cout<<"\t请输入电话号码:";
            cin>>q->num;
            m=head->next;
            while(m&&strcmp(m->name,q->name)&&strcmp(m->adds,q->adds)&&strcmp(m->num,q->num))
                m=m->next;
            if(m->next==NULL)
                cout<<"通讯录中无此人!:";
            else
            {
                p->next=m->next;
                m->next=p;
            }
        }
        cout << "1--返回主菜单   2--继续";
        cin >> i;
    }
}

void  move()                     //移动
{
    system("cls");
    people *p, *q, *s;
    s=new people;
    q=new people;
    int i=0,n;
    while(i!=1)
    {
        cout<<"1-- 前移   2--后移"<>n;
        cout<<"输入需要移动结点的信息:\n";
        cout<<"输入姓名:\n";
        cin>>q->name;
        cout<<"输入ID:";
        cin>>q->ID;
        cout<<"输入单位:";
        cin>>q->unit;
        cout<<"输入地址:";
        cin>>q->adds;
        cout<<"输入电话号码:";
        cin>>q->num;
        p=head->next;
        if(n==1)
        {
            while(p->next)
            {
                if(strcmp(p->next->ID,q->ID)==0&&strcmp(p->next->name,q->name)==0&&strcmp(p->next->unit,q->unit)==0&&strcmp(p->next->adds,q->adds)==0&&strcmp(p->next->num,q->num)==0)
                {
                    strcpy(s->ID,p->ID);
                    strcpy(s->name,p->name);
                    strcpy(s->unit,p->unit);
                    strcpy(s->adds, p->adds);
                    strcpy(s->num, p->num);
                    strcpy(p->ID,p->next->ID);
                    strcpy(p->name,p->next->name);
                    strcpy(p->unit,p->next->unit);
                    strcpy(p->adds,p->next->adds);
                    strcpy(p->num,p->next->num);
                    strcpy(p->next->ID,s->ID);
                    strcpy(p->next->name,s->name);
                    strcpy(p->next->unit,s->unit);
                    strcpy(p->next->adds,s->adds);
                    strcpy(p->next->num,s->num);
                    break;
                }
                else p=p->next;
            }
        }
        if(n==2)
        {
            while(p->next)
            {
                if(strcmp(p->next->ID,q->ID)==0&&strcmp(p->next->name,q->name)==0&&strcmp(p->next->unit,q->unit)==0&&strcmp(p->next->adds,q->adds)==0&&strcmp(p->next->num,q->num)==0)
                {
                    strcpy(s->ID,p->ID);
                    strcpy(s->name,p->name);
                    strcpy(s->unit,p->unit);
                    strcpy(s->adds, p->adds);
                    strcpy(s->num, p->num);
                    strcpy(p->ID,p->next->ID);
                    strcpy(p->name,p->next->name);
                    strcpy(p->unit,p->next->unit);
                    strcpy(p->adds,p->next->adds);
                    strcpy(p->num,p->next->num);
                    strcpy(p->next->ID,s->ID);
                    strcpy(p->next->name,s->name);
                    strcpy(p->next->unit,s->unit);
                    strcpy(p->next->adds,s->adds);
                    strcpy(p->next->num,s->num);
                    break;
                }
                else p=p->next;
            }
        }
        cout<<"1--返回主菜单    2--继续";
        cin>>i;
    }
}

void close()                                       //退出程序
{
    system("cls");
    cout << "谢谢使用,再见!\n";
    exit(0);
}

int main()
{
    readfile();
    int i=0;
    while(i!=11)
    {
        cout<<"\t\t     通讯录     \n";   //显示目录
        cout<<"\t\t******************\n";
        cout<<"\t\t1--添加记录  \n";
        cout<<"\t\t2--显示记录  \n";
        cout<<"\t\t3--查询记录  \n";
        cout<<"\t\t4--插入记录  \n";
        cout<<"\t\t5--删除记录  \n";
        cout<<"\t\t6--排序记录  \n";
        cout<<"\t\t7--修改记录  \n";
        cout<<"\t\t8--保存记录  \n";
        cout<<"\t\t9--移动记录  \n";
        cout<<"\t\t0--退出程序  \n";
        cout<<"\t\t******************\n";
        cout<<"\t\t请您选择(0-9):";
        cin>>i;
        
        switch(i)
        {
            case 1:Input();break;
            case 2:Display();break;
            case 3:Search();break;
            case 4:Insert();break;
            case 5:Delete();break;
            case 6:sort();break;
            case 7:change();break;
            case 8:savefile();break;
            case 9:move();break;
            case 0:close();break;
            default:{cout<<"谢谢使用   再见!\n"; exit(0);}break;
        }
    }
    return 0;
}

课程设计要求做的。哭唧唧。

2018.1.17 于南通大学床上

你可能感兴趣的:(数据结构)