- 用单链表实现某公司职工管理相关操作。其中,每个职工记录包括:职工编号、姓名、部门号、工资数信息。
- 建立一个职工信息的带头结点的单链表L。
- 增加一个职工记录。
- 显示所有职工记录。
- 按编号对所有职工记录进行递增排序。
- 按部门号对所有职工记录进行递增排序,若部门号相同,则按职工编号递增排序。
- 删除指定职工号的职工记录。
- 将单链表L中的所有职工记录存储到某个文本文件中。
代码实现:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
typedef struct Worker {
string ID;
string name;
string department_num;
string salary;
}Worker;
typedef struct StuList {
Worker* W;
StuList* next;
}StuList, * linkList;
//(1)建立一个职工信息的带头结点的单链表L
int IniList_StuList(linkList& L) {
L = new StuList;
if (!L) {
cout << "内存空间分配失败!" << endl;
exit(-2);
}
L->next = NULL;
return 1;
}
//(2)增加一个职工记录。
void buildL(StuList* L) {
int i = 1;
while (i==1) {
StuList* p = new StuList;
if (!p) {
cout << "内存空间分配失败!" << endl;
exit(-2);
}
Worker* s = new Worker;
if (!s) {
cout << "内存空间分配失败!" << endl;
exit(-2);
}
cout << "请输入员工编号: ";
cin >> s->ID;
cout << "请输入员工姓名: ";
cin >> s->name;
cout << "请输入员工部门号: ";
cin >> s->department_num;
cout << "请输入员工工资数: ";
cin >> s->salary;
cout << "成功录入信息!" << endl;
cout << "是否继续录入:(1) 继续录入 (2)取消录入: ";
cin >> i;
p->W = s;
p->next = L->next;
L->next = p;
}
}
//(3)显示所有职工记录。
void showList(StuList* L) {
StuList* p = L->next;
//cout << "职工编号" << "\t" << "职工姓名" << "\t" << "部门号" << "\t" << "工资数" << endl;--如何对齐
while (p != NULL) {
cout << p->W->ID << "\t" << p->W->name << "\t" << p->W->department_num << "\t" << p->W->salary << endl;
p = p->next;
}
}
//(4)按编号对所有职工记录进行递增排序。
//(4-1)计算表长
int ListLength(StuList* L) {
StuList* p;
p = L->next;
int i = 0;
while (p) {
i++;
p = p->next;
}
return i;
}
void arrange1(StuList* L) {
StuList* p1 = L->next;
StuList* p2=p1->next;
StuList* temp = new StuList;
if (!temp) {
cout << "内存空间分配失败!" << endl;
exit(-2);
}
while (p1 != NULL) {
p2 = p1->next;
while (p2 != NULL) {
if (p1->W->ID > p2->W->ID) {
temp->W = p1->W;
p1->W = p2->W;
p2->W = temp->W;
}
p2 = p2->next;
}
p1 = p1->next;
}
}
//(5)按部门号对所有职工记录进行递增排序,若部门号相同,则按职工编号递增排序。
void arrange2(StuList* L) {
StuList* p1 = L->next;
StuList* p2 = p1->next;
StuList* temp = new StuList;
if (!temp) {
cout << "内存空间分配失败!" << endl;
exit(-2);
}
while (p1 != NULL) {
p2 = p1->next;
while (p2 != NULL) {
if (p1->W->department_num > p2->W->department_num) {
temp->W = p1->W;
p1->W = p2->W;
p2->W = temp->W;
}
else if (p1->W->department_num == p2->W->department_num && p1->W->ID > p2->W->ID) {
temp->W = p1->W;
p1->W = p2->W;
p2->W = temp->W;
}
p2 = p2->next;
}
p1 = p1->next;
}
}
//(6)删除指定职工号的职工记录。
int deleteL(StuList* L) {
StuList* p = L;
string ID;
cout << "请输入需要删除职工的职工号: ";
cin >> ID;
while (p->next->W->ID != ID && p->next) {
p = p->next;
}
if (!p->next) {
cout << "没有指定员工号,删除失败!";
return -1;
}
StuList* p1 = p->next;
p->next = p->next->next;
delete p1;
return 1;
}
//(7)将单链表L中的所有职工记录存储到某个文本文件中。
void write_string_to_file_append(const string& file_string, StuList *L) {
ofstream OsWrite(file_string, ofstream::out);
//OsWrite << str;
//OsWrite << endl;
StuList* p = L->next;
OsWrite << "职工编号" << "\t" << "职工姓名" << "\t" << "部门号" << "\t" << "工资数" << endl;
while (p) {
OsWrite << p->W->ID << "\t" << p->W->name << "\t" << p->W->department_num << "\t" << p->W->salary;
OsWrite << endl;
p = p->next;
}
OsWrite.close();
}
//(8)菜单
void menu(StuList* L) {
cout << "*****************************************" << endl;
cout << "********** 某公司职工管理系统 ***********" << endl;
cout << "*****************************************" << endl<<endl;
int i=1;
while (i) {
cout << "**********请输入需要执行的操作:**********" << endl;
cout << "(1)建立一个职工信息的带头结点的单链表L*" << endl;
cout << "(2)增加一个职工记录********************" << endl;
cout << "(3)显示所有职工记录********************" << endl;
cout << "(4)按编号对所有职工记录进行递增排序。**" << endl;
cout << "(5)按部门号对所有职工记录进行递增排序,若部门号相同,则按职工编号递增排序。" << endl;
cout << "(6)删除指定职工号的职工记录。**********" << endl;
cout << "(7)将单链表L中的所有职工记录存储到某个文本文件中。" << endl;
cout << "(8)退出系统****************************" << endl;
cout << "*****************************************" << endl;
cin >> i;
switch (i) {
case 1:
IniList_StuList(L);
break;
case 2:
buildL(L);
break;
case 3:
showList(L);
break;
case 4:
arrange1(L);
break;
case 5:
arrange2(L);
break;
case 6:
deleteL(L);
break;
case 7:
write_string_to_file_append(string("file01.txt"), L);
break;
case 8:
exit(0);
default:
break;
}
}
}
int main() {
StuList* L;
IniList_StuList(L);
menu(L);
return 0;
}