数据结构课设--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;
一、算法设计
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; }