数据结构课程设计
题目要求: 利用单链表实现职工管理系统,设有职工文件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;
}
好好学习,天天向上,一起学习哈!😀