职工信息的综合运算

本文介绍了使用C++编写的员工数据管理系统,包括读写文件、添加、删除、排序及显示功能。通过DelAll函数清空数据,ReadFile从emp.dat中读取,WriteFile保存数据,InputEmp添加新员工,DelEmp删除指定员工,Sort*函数按不同字段排序,DispEmp显示所有员工信息。
摘要由CSDN通过智能技术生成
#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;
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值