c语言 链表 员工管理系统 vs2013

本文介绍了一个简单的员工管理系统,使用C语言实现,包含单链表的基本操作如插入、删除、修改员工信息等,并能将信息输出到文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过单链表实现
代码部分

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
typedef struct team  //结构体 员工信息
{
	unsigned int nID;   //工号
	char name[20];      //姓名
	char sex[4];        //性别
	unsigned short age; //年龄
	int weight;         //体重
	unsigned short hight; //身高
	int salary;         //工资
}Team;
typedef struct node    //建立单链表
{
	Team t;          //当前结点的内容
	struct node *pNext;   //下一个结点
}Node;
Node *pHead = NULL;   //头节点
Node *End = NULL;     //尾结点
void Insert()   //加入新员工
{
	//找到尾节点
	Node *p=pHead;   //创建指针指向头节点
	while (pHead != NULL&&p->pNext != NULL)
	{
		p = p->pNext;                  //找到链表最后一位
	}
	//创建一个新节点
	Node *pNewNode = (Node*)malloc(sizeof(Node));
	pNewNode->pNext = NULL;
	printf("输入员工工号\n");
	scanf("%d", &pNewNode->t.nID);
	if (pHead != NULL)   //判断员工信息是否重复
	{
		Node *p1 = pHead;
		while (p1 != NULL)
		{
			if (pNewNode->t.nID == p1->t.nID)
			{
				printf("员工信息重复!!!");
				Sleep(200);
				return;
			}
			p1 = p1->pNext;
		}
	}
	printf("输入员工姓名\n");
	scanf("%s", pNewNode->t.name);
	printf("输入员工性别\n");
	scanf("%s", pNewNode->t.sex);
	printf("输入员工年龄\n");
	scanf("%d", &pNewNode->t.age);
	printf("输入员工体重(KG)\n");
	scanf("%d", &pNewNode->t.weight);
	printf("输入员工身高(CM)\n");
	scanf("%d",&pNewNode->t.hight);
	printf("输入员工工资(元)\n");
	scanf("%d", &pNewNode->t.salary);
	if (pHead == NULL)         //如果链表为空,直接从头开始写入
	{
		pHead = pNewNode;
	}
	else
	{
		p->pNext = pNewNode;        //如果不为空则在链表最后一位的下一位写入数据
	}
	printf("录入完成!\n");
	Sleep(200);
	system("cls");
}
void print()      //输出员工信息
{
	Node *p = pHead;
	printf("工号	姓名	性别	年龄	体重	身高	工资\n");
	while (p != NULL)     //节点为空时 停止循环
	{
		printf("%d	%s	%s	%d	%d	%d	%d\n", p->t.nID, p->t.name,p->t.sex,p->t.age,p->t.weight,p->t.hight,p->t.salary); //输出数据
		p = p->pNext;            //获取下一个节点的内容
	}
}
void count()  //查看员工
{
	int i=0;
	Node* p = pHead;
	while (p != NULL)
	{
		p = p->pNext;
		i++;              //记录执行次数
	}
	printf("一共有%d名员工\n", i);
}
Node *Find()   //查找结点
{
	int a,i=0;
	printf("请输入员工工号");
	scanf("%d", &a);
		Node *p = pHead;
		while (p != NULL)   //从头遍历直到为空
		{
			if (a == p->t.nID)
			{
				printf("工号	姓名	性别	年龄	体重	身高	工资\n");
				printf("%d	%s	%s	%d	%d	%d	%d\n", p->t.nID, p->t.name, p->t.sex, p->t.age, p->t.weight, p->t.hight, p->t.salary);
				++i;
				return p;   //将找的结点返回
			}
			p = p->pNext;			
		}
		if (i == 0)
		{
			printf("未找到员工\n");
		}
		return NULL;//没找到
		
}
void DeleteHead()    //删除头
{	//记住旧头
	Node* p = pHead;
	//链表检测 
	if (NULL == pHead)
	{
		printf("链表为空\n");
		return;
	}

	pHead = pHead->pNext;//头的第二个节点变成新的头
	free(p);

}
void DeleteTail()   //删除尾
{
	if (NULL == End)
	{
		printf("链表为空,无需删除\n");
		return;
	}
	//链表不为空 
	//链表有一个节点
	if (pHead == End)
	{
		free(pHead);
		pHead = NULL;
		End = NULL;
	}
	else
	{
		//找到尾巴前一个节点
		Node *p = pHead;
		while (p->pNext != End)
		{
			p = p->pNext;
		}
		//找到了,删尾巴
		//释放尾巴
		free(End);
		//尾巴迁移
		End = p;
		//尾巴指针为NULL
		End->pNext = NULL;
	}

}
void Del()   //删除员工
{
	int a = 0;
	//链表判断 是不是没有东西
	if (NULL == pHead)
	{
		printf("暂无员工\n");
		return;
	}
	//链表有数据,找这个节点
	Node* p = Find();
	if (NULL == p)
	{
		printf("未找到员工\n");
		return;
	}
	//找到了,且只有一个节点
	if (pHead == End)
	{
		free(pHead);
		pHead = NULL;
		End = NULL;
	}
	else if (pHead->pNext == End) //有两个节点
	{
		//看是删除头还是删除尾
		if (End == p)
		{
			DeleteTail();
		}
		else if (p == pHead)
		{
			DeleteHead();
		}
	}
	else//多个节点
	{
		//看是删除头还是删除尾
		if (End == p)
			DeleteTail(); //删除头
		else if (p == pHead)
			DeleteHead();    
		else	//删除中间某个节点
		{	//找要删除temp前一个,遍历
			Node *pt = pHead;
			while (pt->pNext != p)
			{
				pt = pt->pNext;
			}
			//找到了
			//让前一个直接连接后一个 跳过指定的即可
			pt->pNext = p->pNext;
			free(p);

		}
	}


}
void Change()   //修改员工信息
{
	Node *p=Find();
	printf("输入员工工号\n");
	scanf("%d", &p->t.nID);
	printf("输入员工姓名\n");
	scanf("%s", p->t.name);
	printf("输入员工性别\n");
	scanf("%s", p->t.sex);
	printf("输入员工年龄\n");
	scanf("%d", &p->t.age);
	printf("输入员工体重(KG)\n");
	scanf("%d", &p->t.weight);
	printf("输入员工身高(CM)\n");
	scanf("%d", &p->t.hight);
	printf("输入员工工资(元)\n");
	scanf("%d", &p->t.salary);
	printf("修改完成!\n");

}
void Wfp()    //将员工信息写入文件
{
	int i = 0;
	Node *p = pHead;
	if (p == NULL)
	{
		return;
	}
	FILE *fp;
	if ((fp = fopen("fle.txt", "wt")) == NULL)    //文件操作
	{
		printf("打开写入文件fle.txt失败\n");
		return;
	}
	while (p)
	{
		fprintf(fp,"%d	%s	%s	%d	%d	%d	%d\n", p->t.nID, p->t.name, p->t.sex, p->t.age, p->t.weight, p->t.hight, p->t.salary);
		p = p->pNext;
		++i;

	}
	printf("写入完成!共%d名员工信息\n",i);
	fclose(fp);
}
void welcom()   //界面及 选择结构
{
	printf("*****************************\n");
	printf("*       员工管理系统        *\n");
	printf("*       1.加入新员工        *\n");
	printf("*       2.查看员工信息      *\n");
	printf("*       3.查看员工数        *\n");
	printf("*       4.查找员工          *\n");
	printf("*       5.删除员工          *\n");
	printf("*       6.修改员工信息      *\n");
	printf("*       7.信息写入文件      *\n");
	printf("*       0.退出              *\n");
	printf("*****************************\n");
	int a = getch();       // 获取按键
	switch (a)
	{
	case '1':
		Insert();
		break;
	case '2':
		system("cls");
		print();
		system("pause");
		break;
	case '3':
		system("cls");
		count();
		system("pause");
		break;
	case'4':
		system("cls");
		Find();
		system("pause");
		break;
	case '5':
		system("cls");
		Del();
		system("pause");
		break;
	case '6':
		system("cls");
		Change();
		system("pause");
		break;
	case '7':
		Wfp();
		system("pause");
		break;
	case '0':
		exit(0);
	default:
		printf("输入错误!\n");
		Sleep(200);
		system("cls");
		break;
	}

	
}
int main()
{
	while (1)              //无限循环 可多次操作
	{
		welcom();
		system("cls");     //清屏
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值