【数据结构】人员名单管理

题面

某软件公司大约有30名员工,每名员工有姓名、工号、职务等属性,每年都有员工离职和入职。
把所有员工按照顺序存储结构建立一个线性表,建立离职和入职函数,当有员工离职或入职时,修改线性表,并且打印最新的员工名单。

思路

  1. 顺序表+存储员工信息的结构体
  2. 按照初始化、员工入职、员工离职、信息打印封装函数

源代码

结构体”员工“

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
  • 顺序表可以定义为一个结构体类型,存储基址,长度等信息。
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值