[问题描述]
为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。
[实现提示]
可以采用单链表的存储结构,如可定义如下的存储结构:
typedef struct { /*员工通讯信息的结构类型定义*/
char num[5]; /*员工编号*/
char name[10]; /*员工姓名*/
char phone[15]; /*办公室电话号码*/
char call[15]; /*手机号码*/
char mail[25]; /*邮箱*/
}DataType;
/*通讯录单链表的结点类型*/
typedef struct node
{ DataType data; /*结点的数据域*/
struct node *next; /*结点的指针域*/
}ListNode,*LinkList;
#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#include<cstring>
using namespace std;
typedef int Status;
typedef struct { /*员工通讯信息的结构类型定义*/
char num[5]; /*员工编号*/
char name[10]; /*员工姓名*/
char phone[15]; /*办公室电话号码*/
char call[15]; /*手机号码*/
char mail[25]; /*邮箱*/
}DataType;
/*通讯录单链表的结点类型*/
typedef struct node{
DataType data; /*结点的数据域*/
struct node *next; /*结点的指针域*/
}ListNode,*LinkList;
LinkList L;
/*单链表的初始化*/
void InitList(LinkList &L){
/*构造一个空的单链表L*/
L=new ListNode;//生成的新的结点是头结点,L是指向结点的头指针
L->next=NULL;//头结点指针域为空
}
/*输出全体员工的信息*/
void FindListAll(LinkList L){
LinkList p=L;
cout<<"员工编号"<<" "<<"员工姓名"<<" "<<"办公室电话"<<" "<<"手机号码"<<" "<<"邮箱"<<endl;
while(p->next){//指针域不为空就输出
p=p->next;
cout<<p->data.num<<"\t "<<p->data.name<<"\t "<<p->data.phone<<" "<<p->data.call<<"\t"<<p->data.mail<<endl;
}
}
/*单链表的插入(插入某位员工的信息)尾插法*/
void ListInsert(LinkList &L){
LinkList p=new ListNode;//申请一个结点空间
cout<<"PS:目前支持员工编号4位,员工姓名4位,电话9位,手机9位"<<endl;
cout<<endl;
cout<<"请输入员工的信息:员工编号,员工姓名,办公室电话,手机号,邮箱"<<endl;
//单链表数据域是结构体类型
cin>>p->data.num>>p->data.name>>p->data.phone>>p->data.call>>p->data.mail;
LinkList q=L;
while(q->next){//检查该员工编号是否存在
q=q->next;
if(strcmp(p->data.num,q->data.num)==0){
cout<<"该员工信息已存在,请重新输入!"<<endl;
ListInsert(L);
}
}
LinkList m=L;//*找到最后一个结点
while(m->next){
m=m->next;
}
m->next=p;
p->next=NULL;
cout<<"插入成功!"<<endl;
FindListAll(L);
system("pause");
system("cls");
}
/*单链表的删除(根据编号删除某位员工的全部信息)*/
void ListDelete(LinkList &L){
char a[5];
cout<<"请输入要删除的员工的编号:";
cin>>a;
LinkList p=L;
if(p->next==NULL) exit(OVERFLOW);
LinkList act=L;//保存p的前驱
Status b=ERROR;//设置一个标记,如果没有找到这个标记还是0
while(p->next){//从头结点开始找员工编号
act=p;
p=p->next;
if(strcmp(a,p->data.num)==0){//如果找到了就标记为1
b=OK;
break;
}
}
if(b){//删除操作
act->next=p->next;
delete p;
cout<<"删除成功!"<<endl;
FindListAll(L);
system("pause");
system("cls");
}else{
cout<<"请输入正确的员工编号!"<<endl;//没有此员工(编号错误,重新输入)
ListDelete(L);
}
}
/*修改员工信息*/
Status ListChagneSpe(LinkList &p){
Status chose;
cout<<"*********2.姓名*********"<<endl;
cout<<"*********3.办公室电话***"<<endl;
cout<<"*********4.手机号码*****"<<endl;
cout<<"*********5.邮箱*********"<<endl;
cout<<"请选择您要修改的信息:";
cin>>chose;
switch(chose){//选择后直接输入即可
case 2: cin>>p->data.name; break;
case 3: cin>>p->data.phone; break;
case 4: cin>>p->data.call; break;
case 5: cin>>p->data.mail; break;
default: cout<<"请输入正确的选择!"<<endl;
ListChagneSpe(p);
}
cout<<"是否需要继续修改?(y(是)/other(其他修改完成))";
char is_continue;
cin>>is_continue;
if(is_continue=='y')
ListChagneSpe(p);
else
return OK;
return OK;
}
/*单链表的修改(根据编号修改员工的某一项信息)*/
void ListChange(LinkList &L){
char a[5];
Status b=ERROR;
cout<<"请输入要修改的员工的编号:";
cin>>a;
LinkList p=L;//找存储此员工信息的结点
if(p->next==NULL) exit(OVERFLOW);
while(p->next){
p=p->next;
if(strcmp(a,p->data.num)==0){
b=ListChagneSpe(p);
break;
}
}
if(b){
cout<<"修改成功!"<<endl;
FindListAll(L);
system("pause");
system("cls");
}
else{
cout<<"请输入正确的员工编号!"<<endl;//没有此员工(编号错误,重新输入)
ListChange(L);
}
}
/*输出某员工的信息*/
void FindListSome(LinkList L){
char a[5];Status b=ERROR;
cout<<"请输入员工编号:";
cin>>a;
LinkList p=L;
if(p->next==NULL) exit(OVERFLOW);
while(p->next){
p=p->next;
if(strcmp(a,p->data.num)==0){
b=OK;
break;
}
}
if(b){
cout<<"员工编号"<<" "<<"员工姓名"<<" "<<"办公室电话"<<" "<<"手机号码"<<" "<<"邮箱"<<endl;
cout<<p->data.num<<"\t "<<p->data.name<<"\t "<<p->data.phone<<" "<<p->data.call<<"\t"<<p->data.mail<<endl;
}else{
cout<<"员工编号错误,请重新输入!"<<endl;
FindListSome(L);
}
}
/*单链表的查询(根据编号查询某员工信息/查询全部员工信息)*/
void FindList(LinkList L){
cout<<"1.查询某员工的信息"<<endl;
cout<<"2.查询全体员工的信息"<<endl;
cout<<"请选择您要查询的操作:";
Status chose;
cin>>chose;
switch(chose){
case 1: FindListSome(L);break;
case 2: FindListAll(L); break;
default : cout<<"请输入正确的选择!"<<endl;
FindList(L);
}
system("pause");
system("cls");
}
/*功能实现*/
void SystemMenu(LinkList &L){
Status chose;
cout<<"******************************************"<<endl;
cout<<"**********欢迎进入×××员工系统**********"<<endl;
cout<<"**************1.添加员工信息**************"<<endl;
cout<<"**************2.删除员工信息**************"<<endl;
cout<<"**************3.修改员工信息**************"<<endl;
cout<<"**************4.查找员工信息**************"<<endl;
cout<<"**************5.退出系统******************"<<endl;
cout<<"******************************************"<<endl;
cout<<"请输入您要选择的操作:";
cin>>chose;
switch(chose){
case 1: {
ListInsert(L);
SystemMenu(L);
}
case 2: {
ListDelete(L);
SystemMenu(L);
}
case 3: {
ListChange(L);
SystemMenu(L);
}
case 4: {
FindList(L);
SystemMenu(L);
}
case 5: {
exit(0);
}
default : {
cout<<"输入异常!请重新输入!" <<endl;
system("pause");
system("cls");
SystemMenu(L);
}
}
}
int main(){
InitList(L);
SystemMenu(L);
return 0;
}