#include <stdio.h>
#include <malloc.h>
typedef struct
{
int no; //职工号
char name[10]; //姓名
int depno; //部门号
float salary; //工资数
}EmpType; //职工类型
typedef struct node
{
EmpType data; //存放职工信息 Emp=employ pre=头结点
struct node *next; //指向下一个结点的指针
}EmpList;
void DestroyEmp(EmpList *&L)
{
EmpList *pre=L,*p=L->next; //pre指向结点p的前驱节点
//[Error] 'p' was not declared in this scope 在这个范围没有声明,直接用";"
while(p!=NULL) //扫描单链表L
{
free(pre); //每次进入循环先释放首结点
pre=p; //pre、p同步后移一个结点
p=pre->next;
}
free(p); //循环结束时p为NULL,pre指向尾结点,释放它
}
void DelAll(EmpList *&L)
{
FILE *fp;
if((fp=fopen("emp.dat","wb"))=NULL) //文件指针名=(文件名,使用文件方式) wb:只可以写,(二进制模式)
{
printf(" 提示:不能打开职工文件\n");
return;
}
fclose(fp);
DestroyEmp(L);
L=(EmpList *)malloc(sizeof(EmpList));
L->next==NULL; //建立一个空的职工单链表L
printf(" 提示:职工数据清楚完毕\n");
}
/*
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size -- 这是要读取的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。
如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
*/
void ReadFile(EmpList *&L)
{
FILE *fp;
EmpType emp;
EmpList *p,*r;
int n = 0;
L=(EmpList *)malloc(sizeof(EmpList));//创建头结点
r=L; //r始终指向尾结点,初始化指向头结点
if((fp=fopen("emp.dat","rb"))==NULL)//只可以读,不存咋emp.dat文件
//[Error] 'else' without a previous 'if' 后面加了";"
{
if((fp = fopen("emp.dat","wb"))==NULL)
printf(" 提示:不能创建emp.dat文件\n");
}
else
{
while(fread(&emp,sizeof(EmpType),1,fp)==1)
{
p=(EmpList *)malloc(sizeof(EmpList));
p->data=emp;
r->next=p;
r=p;
n++;
}
}
r->next=NULL;
printf(" 提示:职工单链表L建立完毕,有%d个记录\n",n);
fclose(fp);
}
/*
如果成功,该函数返回一个 size_t 对象,表示元素的总数
该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
*/
void SaveFile(EmpList *L)
{
EmpList *p=L->next;
int n = 0;
FILE *fp;
if((fp=fopen("emp.dat","wb"))==NULL)
{
printf(" 提示:不能创建文件emp.dat\n");
return;
}
while(p!=NULL)
{
fwrite(&p->data,sizeof(EmpType),1,fp);
p=p->next;
n++;
}
fclose(fp);
DestroyEmp(L);
if(n>0)
printf(" 提示:%d个职工记录写入emp.dat文件\n",n);
else
printf(" 提示:没有任何职工记录写入emp.txt文件");
}
void InputEmp(EmpList *&L)
{
EmpType p;
EmpList *s;
printf(" >>输入职工号(-1返回):");
scanf("%d",&p.no);
if(p.no == -1) return;
printf(" >>输入姓名 部门号 工资:");
scanf("%s %d %f",&p.name,&p.depno,&p.salary);
s=(EmpList *)malloc(sizeof(EmpList));
s->data=p;
s->next=L->next;
L->next=s;
printf(" 提示:添加成功\n");
}
void DelEmp(EmpList *&L)
{
EmpList *pre=L,*p=L->next;
int no;
printf(" >>提示:指定的职工记录不存在");
scanf("%d",&no);
if(no==-1) return;
while(p!=NULL && p->data.no!=no)
{
pre=p;
p=p->next;
}
if(p==NULL)
printf(" 提示:指定的职工记录不存在\n");
else
{
pre->next=p->next;
free(p);
printf(" 提示:删除成功\n");
}
}
void Sortno(EmpList *&L)
{
EmpList *p,*pre,*q;
p=L->next->next;
if(p!=NULL)
{
L->next->next=NULL;
while(p!=NULL)
{
q=L->next;
pre=L;
while(pre->next!=NULL && pre->next->data.no<p->data.no)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
printf(" 提示:按no递增排序完毕\n");
}
void Sortdepno(EmpList *&L)
{
EmpList *p,*pre,*q;
p=L->next->next;
if(p!=NULL)
{
L->next->next=NULL;
while(p!=NULL)
{
q=L->next;
pre=L;
while(pre->next!=NULL && pre->next->data.depno<p->data.depno)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
printf(" 提示:按depno递增排序完毕\n");
}
void Sortsalary(EmpList *&L)
{
EmpList *p,*pre,*q;
p=L->next->next;
if(p!=NULL)
{
L->next->next=NULL;
while(p!=NULL)
{
q=L->next;
pre=L;
while(pre->next!=NULL && pre->next->data.salary<p->data.salary)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=q;
}
}
printf(" 提示:按salary递增排序完毕\n");
}
void DispEmp(EmpList *L)
{
EmpList *p=L->next;
if(p==NULL)
printf(" 提示:没有任何职工记录");
else
{
printf(" 职工号 姓名 部门号 工资\n");
printf(" ----------------------------------------\n");
while(p!=NULL)
{
printf(" %d, %s, %d, %f\n",p->data.no,p->data.name,p->data.depno,p->data.salary);
p=p->next;
}
printf(" ----------------------------------------\n");
}
}
int main()
{
EmpList *L;
int sel;
printf("由emp.dat文件建立职工单链表L\n");
ReadFile(L);
do
{
printf(">1:添加 2:显示 3:按职工号排序 4:按部门号排序 5:按工资排序\n");
printf(">6:删除 9:全删 0:退出 请选择:");
scanf("%d",&sel);
switch(sel)
{
case 9:DelAll(L);break;
case 1:InputEmp(L);break;
case 2:DispEmp(L);break;
case 3:Sortno(L);break;
case 4:Sortdepno(L);break;
case 5:Sortsalary(L);break;
case 6:DelEmp(L);break;
}
}while(sel!=0);
SaveFile(L);
return 1;
}
职工信息的综合运算
最新推荐文章于 2024-01-06 22:07:22 发布
本文介绍了使用C++编写的员工数据管理系统,包括读写文件、添加、删除、排序及显示功能。通过DelAll函数清空数据,ReadFile从emp.dat中读取,WriteFile保存数据,InputEmp添加新员工,DelEmp删除指定员工,Sort*函数按不同字段排序,DispEmp显示所有员工信息。
摘要由CSDN通过智能技术生成