一、 单位员工通讯录管理系统(线性表的应用)
[问题描述]
为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号、及电子邮箱。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。
[实现提示]
可以采用单链表的存储结构,如可定义如下的存储结构:
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;
一、算法设计
1.实现提示中已经给出了现成的存储结构,便于我们的实验。不同的是,我在ListNode的结构存储中多加了一项length,还有Datatype类型中的xulie。length用来判断方便计算员工人数。xulie用来存储员工当前在整个员工中排列的序列号。同时为了方便员工的插入,设置一个尾指针,始终接在最后一个结点的后面,并且让他的指针域指向NULL。而在实现员工的查询功能的时候采用查找的关键字是员工的编号,因为员工的编号是唯一可以确定的,其他信息都可以重复,查找不具有唯一确定性。另外再删除的过程中,要对员工所处的位置进行重新的编号,即改变本身的序列号。这样在输出员工信息的时候也比较整齐划一。
各个函数之间的调用关系如下图所示:
|
main() mainjiemian() |
|||||
|
write() |
display () |
find() |
update() |
insert() |
remove() |
|
Mainjiemian() |
|||||
2.本程序中包含11个模块
(1)主函数:int main();(2)退出界面:voidexit();
(3)插入员工信息函数:bool insert(Linklist &l);
(4)删除固定员工信息函数:bool remove(Linklist &l);
(5)修改指定员工信息函数:void update(Linklist &l);
(6)查找员工信息函数:void find(Linklist l);
(7)打印员工信息:void display(Linklist l);
(8)显示单个员工信息:void show(Linklist p);
(9)录入员工信息:void write(Linklist &l);
(10)构建一个空的链表:void initlist(Linklist &l);
(11)显示管理系统主界面的函数:void mainjiemian();
3.元素类型、结点类型和指针类型
typedefstruct /*员工通讯信息的结构来行定义*/
{ int xulie; /*员工所处序号*/
char num[50]; /*员工编号*/
char name[50]; /*员工姓名*/
char phone[50]; /*办公室电话号码*/
char call[50]; /*手机号码*/
char mail[50]; /*邮箱*/
}Datatype,*Data;
typedefstruct node /*通讯录单链表的节点类型*/
{ int length;
Datatype data; /*结点数据域*/
struct node *next; /*节点的指针域*/
}Listnode,*Linklist;
二、实验测试
源代码:
#pragma warning(disable:4996)
#include<stdio.h>
#include<cstdio>
#include<string>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<stack>
#include<math.h>
#include<iomanip>
#include<stdlib.h>
#include<iostream>
#include<list>
using namespace std;
typedef struct /*员工通讯信息的结构来行定义*/
{
int xulie; /*员工所处序号*/
char num[50]; /*员工编号*/
char name[50]; /*员工姓名*/
char phone[50]; /*办公室电话号码*/
char call[50]; /*手机号码*/
char mail[50]; /*邮箱*/
}Datatype,* Data;
typedef struct node /*通讯录单链表的节点类型*/
{
int length;
Datatype data; /*结点数据域*/
struct node *next; /*节点的指针域*/
}Listnode,*Linklist;
Linklist q;
Listnode * t = (Listnode *)malloc(sizeof(Listnode));/*记录当前尾节点*/
Linklist l = (Linklist)malloc(sizeof(Listnode));/*链表头节点*/
void mainjiemian()
{
cout << " ★-----★---------★---------★-----★" << endl;
cout << " 欢迎进入员工信息管理系统 " << endl;
cout << " ☆ ☆" << endl;
cout << " 1 录入员工信息 " << endl;
cout << " ☆ 2 输出员工信息 ☆" << endl;
cout << " 3 查询员工信息 " << endl;
cout << " ☆ 4 修改员工信息 ☆" << endl;
cout << " 5 删除员工信息 " << endl;
cout << " ☆ 6 插入员工信息 ☆" << endl;
cout << " 7 退出管理系统 " << endl;
cout << " ☆ ☆" << endl;
cout << " MADE IN CHINA " << endl;
cout << " ★-----★---------★---------★-----★" << endl;
cout << endl;
cout << endl;
cout << "请选择数字命令:";
}
void initlist(Linklist &l)/*构建一个空的链表*/
{
Listnode * p;
p = (Listnode *)malloc(sizeof(Listnode));
p->next = NULL;
l = p;
}
void write(Linklist &l)/*录入员工信息*/
{
int n;
printf("请输入要录入的员工人数:");
scanf("%d%*c", &n);
l->next = NULL;
l->length = n;
Listnode *rear = l;
for (int i = 1; i <= n; i++)
{
Listnode *p = (Listnode *)malloc(sizeof(Listnode));
p->data.xulie = i;
printf("第%d位员工的信息:\n", p->data.xulie);
printf("编号:");
scanf("%s", &p->data.num);
printf("姓名:");
scanf("%*c%s", &p->data.name);
printf("办公室号码:");
scanf("%*c%s", &p->data.phone);
printf("邮箱:");
scanf("%*c%s", &p->data.mail);
printf("手机号码:");
scanf("%*c%s", &p->data.call);
p->next = t;
rear->next = p;
rear = p;
}
}
void show(Linklist p)/*显示单个员工信息*/
{
if (p != NULL&&p != t)
{
cout << "[" << p->data.xulie << "]";
cout << "编号:" << std::left << setw(15) << p->data.num;
cout << "姓名:" << std::left << setw(15) << p->data.name;
cout << "办公室号码:" << std::left << setw(15) << p->data.phone << endl;
cout << " 邮箱:" << std::left << setw(35) << p->data.mail;
cout << "手机号码:" << std::left << setw(15) << p->data.call << endl;
}
}
void display(Linklist l)/*显示员工信息*/
{
Listnode *p = l->next;
int n = 0;
if (l->next == t)
{
cout << "当前并无员工信息存入!" << endl;
}
else
{
for (int i = 1; i <= l->length; i++)
{
cout << "[" << p->data.xulie << "]";
cout << "编号:" << std::left << setw(15) << p->data.num;
cout << "姓名:" << std::left << setw(15) << p->data.name;
cout << "办公室号码:" << std::left << setw(15) << p->data.phone << endl;
cout << " 邮箱:" << std::left << setw(35) << p->data.mail;
cout << "手机号码:" << std::left << setw(15) << p->data.call << endl;
p = p->next;
}
}
}
void find(Linklist l)/*按编号查找员工信息*/
{
char id[50];
printf("请输入需要查询的员工编号:");
scanf("%s", &id);
Listnode * p = l;
if (p->next == t)
{
printf("亲,当前并无此数据,无法查找哦!\n");
}
else
{
for (int j = 0; p != NULL&&strcmp(p->data.num, id) != 0 && j <= l->length; j++)/*strcmp用来比较两个编号是否相同*/
{
p = p->next;
}
if (p == t || (p->next == t&&p == l))
{
printf("亲,当前并无此数据,无法查找哦!\n");
}
else
{
show(p);
}
}
}
void update(Linklist &l)/*修改员工信息*/
{
char id[50];
printf("请输入需要修改的员工编号:");
scanf("%s", &id);
Listnode * p = l->next;
if (p == t)
{
printf("亲,当前并无此数据,无法删除哦!\n");
}
else
{
for (int j = 1; (p != l) && (p->next != NULL) && (strcmp(p->data.num, id) != 0) && (j <= l->length); j++)/*strcmp用来比较两个编号是否相同*/
{
p = p->next;
}
if (p == t || (p->next == t&&p == l))
{
printf("亲,当前并无此数据,无法修改哦!\n");
}
else
{
show(p);
printf("员工编号为定值,请勿修改o(^▽^)o\n");
printf("姓名:");
scanf("%s", &p->data.name);
printf("办公室号码:");
scanf("%*c%s", &p->data.phone);
printf("邮箱:");
scanf("%*c%s", &p->data.mail);
printf("手机号码:");
scanf("%*c%s", &p->data.call);
printf("修改成功!\n");
show(p);
}
}
}
bool remove(Linklist &l)/*删除固定员工信息*/
{
char id[50];
printf("请输入需要删除的员工编号:");
scanf("%s", &id);
if (l->next == t)
{
printf("亲,当前并无此数据,无法删除哦!");
return false;
}
Listnode * p = l->next;
Listnode * s = p;
for (int j = 1; (p != t) && (p != l) && (p->next != NULL) && (strcmp(p->data.num, id) != 0) && (j <= l->length); j++)/*strcmp用来比较两个编号是否相同*/
{
s = p;
p = p->next;
}
if (p==l)
{
printf("亲,当前并无此数据,无法删除哦!");
return false;
}
else
{
show(p);
Listnode * q = p->next;
s->next = q;
l->length--;
if (p == l->next&&p->next == t)
{
;
}
else
{
for (; p != t; p = p->next)
{
p->data.xulie--;
}
}
free(p);
return true;
}
}
bool insert(Linklist &l)/*插入员工信息*/
{
Listnode *p = l;
if (l->length == 0)
{
p = l;
}
else
{
while (p->next != t)
{
p = p->next;
}
}
if (p==l||p->next == t)
{
Listnode * s = (Listnode *)malloc(sizeof(Listnode));
l->length++;
printf("请按照提示输入新增员工信息:\n");
s->data.xulie = l->length;
printf("第%d位员工的信息:\n", s->data.xulie);
printf("编号:");
scanf("%s", &s->data.num);
printf("姓名:");
scanf("%*c%s", &s->data.name);
printf("办公室号码:");
scanf("%*c%s", &s->data.phone);
printf("邮箱:");
scanf("%*c%s", &s->data.mail);
printf("手机号码:");
scanf("%*c%s", &s->data.call);
p->next = s;
s->next = t;/*记录当前尾节点*/
return true;
}
else
{
printf("当前数据为空,请执行第一步之后重试!\n");
return false;
}
}
void exit()
{
cout << " ★-----★---------★---------★-----★" << endl;
cout << endl;
cout << " ☆ 感谢您的使用! ☆" << endl;
cout << endl;
cout << " ★-----★---------★---------★-----★" << endl;
cout << endl;
}
int main()
{
system("color 57");
string order;
l->next = t;
l->length = 0;
t->next = NULL;
char*end;/*末端指针*/
mainjiemian();
while (cin>>order)
{
int a_order = static_cast<int>(strtol(order.c_str(), &end, 10));/*将输入进来的值转化为int类型*/
switch (a_order + 48)
{
case\'1\':
{
write(l);/*录入员工信息*/
system("pause");
system("cls");
mainjiemian();
break;
}
case\'2\':
{
display(l);/*输出员工信息*/
system("pause");
system("cls");
mainjiemian();
break;
}
case\'3\':
{
find(l);/*查询员工信息*/
system("pause");
system("cls");
mainjiemian();
break;
}
case\'4\':
{
update(l);/*修改员工信息*/
system("pause");
system("cls");
mainjiemian();
break;
}
case\'5\':
{
bool falg5 = remove(l);/*删除员工信息*/
if (falg5)
{
printf("删除员工信息成功o(^▽^)o!\n");
}
else
{
printf("删除员工信息失败( ▼-▼ )\n");
}
system("pause");
system("cls");
mainjiemian();
break;
}
case\'6\':
{
bool falg6 = insert(l);/*插入员工信息*/
if (falg6)
{
printf("添加员工信息成功o(^▽^)o!\n");
}
else
{
printf("添加员工信息失败( ▼-▼ )\n");
}
system("pause");
system("cls");
mainjiemian();
break;
}
case\'7\':
{
system("cls");
exit();
return 0;
break;
}
default:
{
cin.clear();
cin.sync();
cout << "输入错误,重新返回主界面。" << endl;
system("pause");
system("cls");
mainjiemian();
break;
}
}
}
return 0;
}