职工信息的综合运算
单链表 c++ 数据结构 实现职工信息的综合运算
#include"stdio.h"
#include <iostream>
#include <malloc.h>
#include<windows.h>
using namespace std;
typedef struct employee
{
int no;
char name[10];
int depno;
float salary;
} Worker;
typedef struct node
{
Worker data;
struct node *next;
} WorkerList;
static void destroy_employee( WorkerList *&L)
{
WorkerList *pre = L;
WorkerList *p = pre->next;
while(p != NULL)
{
free(pre);
pre = p;
p = p->next;
}
free(pre);
}
static void delete_all( WorkerList *&L)
{
FILE *fp = NULL;
fp = fopen("emp.dat", "wb");
if(fp == NULL)
{
cout<<"不能打开职工文件\n\n\n";
return;
}
fclose(fp);
destroy_employee(L);
L = ( WorkerList *)malloc(sizeof( WorkerList));
L->next = NULL;
cout<<"职工数据清除完毕\n\n\n";
}
static void read_file( WorkerList *&L)
{
FILE *fp;
Worker emp;
WorkerList *p;
WorkerList *r;
int n = 0;
L = ( WorkerList *)malloc(sizeof( WorkerList));
r = L;
if((fp = fopen("emp.dat", "rb")) == NULL)
{
if((fp = fopen("emp.dat", "wb")) == NULL)
{
cout<<"不能创建emp.dat文件\n\n\n";
}
}
else
{
while(fread(&emp, sizeof( Worker), 1, fp) == 1)
{
p = ( WorkerList *)malloc(sizeof( WorkerList));
p->data = emp;
r->next = p;
r = p;
n++;
}
}
r->next = NULL;
cout<<"职工单链表L建立完毕,有"<<n<<"个记录\n";
fclose(fp);
}
static void display_employee( WorkerList *L)
{
WorkerList *p = L->next;
if(p == NULL)
{
cout<<"没有任何职工记录\n";
}
else
{
cout<<" 职工号 姓名 部门号 薪水\n";
printf(" ----------------------------------------------\n");
while(p != NULL)
{
printf(" %3d %10s %-8d %7.2f\n", p->data.no, p->data.name, p->data.depno, p->data.salary);
p = p->next;
}
cout<<" ----------------------------------------------\n\n\n";
}
}
static void add_employee( WorkerList *&L)
{
Worker p;
WorkerList *s;
cout<<" >>输入职工号 输入姓名 部门号 薪水:\n ";
cin>>p.no>>p.name>>p.depno>>p.salary;
s = ( WorkerList *)malloc(sizeof( WorkerList));
s->data = p;
s->next = L->next;
L->next = s;
cout<<"添加成功\n\n\n";
}
static void delete_employee( WorkerList *&L)
{
WorkerList *pre = L;
WorkerList *p = L->next;
int no;
cout<<" >>输入职工号:";
cin>>no;
while(p != NULL && p->data.no != no)
{
pre = p;
p = p->next;
}
if(p == NULL)
cout<<"指定的职工记录不存在\n\n\n";
else
{
pre->next = p->next;
free(p);
cout<<"删除成功\n\n\n";
}
}
static void sort_no( WorkerList *&L)
{
WorkerList *p;
WorkerList *pre;
WorkerList *q;
p = L->next->next;
if(p != NULL)
{
L->next->next = NULL;
while(p != NULL)
{
q = p->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;
}
}
cout<<"按no递增排序完毕\n\n\n";
}
static void save_file( WorkerList *L)
{
WorkerList *p = L->next;
FILE *fp = NULL;
int n = 0;
fp = fopen("emp.dat", "wb");
if(fp == NULL)
{
cout<<"不能创建文件emp.dat\n\n\n";
return;
}
while(p != NULL)
{
fwrite(&p->data, sizeof( Worker), 1, fp);
p = p->next;
n++;
}
fclose(fp);
destroy_employee(L);
if(n > 0)
{
cout<<endl<<n<<"个职工记录写入emp.dat文件\n\n\n";
}
else
{
cout<<"没有任何职工记录写入emp.dat文件\n\n\n";
}
}
static void sort_depno( WorkerList *&L)
{
WorkerList *p;
WorkerList *pre;
WorkerList *q;
p = L->next->next;
if(p != NULL)
{
L->next->next = NULL;
while(p != NULL)
{
q = p->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;
}
}
cout<<"按depno递增排序完毕\n\n\n";
}
static void sort_salary( WorkerList *&L)
{
WorkerList *p;
WorkerList *pre;
WorkerList *q;
p = L->next->next;
if(p != NULL)
{
L->next->next = NULL;
while(p != NULL)
{
q = p->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;
}
}
cout<<"按salary递增排序完毕\n\n\n";
}
int main(int argc, char *argv[])
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 100);
system("color f100");
WorkerList *L;
int change;
cout<<"1:在emp.dat文件读出职工记录,并建立一个带头结点的单链表L\n";
read_file(L);
do
{
cout<<"\n\n2:输入一个职工记录\n3:显示所有职工记录\n4:按编号no对所有职工记录进行递增排序\n";
cout<<"5:按部门号depno对所有职工记录进行递增排序\n6:按工资数salary对所有职工记录进行递增排序\n";
cout<<"7:删除指定职工号的职工记录\n8:删除职工文件中的全部记录\n0:退出\n";
cout<<"选择序号:";
cin>>change;
switch(change)
{
case 2:add_employee(L);break;
case 3:display_employee(L);break;
case 4:sort_no(L);break;
case 5:sort_depno(L);break;
case 6:sort_salary(L);break;
case 7:delete_employee(L);break;
case 8:delete_all(L);break;
}
}while(change != 0);
cout<<"9.将单链表L中的所有职工记录存储到职工文件emp.dat";
save_file(L);
return 0;
}