题面
某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和入职。
把所有员工按照顺序存储结构建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且打印最新的员工名单。
思路
- 顺序表+存储员工信息的结构体
- 按照初始化、员工入职、员工离职、信息打印封装函数
源代码
结构体”员工“
typedef struct {
char name[20];//姓名
char No[8];//工号
char job[20];//职务
}WORKER;//员工属性
线性表的定义和初始化
#define List_init_size 40
#define Listincrement 5
typedef struct {
WORKER *worker;//存储空间基址
int lenth;//当前长度
int listsize;//当前分配的存储容量
} Sqlist_w;
int initlis_Sqlist_w(Sqlist_w &L){
//线性表初始化
L.worker = (WORKER*)malloc(List_init_size * sizeof(WORKER));
if (!L.worker) return -1;
WORKER wlist[31] = { {"某人","0000001","大老板" }, {"赵拾万","01","车间主任" }, { "钱大花","02","首席酿酒师" }, { "孙明","03","财务总监" },\
{ "李大毛","04","制曲工" }, { "李二毛","05","制曲工" }, { "李三毛","06","制曲工" }
,{ "周爱国","07","锅炉工" },{ "周为国","08","锅炉工" }, { "周建国","09","锅炉工" },\
{ "吴春杏","10","装瓶工" },{ "吴夏荷","11","装瓶工" }, { "吴秋菊","12","装瓶工" },{ "吴冬梅","13","装瓶工" },\
{ "郑柳亭","14","蒸馏工" }, { "郑柳台","15","蒸馏工" }, { "郑柳楼","16","蒸馏工" }, { "郑柳阁","17","蒸馏工" }\
,{ "王小头","18","修桶匠" },{ "王大头","19","修桶匠" },\
{ "冯大大","20","销售员" }, { "冯大有","21","销售员" },{ "冯大作","22","销售员" }, \
{ "冯大为","23","销售员" }\
,{ "陈大美","24","清洁工" },{ "陈小丽","25","清洁工" },{ "陈壮壮","26","保安队长" }\
, { "褚牛牛","27","保安" }, { "褚虎虎","28","保安" }, { "卫多美","29","厨师" }, { "卫健康","30","厨师" } };
int i=0;
for(i=0;i<31;i++)
L.worker[i]= wlist[i];
L.lenth = 31;
L.listsize = List_init_size;
return 0;
}
员工入职
int entry(Sqlist_w& L) {
//一位员工入职
WORKER newman = { 0 };
int i,k=0;
WORKER* newbase_L;
printf("请输入新员工的姓名\n");
scanf("%s", newman.name);
printf("请输入新员工的工号\n");
scanf("%s", newman.No);
printf("请输入新员工的职务\n");
scanf("%s", newman.job);
if (L.lenth >= L.listsize) {//当前空间已满,增加分配
newbase_L = (WORKER*)realloc(L.worker, (L.listsize + Listincrement) * sizeof(WORKER));
if (!newbase_L)
return -1;
L.worker = newbase_L;
L.listsize += Listincrement;
}
while (1) {
for (i = 0; i < L.lenth; i++)
if (strcmp(newman.No , L.worker[i].No)==0) {
printf("工号已存在,请重新输入!\n");
scanf("%s", newman.No);
k = -1;
break;
}
if (i==L.lenth) {
L.worker[L.lenth] = newman;
break;
}
}
L.lenth++;
desplay(L);
return 0;
}
员工离职
int quit(Sqlist_w& L) {
//一位员工离职
char new_no[8] = { 0 };
printf("请输入离职员工的工号:\n");
scanf("%s", new_no);
int i;
WORKER* p,*q;
for (i = 0; i < L.lenth; i++) {
if (strcmp(new_no, L.worker[i].No) == 0) {
p = &(L.worker[i]);
q = L.worker + L.lenth - 1;
for (++p;p<=q;++p)
*(p-1) = *p;
break;
}
}
if (i == L.lenth){
printf("输入工号不存在!\n");
return 0;
}
L.lenth--;
desplay(L);
return 2;
}//报错堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出。
信息打印
void desplay(Sqlist_w L) {
printf("当前员工信息:\n");
printf("姓名 工号 职务\n");
int i;
for (i = 0; i < L.lenth; i++) {
printf("%-9s %-9s %s\n", L.worker[i].name, L.worker[i].No, L.worker[i].job);
}
printf("\n");
}
主函数
int main() {
int command = 0;
Sqlist_w L0;
initlis_Sqlist_w(L0);
while (1) {
printf("欢迎使用红星二锅头bjtu分厂员工信息管理系统!\n");
printf(" 请选择操作:\n 1.一位员工入职\n 2.一位员工离职\n 3.仅打印当前员工名单\n 0.退出程序\n");
scanf("%d", &command);
switch (command) {
case 1:entry(L0); break;
case 2:quit(L0); break;
case 3:desplay(L0); break;
case 0:return 0; break;
default:printf("输入不正确,请再次输入。\n");
}
}
return 0;
}
反思
- 要求使用动态内存分配,所以在进行删除、插入元素等操作时要善用指针操作。
- 空间已满,增加分配时可以用realloc
- 顺序表可以定义为一个结构体类型,存储基址,长度等信息。