数据结构(C语言)课设1——单位员工通讯录管理系统(线性表应用)

数据结构(C语言)课设1——单位员工通讯录管理系统(线性表应用)

题目要求:

为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。
操作分为查询(query)、修改(modify)、添加(add)、删除(del)、打印(print)

1.查询:输入员工姓名,输出员工信息,若员工不存在,输出“NOT FOUND!”
2.修改:输入员工姓名、要修改的属性、修改信息。姓名为name、电话为tel、邮箱为email。
3.添加:输入员工编号、姓名、电话号码、邮箱。
4.删除:输入员工姓名,将其从通讯录中删除。
5.打印:输出通讯录。

[输入]
第一行是一个整数n(1<=n<=100),表示通讯录原有n个人。接下来n行是员工信息,每行有编号、姓名、电话号码、邮箱四个员工属性。
接下来输入一个整数m(1<=m<=100),表示有m次操作。接下来是m行操作,每行为一次操作,操作如题意所示。
数据保证编号、姓名不重复;编号小于200且升序给出,名字只由小写字母组成,电话只由数字组成,邮箱只由数字、小写字母、“@”、“.”组成;名字、电话、邮箱字符串长度都不超过20。
[输出]
对于每个query和print,输出查询或打印结果。

头文件

  • 所需要的头文件;
#include <iostream>
using namespace std;

建立员工信息结构体和存储结构

  • 先创建储存员工信息的结构体:员工编号、员工姓名、员工电话号码、员工邮箱;
typedef struct
{
    int number;
    string name;
    string phoneNumber;
    string e_mail;
}StaffInfo;
  • 用单链表的存储结构存储员工信息:数据域和指针域;
typedef struct SNode
{
    StaffInfo data;
    struct SNode *next;
}SNode, *LinkList;

单链表初始化

  • 初始化单链表;
void InitList(LinkList &L)
{
    L = new SNode;     //生成新结点作为头结点
    L->next = NULL;    //头结点指针域置空
}

添加信息

  • 添加员工信息:while循环遍历链表,使r指向尾结点;将传进来的员工信息赋给新结点的数据域;使用尾插法建立员工信息链表;
void add_CinStaffInfo(LinkList &L, StaffInfo staffData)
{
    LinkList r, s;
    r = L;//尾指针r指向头结点
    while(r->next && (r->next->data.number < staffData.number))
    {
        r = r->next;
    }
    if(r->next == NULL)
    {
        s = new SNode;//生成新结点
        s->data = staffData;
        s->next = NULL;
        r->next = s;
    }
}
  • 输入员工编号姓名,while循环遍历链表,保证员工编号姓名唯一;继续输其他信息,之后调用添加函数,将员工信息传进函数,执行添加操作;
void add(LinkList &L)
{
    StaffInfo data;
    LinkList p = L->next;
    cin>>data.number;

    while(p)
    {

        if(data.number == p->data.number)
        {
            cout<<"error"<<endl;
        }
        p = p->next;
    }
    cin>>data.name;
    LinkList q = L->next;
    while(q)
    {
        if(data.name == q->data.name)
        {
            cout<<"error"<<endl;
        }
        q = q->next;
    }
    cin>>data.phoneNumber;
    cin>>data.e_mail;
    add_CinStaffInfo(L, data);
}

打印信息

  • 打印输出员工信息函数;
void print(LinkList &L)
{
    LinkList p = L->next;
    while(p)
    {
        cout<<p->data.number<<" "<<p->data.name<<" "<<p->data.phoneNumber<<" "<<p->data.e_mail<<endl;
        p = p->next;
    }
}

查询信息

  • 查询员工信息函数;将员工姓名传入函数,根据姓名是否相同遍历链表,若相同则输出相对应指针所指的员工信息,查询完毕;
void query(LinkList L, string name)//查询
{
    LinkList p = L->next;
    while(p && p->data.name != name)
    {
        p = p->next;
    }
    if(!p)
    {
        cout<<"NOT FOUND!"<<endl;
    }
    else
    {
        cout<<p->data.number<<" "<<p->data.name<<" "<<p->data.phoneNumber<<" "<<p->data.e_mail<<endl;
    }
}

