数据结构 职工信息的综合运算

职工信息的综合运算

单链表 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;
}
  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您画一份职工信息综合运算流程图。 首先,我们需要明确一下任务的要求和数据的结构。假设我们需要对一批职工信息进行处理,每个职工信息包括姓名、工号、部门、基本工资、津贴、实际工资等字段。我们可以用一个员工类来表示这些信息,代码如下: ``` class Employee: def __init__(self, name, id, department, salary, allowance): self.name = name self.id = id self.department = department self.salary = salary self.allowance = allowance self.total_salary = salary + allowance ``` 接下来,我们可以使用一个列表来存储所有的职工信息。假设我们已经将数据读入到了employees列表中。 接下来,我们需要进行一些综合运算,例如计算所有职工的实际工资总和、找出某个部门的所有职工、找出工资最高的职工等等。我们可以使用循环和条件语句来实现这些运算。 以下是一个职工信息综合运算的流程图,其中包括了计算所有职工的实际工资总和、找出某个部门的所有职工、找出工资最高的职工这三个运算实现: ![职工信息综合运算流程图](https://i.loli.net/2021/08/24/x8GJtT5M6q9Y3dn.png) 在实现时,我们可以根据具体的需求来编写不同的函数,并在主程序中调用这些函数。例如,计算实际工资总和的函数可以按照以下方式实现: ``` def calculate_total_salary(employees): total_salary = 0 for employee in employees: total_salary += employee.total_salary return total_salary ``` 找出某个部门的所有职工的函数可以按照以下方式实现: ``` def find_employees_by_department(employees, department): result = [] for employee in employees: if employee.department == department: result.append(employee) return result ``` 找出工资最高的职工的函数可以按照以下方式实现: ``` def find_employee_with_highest_salary(employees): highest_salary = 0 highest_salary_employee = None for employee in employees: if employee.total_salary > highest_salary: highest_salary = employee.total_salary highest_salary_employee = employee return highest_salary_employee ``` 在主程序中,我们可以按照以下方式调用这些函数: ``` total_salary = calculate_total_salary(employees) employees_in_sales_department = find_employees_by_department(employees, "Sales") employee_with_highest_salary = find_employee_with_highest_salary(employees) ``` 这样,我们就完成了职工信息综合运算的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值