数据结构--员工管理系统--链表实现

数据结构课程设计

题目要求: 利用单链表实现职工管理系统,设有职工文件emp.dat,建立单链表,数据包括职工编号(no), 姓名(name),部门(depno),工资(salary)。且具有排序,文件读写,删除等功能。 -- 题目来源(数据结构教程-第五版-李春葆-P.77)da

代码如下

#include<iostream>
#include<windows.h>
#include<fstream>
#include<string>
#include<stdlib.h>
#include<time.h>
using namespace std;


int people_num = 0;


typedef struct employee
{
    int no;
    string name;
    int depno;
    int salary;

    struct employee *pnext;
}Emp;

void Initial_list( Emp *&L )
{   
    L = new Emp;
    L->pnext = nullptr;
}

void Create_List( Emp *& L )
{
    Emp *Root = L;
    fstream fs( "f1.dat", ios::in );

    string NO;
    string DEPNO;
    string NAME;
    string SALARY;

    while( !fs.eof() )
    {
        if( !fs )
        {
            cout << "Create() 打开文件错误 " << endl;
            return ;
        }
        else
        {
            Emp *node;
            node = new Emp;

            fs >> NO;
            fs >> NAME;
            fs >> DEPNO;
            fs >> SALARY;

            node->no = atoi( NO.c_str() );
            node->name =  NAME;
            node->depno = atoi( DEPNO.c_str() );
            node->salary = atoi( SALARY.c_str() );

            while( L->pnext != nullptr )
            {
                L = L->pnext;
            }
            L->pnext = node;
            node->pnext = nullptr;
            people_num++;

            //L  = Root;
        
        }
    }
    L = Root;
    fs.close();
    cout << "由文件创建链表成功" << endl;

}

void Add_List( Emp *& L, int no, string name, int depno, int salary )
{
    Emp *Root = L;
    Emp *node;
    node = new Emp;

    node->no = no;
    node->name = name;
    node->depno = depno;
    node->salary = salary;

    //fstream fs("f1.dat", ios::out );
    //fs << no << "\t" << name << "\t" << depno << "\t" << salary << endl;
    
    while( L->pnext != nullptr )
    {
        L = L->pnext;
    }
    L->pnext =  node;
    node->pnext = nullptr;
    people_num++;
    L = Root;
}

void Sort_no( Emp *& L )
{
        cout << "Sort in no :  " << endl;
    Emp *Root = L;
    //L = L->pnext;

    for( int i = 0; i < people_num; i++ )
    {
        //L = L->pnext;        
        while( L->pnext->pnext != nullptr )     //如果有下一个
        {
            if( L->pnext->no > L->pnext->pnext->no )   //当前和下一个的编号进行比较
            {
                Emp *pt_one;  //保存当前
                Emp *pt_two;  //保存下一个的后续
                pt_one = L->pnext;
                pt_two = L->pnext->pnext->pnext;

                L->pnext = L->pnext->pnext;
                L->pnext->pnext = pt_one;

                L->pnext->pnext->pnext = pt_two;  
            }
            L = L->pnext;
        }
        L = Root;     
    }
}

void Sort_depno( Emp *& L )
{
    Emp *Root = L;
    //L = L->pnext;

    for( int i = 0; i < people_num; i++ )
    {
        //L = L->pnext;        
        while( L->pnext->pnext != nullptr )     //如果有下一个
        {
            if( L->pnext->depno > L->pnext->pnext->depno )   //当前和下一个的编号进行比较
            {
                Emp *pt_one;  //保存当前
                Emp *pt_two;  //保存下一个的后续
                pt_one = L->pnext;
                pt_two = L->pnext->pnext->pnext;

                L->pnext = L->pnext->pnext;
                L->pnext->pnext = pt_one;

                L->pnext->pnext->pnext = pt_two;  
            }
            L = L->pnext;
        }
        L = Root;     
    }
}

void Sort_salary( Emp *& L )
{

    Emp *Root = L;
    //L = L->pnext;

    for( int i = 0; i < people_num; i++ )
    {
        //L = L->pnext;        
        while( L->pnext->pnext != nullptr )     //如果有下一个
        {
            if( L->pnext->salary > L->pnext->pnext->salary )   //当前和下一个的编号进行比较
            {
                Emp *pt_one;  //保存当前
                Emp *pt_two;  //保存下一个的后续
                pt_one = L->pnext;
                pt_two = L->pnext->pnext->pnext;

                L->pnext = L->pnext->pnext;
                L->pnext->pnext = pt_one;

                L->pnext->pnext->pnext = pt_two;  
            }
            L = L->pnext;
        }
        L = Root;     
    }
}

void Delete_no( Emp *& L, int no )
{
    Emp *Root = L;
    while( L->pnext != nullptr )
    {
        if( L->pnext->no == no )
        {
            L->pnext = L->pnext->pnext;
            people_num--;
        }
        L = L->pnext;
    }
    L = Root;
}

void Delete_file( Emp *& L )
{

}

void Storage_file( Emp * L )
{
    cout << "文件保存 "<< endl;
    fstream fs("f1.dat", ios::out | ios::in );
    
    while( L->pnext != nullptr )
    {
        fs << L->pnext->no << "\t" << L->pnext->name << "\t" << L->pnext->depno << "\t" << L->pnext->salary;
        if( L->pnext->pnext != nullptr )
        {
            fs << endl;
        }
        L = L->pnext;
    }
    fs.close();

    cout << "文件保存成功 " << endl;
}

void Dispaly_List( Emp *L )
{
    int count = 0;
    if( L != nullptr )
    {
        L = L->pnext;
        while( L != nullptr )
        {
            cout << "第 " << count + 1 <<" 个员工 : " << "编号 " << L->no <<" 姓名 " << L->name << " 部门号 " << L->depno <<" 工资数 " << L->salary << endl;
            L = L->pnext;
            count++;
        }
    }
}


int main()
{
    Emp *L;

    Initial_list( L );
    Create_List( L );   //由文件创建

    cout << "由文件创建的链表如下 : " << endl;
    Dispaly_List( L );

    //  Add_List( L, 2, "闪电法师", 15, 8000 );
    //  Add_List( L, 1, "掘地矿工", 13, 7000 );

    cout << "调用函数添加如下 : " << endl;
     Add_List( L, 3, "暗夜女巫", 16, 5000 );
     Add_List( L, 5, "黑暗王子", 13, 6000 );
     Add_List( L, 4, "小蝙蝠", 11,  4000);
     Add_List( L, 0, "小雪人", 12, 9000 );


    Dispaly_List( L );

    cout << "按编号排序如下 : " << endl;
    Sort_no( L );
    Dispaly_List( L );

    Sort_depno( L );
    cout << "按部门排序如下 : " << endl;
    Dispaly_List( L );

    Sort_salary( L );
    cout << "按工资排序如下 : " << endl;
    Dispaly_List( L );

    Delete_no( L, 4 );
    cout << "删除编号为 4 的员工,显示如下 : " << endl;
    Dispaly_List( L );



    Storage_file( L );

    
    fstream fs( "f1.dat", ios::out | ios::in );
    if( !fs )
    {
        cout << "main() 打开文件错误 " << endl;
    }
    fs.close();
    cout << endl;
    
    system("pause");
    return 0;
}

好好学习,天天向上,一起学习哈!😀

 

  • 6
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值