单位员工通讯录管理系统

1、单位员工通讯录管理系统(线性表的应用)

[问题描述]

为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。

[实现提示]

可以采用单链表的存储结构,如可定义如下的存储结构:

typedef struct {  /*员工通讯信息的结构类型定义*/

    char num[5];       /*员工编号*/

    char name[10];      /*员工姓名*/

    charphone[15];     /*办公室电话号码*/

char call[15];    /*手机号码*/

char mail[25];     /*邮箱*/

}DataType;

/*通讯录单链表的结点类型*/

typedef struct node

{ DataType data;   /*结点的数据域*/

  struct node *next;   /*结点的指针域*/

}ListNode,*LinkList;

算法思想

要想完成员工的通讯管理系统,需要首先建立一个链表存储员工的信息,创建的方法有头插法和尾插法,本次试验中我是使用尾插法,每个结点保存员工的信息以及指针域。对于员工的信息查询,需要遍历链表并输出每个结点所包含的信息;对于员工的信息插入需要先找到要插入的相应的位置,在把该结点的指针域赋给前一结点的p->next,在进行该操作的赋值时要遵循先空后实的原则;对于员工的信息删除,需要首先找到相应的员工信息,然后把该员工下一个员工的地址赋给该员工前一个员工的指针域中;对于员工信息的修改,先遍历链表,找到存储员工信息的结点,把员工的修改后的信息放入该结点中

 

流程图

    

进入菜单选择:menu()

 

 


 

 

