代码部分
#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"); //清屏
}
}