数据结构作业

  1. 用单链表实现某公司职工管理相关操作。其中,每个职工记录包括:职工编号、姓名、部门号、工资数信息。
  1. 建立一个职工信息的带头结点的单链表L。
  2. 增加一个职工记录。
  3. 显示所有职工记录。
  4. 按编号对所有职工记录进行递增排序。
  5. 按部门号对所有职工记录进行递增排序,若部门号相同,则按职工编号递增排序。
  6. 删除指定职工号的职工记录。
  7. 将单链表L中的所有职工记录存储到某个文本文件中。

 代码实现:

#include
#include
#include
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<> 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;
}

你可能感兴趣的:(数据结构)