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

[问题描述]

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

[实现提示]

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

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;
} 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值