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