修改信息

  • 修改员工信息函数;(由于题目要求输入员工姓名,对此姓名的员工信息进行修改,根据输入的信息判断修改哪个);这里写的有些繁琐,可根据自己想法调整算法(推荐switch语句)
void modify(LinkList &L, string name)//修改
{
    LinkList p = L;
    string str, sstr;
    while(p->next)
    {
        if(name == p->next->data.name)
        {
            cin>>str;
            if(str == "name")
            {
                cin>>sstr;
                LinkList q = L;
                while(q->next)
                {
                    if(sstr == q->next->data.name)
                    {
                        cout<<"NOT FOUND!"<<endl;
                        break;
                    }
                    q = q->next;
                }
                if(q->next == NULL)
                {
                    p->next->data.name = sstr;
                    break;
                }
            }
            if(str == "tel")
            {
                cin>>sstr;
                LinkList q = L;
                while(q->next)
                {
                    if(sstr == q->next->data.phoneNumber)
                    {
                        cout<<"NOT FOUND!"<<endl;
                        break;
                    }
                    q = q->next;
                }
                if(q->next == NULL)
                {
                    p->next->data.phoneNumber = sstr;
                    break;
                }
            }
            if(str == "email")
            {
                cin>>sstr;
                LinkList q = L;
                while(q->next)
                {
                    if(sstr == q->next->data.e_mail)
                    {
                        cout<<"NOT FOUND!"<<endl;
                        break;
                    }
                    q = q->next;
                }
                if(q->next == NULL)
                {
                    p->next->data.e_mail = sstr;
                    break;
                }
            }
        }
        else
        {
            p = p->next;
        }
    }
}

删除信息

  • 删除员工信息函数;依旧用指针p遍历链表,若找到则借助指针q删除;
void del(LinkList &L, string name)//删除
{
    LinkList p = L;
    LinkList q;
    while(p->next)
    {

        if(name == p->next->data.name)
        {
            q = p->next;
            p->next = q->next;
            delete q;
        }

        p = p->next;
    }
    if(!p)
    {
        cout<<"NOT FOUNT!"<<endl;
    }
}

主函数设计

  • main函数的设计;可根据自己想法调整算法。
int main()
{
    LinkList L;
    InitList(L);
    int n, m;
    string operate, nname;
    cin>>n;
    while(n--)
    {
        add(L);
    }
    cin>>m;
    while(m--)
    {
        cin>>operate;
        if(operate == "del")
        {
            cin>>nname;
            del(L, nname);
        }
        else if(operate == "query")//chaxun
        {
            cin>>nname;
            query(L, nname);
        }
        else if(operate == "modify")//修改
        {
            cin>>nname;
            modify(L, nname);
        }
        else if(operate == "add")
        {
            add(L);
        }
        else if(operate == "print")
        {
            print(L);
        }
    }
    return 0;
}

题目样例输入输出

  • 样例输入
2
1 aaa 13579246811 aaa@gmail.com
2 csl 13579246833 cls@gmail.com
9
del aaa
query aaa
query csl 
modify csl email clsnb@gmail.com
query csl
add 3 cnz 01234567890 cnznb@gmail.com
modify cnz name cnznb
modify cnznb tel 13579246822
print
  • 样例输出
NOT FOUND!
2 csl 13579246833 cls@gmail.com
2 csl 13579246833 clsnb@gmail.com
2 csl 13579246833 clsnb@gmail.com
3 cnznb 13579246822 cnznb@gmail.com

运行结果图

  • 运行结果图
    在这里插入图片描述

题目样例数据解释

  • 数据解释
    样例中,
    del aaa 表示删除aaa的信息
    query aaa 查询aaa的信息,不存在,输出“NOT FOUND!”
    query csl 表示查询csl的信息,输出“2 csl 13579246833 cls@gmail.com”
    modify csl email clsnb@gmail.com 表示修改csl的邮箱为“clsnb@gmail.com”
    query csl 表示查询csl的信息,输出“2 csl 13579246833 clsnb@gmail.com”
    add 3 cnz 01234567890 cnznb@gmail.com 添加一条员工信息
    modify cnz name cnznb 修改cnz的name为cnznb
    modify cnznb tel 13579246822 修改cnz的tel为13579246822
    print 按编号顺序打印通讯录

此博文只用于记录博主学习过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值