StaffManagementSystem

#include<stdio.h>
#include<stdlib.h>

typedef struct Link
{
	struct Link * prior;//指向直接前趋

	char name[20];//姓名
	char gender[10];//性别
	char dateOfBirth[20];//出生年月
	char workingyears[20];//工作年月
	char education[10];//学历
	char occupation[20];//职务
	char address[50];//住址
	char tel[20];//电话

	struct Link * next;//指向直接后继
}Link;//职工信息

//导入职工信息
Link* Read(Link* head)//从职工信息文件读取到链表里,此函数返回一个指向链表头的指针
{
	FILE *fp = fopen("D:\\staff.txt", "r");//打开文件
	if (fp == NULL)
	{
		printf("文件打开失败!\n");
		exit(0);
	}

	Link *newStaff, *p = NULL;
	while (!feof(fp))//读取文件信息
	{
		newStaff = (Link *)malloc(sizeof(Link));//开辟动态存储区,起始地址赋给newUser
		fscanf(fp, "%s %s %s %s %s %s %s %s", 
			newStaff->name, newStaff->gender, newStaff->dateOfBirth, newStaff->workingyears, newStaff->education, newStaff->occupation, newStaff->address, newStaff->tel);
		
		if (head == NULL)
		{
			head = newStaff;
			head->prior = NULL;
		}
		else
		{
			p->next = newStaff;
			newStaff->prior = p;
		}
		p = newStaff;
		p->next = NULL;
	}
	fclose(fp);//关闭文件

	return head;
}
//新增一名职工
Link* InsertElem(Link* head)
{
	printf("新增职工信息,请输入:\n");
	//创建插入结点c
	Link* c = (Link*)malloc(sizeof(Link));
	printf("姓名 性别 出生年月 工作年月 学历 职务 住址 电话\n");
	scanf("%s %s %s %s %s %s %s %s",
		c->name, c->gender, c->dateOfBirth, c->workingyears, c->education, c->occupation, c->address, c->tel);
	c->next = NULL;

	Link* temp = head;//创建临时结点temp
	//找链表最末端
	if (temp == NULL)//链表本就空的,考虑特殊情况
		head = c;
	else
	{
		while (temp->next != NULL)
			temp = temp->next;
		//插入链表
		temp->next = c;
		c->prior = temp;

	}
	printf("================新增成功================\n");
	return  head;
}
//删除一名职工
Link* DeleteElem(Link* head)
{
	Link * temp = head;

	char nameT[20];
	printf("输入你要删除职工的姓名:\n");
	scanf("%s", nameT);
	if (temp != NULL)
	{
		while (strcmp(temp->name, nameT) != 0 && temp != NULL)
			temp = temp->next;
		if (temp == NULL)
		{
			printf("未找到相关职工信息\n");
			return;
		}
		printf("姓名 性别 出生年月 工作年月 学历 职务 住址 电话\n");
		printf("%s %s %s %s %s %s %s %s\n",
			temp->name, temp->gender, temp->dateOfBirth, temp->workingyears, temp->education, temp->occupation, temp->address, temp->tel);

		if (temp == head)
		{
			head = temp->next;
			head->prior = NULL;
			free(temp);
		}
		else if (temp->next == NULL)//最后一个结点
		{
			temp->prior->next = NULL;
			free(temp);
		}
		else
		{
			temp->prior->next = temp->next;
			temp->next->prior = temp->prior;
			free(temp);//删除该结点
		}
		printf("================删除成功================\n");
	}
	else
		printf("职工信息为空!\n");

	return head;
}
//查询
void Find(Link* head)
{

	printf("请输入要查询的职工条件(如:姓名、性别、出生年月、工作年月、学历、职务、住址或电话):");
	char inputO[50];
	scanf("%s", inputO);

	Link* temp = head;//开始根据要求查找
	while (temp != NULL)//字符串比较
	{
		if (strcmp(temp->name, inputO) == 0 || strcmp(temp->dateOfBirth, inputO) == 0 || strcmp(temp->workingyears, inputO) == 0 || strcmp(temp->education, inputO) == 0 || strcmp(temp->occupation, inputO) == 0 || strcmp(temp->address, inputO) == 0 || strcmp(temp->tel, inputO) == 0)
		{
			printf("姓名 性别 出生年月 工作年月 学历 职务 住址 电话\n");
			printf("%s %s %s %s %s %s %s %s\n",
				temp->name, temp->gender, temp->dateOfBirth, temp->workingyears, temp->education, temp->occupation, temp->address, temp->tel);
		}
		temp = temp->next;
	}

}
//修改
void Change(Link* head)
{
	Link* temp = head;

	char nameT[10];
	printf("输入你要修改的职工姓名:\n");
	scanf("%s", nameT);
	if (temp != NULL)
	{
		while (strcmp(temp->name, nameT) != 0 && temp != NULL)
			temp = temp->next;
		if (temp == NULL)
		{
			printf("未找到相关职工信息\n");
			return;
		}
		printf("现在的信息为:姓名 性别 出生年月 工作年月 学历 职务 住址 电话\n");
		printf("\t%s %s %s %s %s %s %s %s\n",
			temp->name, temp->gender, temp->dateOfBirth, temp->workingyears, temp->education, temp->occupation, temp->address, temp->tel);
		printf("输入更改后的信息:");
		printf("姓名 性别 出生年月 工作年月 学历 职务 住址 电话\n");
		scanf("%s %s %s %s %s %s %s %s",
			temp->name, temp->gender, temp->dateOfBirth, temp->workingyears, temp->education, temp->occupation, temp->address, temp->tel);
		printf("================修改成功================\n");
	}
	else
		printf("职工信息为空!\n");

}
//交换
void SwapCh(char* T, char* L)
{
	char ch[50];
	strcpy(ch, T);
	strcpy(T, L);
	strcpy(L, ch);
}
//排序(根据职工名字)
Link* Sort(Link* head)
{
	Link* temp = head;
	int swap = 1;// 默认为真

	while (swap)
	{
		swap = 0;
		//大数沉底
		while (temp->next != NULL)//从左往右大数沉底
		{
			if (strcmp(temp->name, temp->next->name) > 0)//比较
			{
				swap = 1;
				SwapCh(temp->name, temp->next->name);
				SwapCh(temp->gender, temp->next->gender);
				SwapCh(temp->dateOfBirth, temp->next->dateOfBirth);
				SwapCh(temp->workingyears, temp->next->workingyears);
				SwapCh(temp->education, temp->next->education);
				SwapCh(temp->occupation, temp->next->occupation);
				SwapCh(temp->address, temp->next->address);
				SwapCh(temp->tel, temp->next->tel);
			}
			temp = temp->next;//指针后移
		}

		//小数起泡
		while (temp->prior != NULL)//从右往左小数冒泡
		{
			if (strcmp(temp->name, temp->prior->name) < 0)
			{
				swap = 1;
				SwapCh(temp->name, temp->prior->name);
				SwapCh(temp->gender, temp->prior->gender);
				SwapCh(temp->dateOfBirth, temp->prior->dateOfBirth);
				SwapCh(temp->workingyears, temp->prior->workingyears);
				SwapCh(temp->education, temp->prior->education);
				SwapCh(temp->occupation, temp->prior->occupation);
				SwapCh(temp->address, temp->prior->address);
				SwapCh(temp->tel, temp->prior->tel);
			}
			temp = temp->prior;
		}
	}
	printf("================排序成功================\n");
	return head;
}
//导出
void write(Link* head)
{
	FILE *fp;
	if ((fp = fopen("D:\\staff.txt", "wb")) == NULL)
	{
		printf("\nFailed to open file.");
		getchar();
		exit(1);
	}
	while (head)
	{
		fprintf(fp, "%s %s %s %s %s %s %s %s\n",
			head->name, head->gender, head->dateOfBirth, head->workingyears, head->education, head->occupation, head->address, head->tel);
		head = head->next;
	}
	fclose(fp);

}
//菜单
int menu()
{
	int m;
	do{
		printf("\t================职工管理系统================\n\n");
		printf("\t\t1. 新增一名职工\n");
		printf("\t\t2. 删除一名职工\n");
		printf("\t\t3. 查询\n");
		printf("\t\t4. 修改\n");
		printf("\t\t5. 排序\n");
		printf("\t\t0. 退出\n\n");
		printf("\t================请选择================\n\n");
		scanf("%d", &m);

	} while (m < 0 && m>5);//菜单选项外跳出

	return m;
}
int main()
{
	Link *head = NULL;
	head = Read(head);
	for (;;)//死循环
	{
		switch (menu())
		{
		case 1:head = InsertElem(head); write(head); break;
		case 2:head = DeleteElem(head); write(head); break;
		case 3:Find(head); write(head); break;
		case 4:Change(head); write(head); break;
		case 5:head = Sort(head); write(head); break;
		case 0:exit(0); break;
		default:printf("================输入错误================\n"); break;
		}

	}
	return 0;
}

staff.txt:
张三 男 1997.12.01 2年5月 本科 工人 花园小区 13525471586
王五 男 1998.12.01 3年5月 本科 工人 花园小区 18459632586
赵四 女 1999.12.01 4年5月 本科 工人 花园小区 14875695252
李二 男 2000.12.01 3年5月 硕士 经理 佳玉小区 18799845526

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值