创建单链表ListLength(LinkList &L

查找结点FindList(LinkList &L)

插入结点ListInsert(LinkList &L

删除结l ListDelete(LinkList &L)

输出结点信息Display(LinkList &L)

 

 

 

// 员工信息.cpp : 定义控制台应用程序的入口点。

//

 

#include "stdafx.h"

 

 

#include<iostream>

#include<malloc.h>

#include<string.h>

#include<stdio.h>

using namespace std;

#define ERROR -1

typedef struct                         //员工通讯信息的结构类型定义

{

       charnum[10];                         //员工编号

       charname[15];                       //员工姓名

       charphone[15];                      //办公室电话号码

       charcall[15];                       //手机号码

       charmail[25];                       //邮箱

}DataType;

typedef struct LinkNode                  //构造链表结点结构体

{

       DataType  data;

       structLinkNode  *next;

}Node, *LinkList;

 

void CreateList(LinkList &L)       //头插法创建链表

{

       Node*p, *r, *v;       //LinkList p;

       inti, n;

       L= (LinkList)malloc(sizeof(Node));

       r= L;

       cout<< "请输入通讯录员工人数n值<n为整型数字>:";

       cin>> n;

       cout<< endl;

       if(n == 0)

       {

              cout<< "通讯录链表里无员工信息,请插入新的员工信息!" << endl << endl;

       }

       else

       {

              cout<< "请输入"<< n << "个员工的信息: " << endl << endl;

              for(i = 0; i<n; i++)

              {

                     p= (LinkList)malloc(sizeof(Node));

                     r->next= p;

                     r= p;

                     p->next= NULL;

 

              loop:          cout << "请输入第" << i + 1 << "个员工的编号:";        //编号不重复功能

                     cin>> p->data.num;

                     v= L;

                     while(v)

                     {

                            if(v != p&&strcmp(v->data.num, p->data.num) == 0)

                            {

                                   cout<< "你输入的编号已存在,请重新输入!" << endl << endl;

                                   gotoloop;

                            }

                            else

                                   v= v->next;

                     }

                     for(int j = 0; j<strlen(p->data.num); j++)         //编号必须是数字;

                     {

                            if(p->data.num[j] >= '0'&&p->data.num[j] <= '9')

                                   continue;

                            else

                            {

                                   cout<< "你输入的编号不合法,请重新输入整型编号!" << endl << endl;

                                   gotoloop;

                            }

                     }

                     cout<< "请输入第"<< i + 1 << "个员工的姓名:";

                     cin>> p->data.name;

                     cout<< "请输入第"<< i + 1 << "个员工的办公室电话:";

                     cin>> p->data.phone;

                     cout<< "请输入第"<< i + 1 << "个员工的手机号:";

                     cin>> p->data.call;

                     cout<< "请输入第"<< i + 1 << "个员工的电子邮件:";

                     cin>> p->data.mail;

                     cout<< endl;

              }

       }

       cout<< "通讯录链表创建成功,可以通过功能7进行查看哦!" << endl <<endl;

}//CreateList_L

 

 

 

int ListLength(LinkList &L)                   //求链表表长

{

       inti = 0;

       LinkListp = L;

       if(p == NULL)

       {

              cout<< "通讯录链表不存在,请先创建新的通讯录链表! " << endl<< endl;

              returnERROR;

       }

       while(p->next != NULL)

       {

              i++;

              p= p->next;

       }

       cout<< "该通讯录链表的长度为:"<< i << endl << endl;

       return0;

}//ListLength_L

 

 

int FindList(LinkList &L)   //求链表某位序的值

{

       LinkListp = L;

       charnum[5], name[10];

       intc;

       boolflag1 = false, flag2 = false;

       if(p == NULL)

       {

              cout<< "通讯录链表不存在,请先创建新的通讯录链表!" << endl ;

              returnERROR;

       }

       p= L->next;

       cout<< "*************************************" << endl;

       cout<< "          1.按员工编号查询           " << endl;

       cout<< "          2.按员工姓名查询           " << endl;

       cout<< "*************************************" << endl;

       cout<< "请选择查询方式:";

       cin>> c;

       cout<< endl;

       if(c == 1)

       {

              cout<< "请输入要查找员工的编号:";

              cin>> num;

              while(p)

              {

                     if(strcmp(p->data.num, num) == 0)

                     {

                            flag1= true;

                            cout<< "你要查找的员工编号:"<< p->data.num << endl;

                            cout<< "你要查找的员工姓名:"<< p->data.name << endl;

                            cout<< "你要查找的员工办公室电话:"<< p->data.phone << endl;

                            cout<< "你要查找的员工手机号:"<< p->data.call << endl;

                            cout<< "你要查找的员工电子邮件:"<< p->data.mail << endl << endl;

                            p= p->next;

                     }

                     else

                            p= p->next;

              }

              if(flag1 == false)

                     cout<< "你要查询的"<< num << "编号员工不存在!" << endl << endl;

       }

       elseif (c == 2)

       {

              cout<< "请输入要查找员工的姓名:";

              cin>> name;

              while(p)

              {

                     if(strcmp(p->data.name, name) == 0)

                     {

                            flag2= true;

                            cout<< "你要查找的员工姓名:"<< p->data.name << endl;

                            cout<< "你要查找的员工编号:"<< p->data.num << endl;

                            cout<< "你要查找的员工办公室电话:"<< p->data.phone << endl;

                            cout<< "你要查找的员工手机号:"<< p->data.call << endl;

                            cout<< "你要查找的员工电子邮件:"<< p->data.mail << endl << endl;

                            p= p->next;

                     }

                     else

                            p= p->next;

              }

              if(flag2 == false)

                     cout<< "你要查询的"<< name << "姓名员工不存在!" << endl << endl;

       }

       else

              cout<< "你输入的查询方式不合法,请重新查询!" << endl << endl;

       return0;

}//FindList_L

 

 

int ListChange(LinkList &L)   //改变链表中某元素的值

{

       LinkListp = L, q;

       charnum[5];

       boolflag = false;

       if(p == NULL)

       {

              cout<< "通讯录链表不存在,请先创建新的通讯录链表!" << endl<< endl;

              returnERROR;;

       }

       p= L->next;

       cout<< "请输入要修改员工的编号:";

       cin>> num;

       while(p)

       {

              if(strcmp(p->data.num, num) == 0)

              {

                     flag= true;

                     q= (LinkList)malloc(sizeof(Node));

                     cout<< "*************************************" << endl;

                     cout<< "          1.修改员工姓名             " << endl;

                     cout<< "          2.修改员工办公室电话       " << endl;

                     cout<< "          3.修改员工手机号码         " << endl;

                     cout<< "          4.修改员工电子邮件         " << endl;

                     cout<< "*************************************" << endl;

                     cout<< "请选择你要修改的选项:";

                     charn;

                     cin>> n;

                     cout<< endl;

                     switch(n)

                     {

                     case'1':cout << "输入你修改后的员工姓名:";

                            cin>> q->data.name;

                            strcpy_s(p->data.name,q->data.name);

                            break;

                     case'2':cout << "输入你修改后的员工办公室电话:";

                            cin>> q->data.phone;

                            strcpy_s(p->data.phone,q->data.phone);

                            break;

                     case'3':cout << "输入你修改后的员工手机号码:";

                            cin>> q->data.call;

                            strcpy_s(p->data.call,q->data.call);

                            break;

                     case'4':cout << "输入你修改后的员工电子邮件:";

                            cin>> q->data.mail;

                            strcpy_s(p->data.mail,q->data.mail);

                            break;

                     default:cout << "你输入的修改选项不合法,请重新修改!" << endl;

                     }

                     cout<< endl;

                     p= p->next;

              }

              else

                     p= p->next;

       }

       if(flag == false)

              cout<< "在通讯录中未找到你要修改的"<< num << "编号员工信息" << endl << endl;

       return0;

}//ListChange_L

 

 

int ListInsert(LinkList &L)    //在链表尾部插入元素

{

       LinkListp, s, v;

       p= L;

       if(p == NULL)

       {

              cout<< "通讯录链表不存在,请先创建新的通讯录链表!" << endl<< endl;

              returnERROR;

       }

       while(p->next != NULL)

       {

              p= p->next;

       }

       cout<< "你将在通讯录链表尾部插入此员工的信息!" << endl << endl;

       s= (LinkList)malloc(sizeof(Node));

       s->next= NULL;

loop:

       cout<< "请输入你要插入的员工编号:";

       cin>> s->data.num;

       v= L;

       while(v)

       {

              if(v != s&&strcmp(v->data.num, s->data.num) == 0)

              {

                     cout<< "你输入的编号已存在,请重新输入!" << endl << endl;

                     gotoloop;

              }

              else

                     v= v->next;

       }

       cout<< "请输入你要插入的员工姓名:";

       cin>> s->data.name;

       cout<< "请输入你要插入的员工办公室电话:";

       cin>> s->data.phone;

       cout<< "请输入你要插入的员工手机号:";

       cin>> s->data.call;

       cout<< "请输入你要插入的员工电子邮件:";

       cin>> s->data.mail;

       cout<< "员工信息插入成功"<< endl;

       cout<< endl;

       p->next= s;

       p= p->next;

       return0;

}//ListInsert_L

 

 

int ListDelete(LinkList &L)   //在链表中删除某元素

{

       LinkListp, q, r;

       p= q = L;

       intj = 0;

       charnum[5];

       if(p == NULL)

       {

              cout<< "通讯录链表不存在,请先创建新的通讯录链表!" << endl<< endl;

              returnERROR;

       }

       cout<< "请输入要删除员工的编号:";

       cin>> num;

       cout<< endl;

       while(p&&strcmp(p->data.num, num))

       {

              j++;

              p= p->next;

       }

       if(p == NULL)

       {

              cout<< "你要删除的"<< num << "编号员工在通讯录链表中不存在!" << endl << endl;

       }

       else

       {

              for(int i = 0; i<j - 1; i++)

              {

                     q= q->next;

              }

              r= q->next;

              q->next= r->next;

              cout<< "你指定的编号员工信息删除成功!"<< endl << endl;;

              cout<< "你删除员工的编号:"<< r->data.num << endl;

              cout<< "你删除员工的姓名:"<< r->data.name << endl;

              cout<< "你删除员工的办公室电话:"<< r->data.phone << endl;

              cout<< "你删除员工的手机号:"<< r->data.call << endl;

              cout<< "你删除员工的电子邮件:"<< r->data.mail << endl << endl;

              free(r);

       }

       return0;

}//ListDelete_L

 

void Display(LinkList &L)          //显示链表中的全部元素

{

       LinkListp;

       p= L;

       if(p == NULL)

       {

              cout<< "通讯录链表不存在,请先创建新的通讯录链表!" << endl<< endl;

              return;

       }

       p= p->next;

       if(p == NULL)

       {

              cout<< "通讯录链表为空,没有找到可显示的员工信息!" << endl << endl;

       }

       else

       {

              while(p)

              {

                     cout<< "员工的编号:"<< p->data.num << endl;

                     cout<< "员工的姓名:"<< p->data.name << endl;

                     cout<< "员工的办公室电话:"<< p->data.phone << endl;

                     cout<< "员工的手机号:"<< p->data.call << endl;

                     cout<< "员工的电子邮件:"<< p->data.mail << endl << endl;

                     p= p->next;

              }

       }

}//Display_L

void menu()

{

       cout<< "*************欢迎来到单位员工通讯录管理系统************* " << endl << endl;;

       cout<< "                1.建立员工通讯录链表                  " << endl;

       cout<< "                2.求通讯录链表的表长                  " << endl;

       cout<< "                3.查询通讯录员工的信息                " << endl;

       cout<< "                4.修改通讯录员工的信息                " << endl;

       cout<< "                5.插入通讯录中某员工信息              " << endl;

       cout<< "                6.删除通讯录中某员工信息              " << endl;

       cout<< "                7.显示通讯录中员工的信息              " << endl;

       cout<< "                0.退出通讯录员工管理系统              " << endl <<endl;

       cout<< "******************************************************"<< endl;

}

int main()

{

       charM;

       LinkListL = NULL;

       while(1)

       {

              menu();

              cout<< "请输入你要选择的功能序号:";

              cin>> M;

              cout<< endl;

              switch(M)                      //进行链表基本操作功能的选择

              {

              case'1':   CreateList(L);  system("pause");  system("cls");   break;

              case'2':   ListLength(L);  system("pause");  system("cls");   break;

              case'3':   FindList(L);    system("pause");  system("cls");   break;

              case'4':   ListChange(L);  system("pause");  system("cls");   break;

              case'5':   ListInsert(L);  system("pause");  system("cls");   break;

              case'6':   ListDelete(L);  system("pause");  system("cls");   break;

              case'7':   Display(L);     system("pause");  break;

              case'0':   return 0;

              default:cout << "你的选择有误,此管理系统没有此项功能!" << endl << endl;

              }

       }

       system("pause");

}

 

 



  • 12
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值