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

[问题描述]

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

[实现提示]

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

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

版权声明:本文为lemonbiscuit原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/lemonbiscuit/p/7776129.html