1.从键盘输入n名职工的信息包括(职工姓名、职工工号、性别、年龄、住址、工资、健康状况、文化程度)保存至磁盘文件"employee"。
2.从磁盘文件"employee"中读取职工姓名、工资的信息保存至磁盘文件"employee_wages"。
3.从磁盘文件"employee_wages"中删除一名职工信息,存回磁盘文件"employee_wages"。
1.声明结构体类型
struct Employeedata//声明结构体类型 struct Employeedata
{
char name[20];//姓名
int num;//工号
char sex;//性别
int age;//年龄
char addr[30];//住址
float wages;//工资
char health;//健康状况
char level[20]; //文化程度
};
struct Employee//声明结构体类型 struct Employee
{
struct Employeedata data; //data为 struct Employeedata类型
struct Employee *next; //结构体指针用于指向下一结点
};
2.用动态链表存储每位职工信息
定义结构体指针head、p1、p2,利用malloc开辟sizeof(struct Employee)大小的空间。
struct Employee *head,*p1,*p2;//定义结构体变量p1、p2、head
p2=p1=(struct Employee *)malloc(sizeof(struct Employee));//p1、p2、指向新开辟的结点位置
从键盘输入结点信息(职工姓名、职工工号、性别、年龄、住址、工资、健康状况、文化程度),N为链表结点个数初值为0,每创建一个结点,N值加1。如果当前结点为头结点,则头指针指向该结点;不为头结点时,将结点成员next指向新开辟的结点。结构体指针p2也指向新开辟的结点。不断用p1开辟新的结点,若当前结点为最后一个结点时,将NULL赋给结构体成员next。
gets(p1->data.name);//输入姓名
scanf("%d",&p1->data.num);//输入工号
scanf("%c",&p1->data.sex);//输入性别
scanf("%d",&p1->data.age);//输入年龄
gets(p1->data.addr);//输入住址
scanf("%f",&p1->data.wages);//输入工资
scanf("%c",&p1->data.health);//输入健康状况
gets(p1->data.level);//输入文化程度
N=N+1; //结点数加1
if(N==1) head=p1;//头指针指向新开辟的结点
else p2->next=p1;//结点成员next指向新开辟的结点
p2=p1; //将p1赋给p2 ,p2也指向新开辟的结点
p2->next=NULL;//最后一个结点,NULL赋给结构体成员next
3.将职工信息保存至文件"employee"
定义结构体指针,指向链表表头。
struct Employee *p;//定义结构体指针
p=head;//p指向链表表头
每次从地址p开始的存储区写长度为sizeof(struct Employeedata)的数据到文件中,直至表尾。
do
{
fwrite(p,sizeof(struct Employeedata),1,fp);
p=p->next;
}while(p!=NULL);
4.从文件"employee"中读取职工姓名、工资的信息保存至文件"employee_wages"
定义结构体指针,指向链表表头。
struct Employee *p;//定义结构体指针
p=head;//p指向链表表头
每次将链表结点中职工姓名、职工工资信息写入文件,直至表尾。
do
{
fprintf(fp,"%-20s%.2f\n",p->data.name,p->data.wages);//写入职工姓名、工资到文件
p=p->next;//p指向下一结点
}while(p!=NULL);
5.从文件"employee_wages"删去一名职工信息存回文件employee_wages
声明结构体类型,定义结构体数组
struct Employee_wages//声明结构体类型 struct Employee_wages
{
char name[20];//职工姓名
float wages;//工资
};
struct Employee_wages wag[N];//定义结构体数组
从文件employee_wages读取职工信息存入结构体数组
for(i=0;i<N;i++)
fscanf(fp,"%s%f",wag[i].name,&wag[i].wages);//从文件输入职工姓名、工资到结构体数组元素
从键盘输入删除职工的姓名,与存入结构体数组的职工姓名比较,判断是否写入文件employee_wages
scanf("%s",name);//输入删除职工的姓名
for(i=0;i<N;i++)
{
if(strcmp(name,wag[i].name)==0)continue;//如果相同跳过本次循环
else
fprintf(fp,"%-20s%.2f\n",wag[i].name,wag[i].wages);//如果不同写入原文件
}
注:以上仅为部分代码,具体代码已以文本的形式上传,用户可以自行下载。
6.运行结果
1.运行界面
2.输入职工信息保存到文件employee
3.从文件employee提取职工姓名、工资信息保存到文件employee_wages
4.从文件employee_wages中删去一名职工信息