项目的目的
企业员工管理系统主要是针对企业员工的基本信息进行增、删、改、查的相关操作,以便用户使用本管理系统时可以快速对员工的信息进行管理。
项目应用技术
1.结构体和指针
使用了结构体 staff
来表示员工信息,通过指针来进行动态内存分配和管理,确保能够在运行时根据需要创建新的员工信息节点。
2.内存分配和释放
通过 malloc
函数动态地为新的员工信息节点分配内存空间,以便存储输入的员工信息。这样做可以在程序运行时灵活地分配所需的内存。
3.用户输入和数据存储
通过 scanf
函数实现了对用户输入的员工信息的获取,包括工号、职务、姓名、性别、年龄、文化程度、工资、办公电话、家庭电话、手机号码、微信号码和家庭住址等信息,并将其存储在新创建的员工信息节点中。
4.链表操作
通过将新的员工信息节点添加到员工信息链表的末尾,实现了一个简单的链表操作,确保了员工信息的顺序存储和管理。
项目的构建思路
一、定义员工信息
使用
typedef struct
定义了一个名为staff
的结构体类型,用于表示员工的信息。并且通过指针将这些信息链接成链表,以便进行复杂的数据操作和管理。
// 员工信息
typedef struct staff
{
int num; // 工号
char duty[10]; // 职务
char name[15]; // 姓名
char sex[5]; // 性别
int age; // 年龄
char edu[10]; // 文化程度
int salary; // 工资
char tel_office[13]; // 办公电话
char tel_home[13]; // 家庭电话
char mobile[13]; // 手机号码
char WeChat[12]; // 微信号码
char address[31]; // 家庭住址
struct staff* next;
} staff;
二、链表初始化及声明函数
//声明子函数
void addstaff(staff* emp);
void namedel(staff* emp);
void numdel(staff* emp);
void change(staff* emp);
void namecha(staff* emp);
void numcha(staff* emp);
void printstaff(staff* emp);
void namefind(staff* emp);
void numfind(staff* emp);
void display(staff* emp);
// 初始化员工信息
staff* Init()
{
staff* emp = (staff*)malloc(sizeof(staff));
emp->next = NULL;
return emp;
}
- 函数
Init
用于创建并初始化一个新的staff
结构体实例。- 通过
malloc
函数在堆上分配内存,确保灵活地管理内存使用。- 将新节点的
next
指针设置为1.结构体和指针。
三、输入员工信息
// 输入员工信息
void addstaff(staff* emp)
{
staff* node = (staff*)malloc(sizeof(staff));
printf("请输入员工信息\n");
printf("工号:");
scanf("%d", &node->num);
printf("职务:");
scanf("%s", node->duty);
printf("姓名:");
scanf("%s", node->name);
printf("性别:");
scanf("%s", node->sex);
printf("年龄:");
scanf("%d", &node->age);
printf("文化程度:");
scanf("%s", node->edu);
printf("工资:");
scanf("%d", &node->salary);
printf("办公电话:");
scanf("%s", node->tel_office);
printf("家庭电话:");
scanf("%s", node->tel_home);
printf("手机号码:");
scanf("%s", node->mobile);
printf("微信号码:");
scanf("%s", node->WeChat);
printf("家庭住址:");
scanf("%s", node->address);
node->next = NULL;
while (emp->next != NULL)
{
emp = emp->next;
}
emp->next = node;
}
四、删除员工信息
//删除员工信息
//按姓名删除
void namedel(staff* emp)
{
char name1[15];
printf("请输入你想要删除员工的姓名:");
scanf("%s", name1);
staff* temp = emp->next; // 要删除结点
staff* pre = emp;//要删除结点的上一个结点
while (temp != NULL)
{
if (strcmp(temp->name, name1) == 0)
{
pre=temp->next;
free(temp);
break;
}
temp = temp->next;
pre = pre->next;
}
}
//按工号删除
void numdel(staff* emp)
{
int a;
printf("请输入你要删除员工的工号:");
scanf("%d",&a);
staff* temp = emp->next; // 要删除结点
staff* pre = emp;//要删除结点的上一个结点
while (temp != NULL)
{
if (temp->num==a)
{
pre=temp->next;
free(temp);
break;
}
temp = temp->next;
pre = pre->next;
}
}
- 使用
strcmp
函数比较字符串,判断员工的姓名是否与输入的姓名相匹配,实现按姓名删除员工信息的功能。- 遍历员工信息链表,查找要删除的员工节点,并将其从链表中移除。通过记录要删除节点的前一个节点(pre)和要删除节点本身(temp)来实现删除操作。
- 使用
free
函数释放要删除的员工节点的内存空间,避免内存泄漏问题。
五、修改员工信息
//修改员工信息
void change(staff* emp)
{
staff* node = emp;
printf("请输入员工信息\n");
printf("工号:");
scanf("%d", &node->num);
printf("职务:");
scanf("%s", node->duty);
printf("姓名:");
scanf("%s", node->name);
printf("性别:");
scanf("%s", node->sex);
printf("年龄:");
scanf("%d", &node->age);
printf("文化程度:");
scanf("%s", node->edu);
printf("工资:");
scanf("%d", &node->salary);
printf("办公电话:");
scanf("%s", node->tel_office);
printf("家庭电话:");
scanf("%s", node->tel_home);
printf("手机号码:");
scanf("%s", node->mobile);
printf("微信号码:");
scanf("%s", node->WeChat);
printf("家庭住址:");
scanf("%s", node->address);
}
//按姓名修改
void namecha(staff* emp)
{
char name1[15];
printf("请输入你想要修改员工的姓名:");
scanf("%s", name1);
staff* temp = emp->next; // 要修改结点
while (temp != NULL)
{
if (strcmp(temp->name, name1) == 0)
{
change(temp);
break;
}
temp = temp->next;
}
}
//按工号修改
void numcha(staff* emp)
{
int a;
printf("请输入你要修改员工的工号:");
scanf("%d",&a);
staff* temp = emp->next; // 要修改结点
while (temp != NULL)
{
if (temp->num==a)
{
change(temp);
break;
}
temp = temp->next;
}
}
修改员工信息 (
change
函数):这个函数负责修改单个员工节点的信息。通过用户输入更新节点中的各项属性,包括工号、职务、姓名、性别、年龄、文化程度、工资、办公电话、家庭电话、手机号码、微信号码和家庭住址。按姓名修改员工信息 (
namecha
函数):这个函数根据用户输入的姓名,遍历链表查找对应的员工节点。一旦找到匹配的节点,就调用change
函数对该节点进行信息修改。按工号修改员工信息 (
numcha
函数):这个函数根据用户输入的工号,遍历链表查找对应的员工节点。一旦找到匹配的节点,就调用change
函数对该节点进行信息修改。
六、查找员工信息
//查询员工信息
//按姓名查找
void namefind(staff* emp)
{
char name1[15];
printf("请输入你想要查找员工的姓名:");
scanf("%s", name1);
staff* temp = emp->next; // 跳过头节点
int found = 0; // 标记是否找到对应的员工
while (temp != NULL)
{
if (strcmp(temp->name, name1) == 0)
{
printf("---------------------------------------------\n");
printf(" 姓名:%s 信息如下: \n",name1);
printf("---------------------------------------------\n");
printstaff(temp);
found = 1;
break;
}
temp = temp->next;
}
if (found==0)
{
printf("未找到姓名为%s的员工。\n", name1);
}
}
//按工号查找
void numfind(staff* emp)
{
int a;
printf("请输入你要查找员工的工号:");
scanf("%d",&a);
staff* temp = emp->next; // 跳过头节点
int found = 0; // 标记是否找到对应的员工
while (temp != NULL)
{
if (temp->num==a)
{
printf("---------------------------------------------\n");
printf(" 工号:%d 信息如下: \n",a);
printf("---------------------------------------------\n");
printstaff(temp);
found = 1;
break;
}
temp = temp->next;
}
if (found==0)
{
printf("未找到工号为%d的员工。\n", a);
}
}
按姓名查找员工信息 (
namefind
函数):该函数通过用户输入的姓名,遍历链表查找对应的员工节点。一旦找到匹配的节点,就调用printstaff
函数打印该节点的信息,并设置found
标志为 1。如果遍历完链表未找到匹配的员工节点,则输出未找到提示信息。按工号查找员工信息 (
numfind
函数):该函数通过用户输入的工号,遍历链表查找对应的员工节点。一旦找到匹配的节点,就调用printstaff
函数打印该节点的信息,并设置found
标志为 1。如果遍历完链表未找到匹配的员工节点,则输出未找到提示信息。
七、显示所有员工信息
// 打印员工信息
void printstaff(staff* emp)
{
staff* current = emp;
while (current != NULL)
{
printf("工号: %d\n", current->num);
printf("职务: %s\n", current->duty);
printf("姓名: %s\n", current->name);
printf("性别: %s\n", current->sex);
printf("年龄: %d\n", current->age);
printf("文化程度: %s\n", current->edu);
printf("工资: %d\n", current->salary);
printf("办公电话: %s\n", current->tel_office);
printf("家庭电话: %s\n", current->tel_home);
printf("手机号码: %s\n", current->mobile);
printf("微信号码: %s\n", current->WeChat);
printf("家庭住址: %s\n", current->address);
printf("\n");
current = current->next;
}
}
//显示所有员工信息
void display(staff* emp)
{
printf("---------------------------------------------\n");
printf(" 所有员工信息如下: \n");
printf("---------------------------------------------\n");
while(emp!=NULL)
{
printstaff(emp);
emp=emp->next;
}
}
循环结构:使用
while
循环来遍历链表中的每个员工节点,直到链表结束。函数调用:调用
printstaff
函数,将每个员工节点的信息打印出来。- 显示所有员工信息 (
display
函数):该函数通过遍历链表中的每个员工节点,调用printstaff
函数将员工的信息打印出来。在打印之前,函数会先输出一个固定的格式化提示信息,以美化输出效果。
八、统计员工信息
//统计员工信息
void statistic(staff* emp)
{
int mannum=0;
int womannum=0;
int sum=0;
staff* temp=emp->next;//跳过头结点
while(temp!=NULL)
{
if(strcmp(temp->sex,"男")==0)
{
mannum+=1;
}
else if(strcmp(temp->sex,"女")==0)
{
womannum+=1;
}
sum+=1;
temp=temp->next;
}
printf(" 以下就是相关员工的统计信息: \n");
printf("-------------------------------------------------------\n");
printf(" 员工总数 男员工数 女员工数 \n");
printf(" %d %d %d \n",sum,mannum,womannum);
printf("-------------------------------------------------------\n");
}
变量声明和初始化:使用整型变量
mannum
、womannum
和sum
分别记录男性员工数、女性员工数以及员工总数,并将它们初始化为 0。指针操作:使用指针
temp
遍历链表,从头结点的下一个节点开始,跳过头结点。循环结构:使用
while
循环遍历链表中的每个员工节点,直到链表的末尾。条件判断:使用
if
和else if
语句,通过strcmp
函数比较员工的性别,分别统计男性和女性员工。字符串处理:使用
strcmp
函数比较字符串,判断员工的性别是 "男" 还是 "女"。输入输出操作:使用
printf
函数输出统计结果,包括员工总数、男性员工数和女性员工数。- 统计员工信息 (
statistic
函数):该函数遍历链表中的每个员工节点,根据员工的性别分别统计男性和女性员工数量,同时统计员工总数。在统计完成后,函数会输出相关统计信息,包括员工总数、男性员工数和女性员工数,并以格式化的方式显示。
九、菜单
// 菜单
void menu()
{
printf("*******************************************************\n");
printf("* 欢迎进入企业员工管理系统v1.0 *\n");
printf("*******************************************************\n");
printf("* 1.输入员工信息 *\n");
printf("* 2.查询员工信息 *\n");
printf("* 3.显示所有员工信息 *\n");
printf("* 4.修改员工信息 *\n");
printf("* 5.删除员工信息 *\n");
printf("* 6.统计员工信息 *\n");
printf("* 0.退出系统 *\n");
printf("*******************************************************\n");
}
十、主函数
// 主函数
int main()
{
staff* emp=Init();
int num;
while(1)
{
menu();
printf("请选择您需要的操作(0-6):");
scanf("%d",&num);
if(num==1)
{
addstaff(emp);
}
else if(num==2)
{
printf(" 查询员工信息: \n");
printf("----------------------------------------\n");
printf(" 1.按姓名查询 \n");
printf(" 2.按工号查询 \n");
printf(" 0.返回主菜单 \n");
printf("----------------------------------------\n");
int find;
printf("请选择(0-2):");
scanf("%d",&find);
while(1)
{
if(find==1)
{
namefind(emp);
}
else if(find==2)
{
numfind(emp);
}
else if(find==0)
{
break;
}
else
{
printf("输入数字有误!\n");
break;
}
}
}
else if(num==3)
{
display(emp);
}
else if(num==4)
{
printf(" 修改员工信息: \n");
printf("----------------------------------------\n");
printf(" 1.按姓名修改 \n");
printf(" 2.按工号修改 \n");
printf(" 0.返回主菜单 \n");
printf("----------------------------------------\n");
int change;
printf("请选择(0-2):");
scanf("%d",&change);
while(1)
{
if(change==1)
{
namecha(emp);
break;
}
else if(change==2)
{
numcha(emp);
break;
}
else if(change==0)
{
break;
}
else
{
printf("输入数字有误!\n");
break;
}
}
}
else if(num==5)
{
printf(" 删除员工信息: \n");
printf("----------------------------------------\n");
printf(" 1.按姓名删除 \n");
printf(" 2.按工号删除 \n");
printf(" 0.返回主菜单 \n");
printf("----------------------------------------\n");
int del;
printf("请选择(1-or-2):");
scanf("%d",&del);
while(1)
{
if(del==1)
{
namedel(emp);
}
else if(del==2)
{
numdel(emp);
}
else if(del==0)
{
break;
}
else
{
printf("输入数字有误!\n");
break;
}
}
}
else if(num==6)
{
statistic(emp);
}
else if(num==7)
{
break;
}
else
{
printf("输入数字有误,请重新输入!!!");
}
}
return 0;
}
函数调用:使用函数调用来实现不同操作,如
Init()
初始化员工链表,menu()
显示菜单,addstaff(emp)
添加员工,namefind(emp)
和numfind(emp)
查询员工,display(emp)
显示员工信息,namecha(emp)
和numcha(emp)
修改员工信息,namedel(emp)
和numdel(emp)
删除员工信息,以及statistic(emp)
统计员工信息。循环结构:使用
while(1)
实现主循环,使程序可以持续运行,直到用户选择退出。嵌套循环用于在某些操作(如查询、修改、删除)中提供进一步的选择,并在用户选择返回主菜单时退出当前循环。条件判断:使用
if-else if-else
语句根据用户输入的数字选择对应的操作,在查询、修改和删除操作中,通过二级菜单进一步细分操作类型,并使用条件判断执行具体操作。输入输出操作:使用
printf
函数向用户展示菜单和提示信息。使用scanf
函数获取用户输入的操作选项和进一步的选择。指针操作:使用指针
emp
指向员工链表的头结点,通过传递这个指针来进行各种员工信息的操作。
项目全套代码展示
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// 员工信息
typedef struct staff
{
int num; // 工号
char duty[10]; // 职务
char name[15]; // 姓名
char sex[5]; // 性别
int age; // 年龄
char edu[10]; // 文化程度
int salary; // 工资
char tel_office[13]; // 办公电话
char tel_home[13]; // 家庭电话
char mobile[13]; // 手机号码
char WeChat[12]; // 微信号码
char address[31]; // 家庭住址
struct staff* next;
} staff;
//声明子函数
void addstaff(staff* emp);
void namedel(staff* emp);
void numdel(staff* emp);
void change(staff* emp);
void namecha(staff* emp);
void numcha(staff* emp);
void printstaff(staff* emp);
void namefind(staff* emp);
void numfind(staff* emp);
void display(staff* emp);
// 功能函数
// 初始化员工信息
staff* Init()
{
staff* emp = (staff*)malloc(sizeof(staff));
emp->next = NULL;
return emp;
}
// 输入员工信息
void addstaff(staff* emp)
{
staff* node = (staff*)malloc(sizeof(staff));
printf("请输入员工信息\n");
printf("工号:");
scanf("%d", &node->num);
printf("职务:");
scanf("%s", node->duty);
printf("姓名:");
scanf("%s", node->name);
printf("性别:");
scanf("%s", node->sex);
printf("年龄:");
scanf("%d", &node->age);
printf("文化程度:");
scanf("%s", node->edu);
printf("工资:");
scanf("%d", &node->salary);
printf("办公电话:");
scanf("%s", node->tel_office);
printf("家庭电话:");
scanf("%s", node->tel_home);
printf("手机号码:");
scanf("%s", node->mobile);
printf("微信号码:");
scanf("%s", node->WeChat);
printf("家庭住址:");
scanf("%s", node->address);
node->next = NULL;
while (emp->next != NULL)
{
emp = emp->next;
}
emp->next = node;
}
//删除员工信息
//按姓名删除
void namedel(staff* emp)
{
char name1[15];
printf("请输入你想要删除员工的姓名:");
scanf("%s", name1);
staff* temp = emp->next; // 要删除结点
staff* pre = emp;//要删除结点的上一个结点
while (temp != NULL)
{
if (strcmp(temp->name, name1) == 0)
{
pre=temp->next;
free(temp);
break;
}
temp = temp->next;
pre = pre->next;
}
}
//按工号删除
void numdel(staff* emp)
{
int a;
printf("请输入你要删除员工的工号:");
scanf("%d",&a);
staff* temp = emp->next; // 要删除结点
staff* pre = emp;//要删除结点的上一个结点
while (temp != NULL)
{
if (temp->num==a)
{
pre=temp->next;
free(temp);
break;
}
temp = temp->next;
pre = pre->next;
}
}
//修改员工信息
void change(staff* emp)
{
staff* node = emp;
printf("请输入员工信息\n");
printf("工号:");
scanf("%d", &node->num);
printf("职务:");
scanf("%s", node->duty);
printf("姓名:");
scanf("%s", node->name);
printf("性别:");
scanf("%s", node->sex);
printf("年龄:");
scanf("%d", &node->age);
printf("文化程度:");
scanf("%s", node->edu);
printf("工资:");
scanf("%d", &node->salary);
printf("办公电话:");
scanf("%s", node->tel_office);
printf("家庭电话:");
scanf("%s", node->tel_home);
printf("手机号码:");
scanf("%s", node->mobile);
printf("微信号码:");
scanf("%s", node->WeChat);
printf("家庭住址:");
scanf("%s", node->address);
}
//按姓名修改
void namecha(staff* emp)
{
char name1[15];
printf("请输入你想要修改员工的姓名:");
scanf("%s", name1);
staff* temp = emp->next; // 要修改结点
while (temp != NULL)
{
if (strcmp(temp->name, name1) == 0)
{
change(temp);
break;
}
temp = temp->next;
}
}
//按工号修改
void numcha(staff* emp)
{
int a;
printf("请输入你要修改员工的工号:");
scanf("%d",&a);
staff* temp = emp->next; // 要修改结点
while (temp != NULL)
{
if (temp->num==a)
{
change(temp);
break;
}
temp = temp->next;
}
}
// 打印员工信息
void printstaff(staff* emp)
{
staff* current = emp;
while (current != NULL)
{
printf("工号: %d\n", current->num);
printf("职务: %s\n", current->duty);
printf("姓名: %s\n", current->name);
printf("性别: %s\n", current->sex);
printf("年龄: %d\n", current->age);
printf("文化程度: %s\n", current->edu);
printf("工资: %d\n", current->salary);
printf("办公电话: %s\n", current->tel_office);
printf("家庭电话: %s\n", current->tel_home);
printf("手机号码: %s\n", current->mobile);
printf("微信号码: %s\n", current->WeChat);
printf("家庭住址: %s\n", current->address);
printf("\n");
current = current->next;
}
}
//查询员工信息
//按姓名查找
void namefind(staff* emp)
{
char name1[15];
printf("请输入你想要查找员工的姓名:");
scanf("%s", name1);
staff* temp = emp->next; // 跳过头节点
int found = 0; // 标记是否找到对应的员工
while (temp != NULL)
{
if (strcmp(temp->name, name1) == 0)
{
printf("---------------------------------------------\n");
printf(" 姓名:%s 信息如下: \n",name1);
printf("---------------------------------------------\n");
printstaff(temp);
found = 1;
break;
}
temp = temp->next;
}
if (found==0)
{
printf("未找到姓名为%s的员工。\n", name1);
}
}
//按工号查找
void numfind(staff* emp)
{
int a;
printf("请输入你要查找员工的工号:");
scanf("%d",&a);
staff* temp = emp->next; // 跳过头节点
int found = 0; // 标记是否找到对应的员工
while (temp != NULL)
{
if (temp->num==a)
{
printf("---------------------------------------------\n");
printf(" 工号:%d 信息如下: \n",a);
printf("---------------------------------------------\n");
printstaff(temp);
found = 1;
break;
}
temp = temp->next;
}
if (found==0)
{
printf("未找到工号为%d的员工。\n", a);
}
}
//显示所有员工信息
void display(staff* emp)
{
printf("---------------------------------------------\n");
printf(" 所有员工信息如下: \n");
printf("---------------------------------------------\n");
while(emp!=NULL)
{
printstaff(emp);
emp=emp->next;
}
}
//统计员工信息
void statistic(staff* emp)
{
int mannum=0;
int womannum=0;
int sum=0;
staff* temp=emp->next;//跳过头结点
while(temp!=NULL)
{
if(strcmp(temp->sex,"男")==0)
{
mannum+=1;
}
else if(strcmp(temp->sex,"女")==0)
{
womannum+=1;
}
sum+=1;
temp=temp->next;
}
printf(" 以下就是相关员工的统计信息: \n");
printf("-------------------------------------------------------\n");
printf(" 员工总数 男员工数 女员工数 \n");
printf(" %d %d %d \n",sum,mannum,womannum);
printf("-------------------------------------------------------\n");
}
// 菜单
void menu()
{
printf("*******************************************************\n");
printf("* 欢迎进入企业员工管理系统v1.0 *\n");
printf("*******************************************************\n");
printf("* 1.输入员工信息 *\n");
printf("* 2.查询员工信息 *\n");
printf("* 3.显示所有员工信息 *\n");
printf("* 4.修改员工信息 *\n");
printf("* 5.删除员工信息 *\n");
printf("* 6.统计员工信息 *\n");
printf("* 0.退出系统 *\n");
printf("*******************************************************\n");
}
// 主函数
int main()
{
staff* emp=Init();
int num;
while(1)
{
menu();
printf("请选择您需要的操作(0-6):");
scanf("%d",&num);
if(num==1)
{
addstaff(emp);
}
else if(num==2)
{
printf(" 查询员工信息: \n");
printf("----------------------------------------\n");
printf(" 1.按姓名查询 \n");
printf(" 2.按工号查询 \n");
printf(" 0.返回主菜单 \n");
printf("----------------------------------------\n");
int find;
printf("请选择(0-2):");
scanf("%d",&find);
while(1)
{
if(find==1)
{
namefind(emp);
}
else if(find==2)
{
numfind(emp);
}
else if(find==0)
{
break;
}
else
{
printf("输入数字有误!\n");
break;
}
}
}
else if(num==3)
{
display(emp);
}
else if(num==4)
{
printf(" 修改员工信息: \n");
printf("----------------------------------------\n");
printf(" 1.按姓名修改 \n");
printf(" 2.按工号修改 \n");
printf(" 0.返回主菜单 \n");
printf("----------------------------------------\n");
int change;
printf("请选择(0-2):");
scanf("%d",&change);
while(1)
{
if(change==1)
{
namecha(emp);
break;
}
else if(change==2)
{
numcha(emp);
break;
}
else if(change==0)
{
break;
}
else
{
printf("输入数字有误!\n");
break;
}
}
}
else if(num==5)
{
printf(" 删除员工信息: \n");
printf("----------------------------------------\n");
printf(" 1.按姓名删除 \n");
printf(" 2.按工号删除 \n");
printf(" 0.返回主菜单 \n");
printf("----------------------------------------\n");
int del;
printf("请选择(1-or-2):");
scanf("%d",&del);
while(1)
{
if(del==1)
{
namedel(emp);
}
else if(del==2)
{
numdel(emp);
}
else if(del==0)
{
break;
}
else
{
printf("输入数字有误!\n");
break;
}
}
}
else if(num==6)
{
statistic(emp);
}
else if(num==7)
{
break;
}
else
{
printf("输入数字有误,请重新输入!!!");
}
}
return 0;
}