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

职工信息的综合运算

单链表 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值