设备信息管理系统(链表结构)
#include <iostream>
#include <string>
#include <fstream>
#include <unordered_map>
using namespace std;
// 设备信息结构体
struct Device {
int deviceNumber;//设备号
string deviceName;//设备名称
string recipient;//领用人
string department;//所属部门
int quantity;//数量
string purchaseDate;//购买时间
double price;//价格
Device* next;
};
// 设备管理类
class DeviceManager {
private:
Device* head;
public:
// 构造函数
DeviceManager() {
head = nullptr;
}
// 析构函数
~DeviceManager() {
clear();
}
// 添加设备信息
void addDevice(int deviceNumber, const string& deviceName, const string& recipient, const string& department,
int quantity, const string& purchaseDate, double price) {
Device* newDevice = new Device;
newDevice->deviceNumber = deviceNumber;
newDevice->deviceName = deviceName;
newDevice->recipient = recipient;
newDevice->department = department;
newDevice->quantity = quantity;
newDevice->purchaseDate = purchaseDate;
newDevice->price = price;
newDevice->next = nullptr;
if (head == nullptr) {
head = newDevice;
}
else {
Device* current = head;
while (current->next != nullptr) {
current = current->next;
}
current->next = newDevice;
}
}
// 显示设备信息
void displayDevices() {
if (head == nullptr) {
cout << "设备信息为空" << endl;
return;
}
Device* current = head;
while (current != nullptr) {
cout << "设备号: " << current->deviceNumber << endl;
cout << "设备名称: " << current->deviceName << endl;
cout << "领用人: " << current->recipient << endl;
cout << "所属部门: " << current->department << endl;
cout << "数量: " << current->quantity << endl;
cout << "购买时间: " << current->purchaseDate << endl;
cout << "价格: " << current->price << endl;
cout << "-------------------------------------" << endl;
current = current->next;
}
}
// 修改设备信息
void modifyDevice(int deviceNumber, const string& deviceName, const string& recipient, const string& department,
int quantity, const string& purchaseDate, double price) {
if (head == nullptr) {
cout << "设备信息为空" << endl;
return;
}
Device* current = head;
while (current != nullptr) {
if (current->deviceNumber == deviceNumber) {
current->deviceName = deviceName;
current->recipient = recipient;
current->department = department;
current->quantity = quantity;
current->purchaseDate = purchaseDate;
current->price = price;
cout << "设备信息修改成功" << endl;
return;
}
current = current->next;
}
cout << "找不到指定设备号的设备" << endl;
}
// 删除设备信息
void deleteDevice(int deviceNumber) {
if (head == nullptr) {
cout << "设备信息为空" << endl;
return;
}
if (head->deviceNumber == deviceNumber) {
Device* temp = head;
head = head->next;
delete temp;
cout << "设备信息删除成功" << endl;
return;
}
Device* current = head;
while (current->next != nullptr) {
if (current->next->deviceNumber == deviceNumber) {
Device* temp = current->next;
current->next = current->next->next;
delete temp;
cout << "设备信息删除成功" << endl;
return;
}
current = current->next;
}
cout << "找不到指定设备号的设备" << endl;
}
// 计算设备总金额
double calculateTotalValue() {
double totalValue = 0.0;
Device* current = head;
while (current != nullptr) {
totalValue += current->price * current->quantity;
current = current->next;
}
return totalValue;
}
// 按设备种类进行分类
void classifyByDeviceType() {
// 实现设备按种类分类的代码
cout << "按设备种类进行分类" << endl;
unordered_map<string, Device*> deviceNameMap; // 哈希表,用于存储每个部门对应的设备信息
// 遍历链表,将设备按照所属部门分类存储到哈希表中
Device* current = head;
while (current != NULL) {
string deviceName = current->deviceName;
if (deviceNameMap.find(deviceName) == deviceNameMap.end()) {
// 如果当前部门不在哈希表中,新建一个链表节点,并将当前设备添加到链表中
Device* newNode = new Device();
*newNode = *current;
newNode->next = NULL;
deviceNameMap[deviceName] = newNode;
}
else {
// 如果当前部门已经在哈希表中,将当前设备添加到该部门对应的链表末尾
Device* lastNode = deviceNameMap[deviceName];
while (lastNode->next != NULL) {
lastNode = lastNode->next;
}
Device* newNode = new Device();
*newNode = *current;
newNode->next = NULL;
lastNode->next = newNode;
}
current = current->next;
}
// 遍历哈希表,打印输出分类后的设备信息
for (auto it = deviceNameMap.begin(); it != deviceNameMap.end(); ++it) {
string deviceName = it->first;
Device* deviceList = it->second;
cout << "部门:" << deviceName << endl;
Device* currentDevice = deviceList;
while (currentDevice != NULL) {
cout << "设备号:" << currentDevice->deviceNumber << endl;
cout << "设备名称:" << currentDevice->deviceName << endl;
cout << "领用人:" << currentDevice->recipient << endl;
cout << "数量:" << currentDevice->quantity << endl;
cout << "购买时间:" << currentDevice->purchaseDate << endl;
cout << "价格:" << currentDevice->price << endl;
cout << endl;
currentDevice = currentDevice->next;
}
// 释放每个部门链表的内存
while (deviceList != NULL) {
Device* nextDevice = deviceList->next;
delete deviceList;
deviceList = nextDevice;
}
}
}
// 按所属部门进行分类
void classifyByDepartment() {
// 实现设备按所属部门分类的代码
cout << "按所属部门进行分类" << endl;
unordered_map<string, Device*> departmentMap; // 哈希表,用于存储每个部门对应的设备信息
// 遍历链表,将设备按照所属部门分类存储到哈希表中
Device* current = head;
while (current != NULL) {
string department = current->department;
if (departmentMap.find(department) == departmentMap.end()) {
// 如果当前部门不在哈希表中,新建一个链表节点,并将当前设备添加到链表中
Device* newNode = new Device();
*newNode = *current;
newNode->next = NULL;
departmentMap[department] = newNode;
}
else {
// 如果当前部门已经在哈希表中,将当前设备添加到该部门对应的链表末尾
Device* lastNode = departmentMap[department];
while (lastNode->next != NULL) {
lastNode = lastNode->next;
}
Device* newNode = new Device();
*newNode = *current;
newNode->next = NULL;
lastNode->next = newNode;
}
current = current->next;
}
// 遍历哈希表,打印输出分类后的设备信息
for (auto it = departmentMap.begin(); it != departmentMap.end(); ++it) {
string department = it->first;
Device* deviceList = it->second;
cout << "部门:" << department << endl;
Device* currentDevice = deviceList;
while (currentDevice != NULL) {
cout << "设备号:" << currentDevice->deviceNumber << endl;
cout << "设备名称:" << currentDevice->deviceName << endl;
cout << "领用人:" << currentDevice->recipient << endl;
cout << "数量:" << currentDevice->quantity << endl;
cout << "购买时间:" << currentDevice->purchaseDate << endl;
cout << "价格:" << currentDevice->price << endl;
cout << endl;
currentDevice = currentDevice->next;
}
// 释放每个部门链表的内存
while (deviceList != NULL) {
Device* nextDevice = deviceList->next;
delete deviceList;
deviceList = nextDevice;
}
}
}
// 保存设备信息到文件
void saveToFile(const string& filename) {
ofstream file(filename);
if (!file) {
cout << "无法打开文件" << endl;
return;
}
Device* current = head;
while (current != nullptr) {
file << current->deviceNumber << "," << current->deviceName << "," << current->recipient << ","
<< current->department << "," << current->quantity << "," << current->purchaseDate << ","
<< current->price << endl;
current = current->next;
}
file.close();
cout << "设备信息已保存到文件" << endl;
}
// 从文件中加载设备信息
void loadFromFile(const string& filename) {
clear();
ifstream file(filename);
if (!file) {
cout << "无法打开文件" << endl;
return;
}
int deviceNumber, quantity;
string deviceName, recipient, department, purchaseDate;
double price;
char comma;
while (file >> deviceNumber >> comma && getline(file, deviceName, ',') && getline(file, recipient, ',')
&& getline(file, department, ',') && file >> quantity >> comma && getline(file, purchaseDate, ',')
&& file >> price) {
addDevice(deviceNumber, deviceName, recipient, department, quantity, purchaseDate, price);
}
file.close();
cout << "设备信息已从文件加载" << endl;
}
// 清空设备信息
void clear() {
Device* current = head;
while (current != nullptr) {
Device* temp = current;
current = current->next;
delete temp;
}
head = nullptr;
}
};
// 主菜单界面
void showMainMenu() {
cout << "设备信息管理系统" << endl;
cout << "1.添加设备信息" << endl;
cout << "2.显示设备信息" << endl;
cout << "3.修改设备信息" << endl;
cout << "4.删除设备信息" << endl;
cout << "5.计算设备总金额" << endl;
cout << "6.按照设备种类进行分类" << endl;
cout << "7.按照设备所属部门进行分类" << endl;
cout << "8.保存设备信息到文件" << endl;
cout << "9.从文件加载设备信息" << endl;
cout << "0.退出系统" << endl;
cout << "请选择操作: ";
}
int main() {
DeviceManager manager;
int choice;
do {
showMainMenu();
cin >> choice;
switch (choice) {
case 1: {
int deviceNumber, quantity;
string deviceName, recipient, department, purchaseDate;
double price;
cout << "请输入设备号: ";
cin >> deviceNumber;
cout << "请输入设备名称: ";
cin.ignore();
getline(cin, deviceName);
cout << "请输入领用人: ";
getline(cin, recipient);
cout << "请输入所属部门: ";
getline(cin, department);
cout << "请输入数量: ";
cin >> quantity;
cout << "请输入购买时间: ";
cin.ignore();
getline(cin, purchaseDate);
cout << "请输入价格: ";
cin >> price;
manager.addDevice(deviceNumber, deviceName, recipient, department, quantity, purchaseDate, price);
cout << "设备信息添加成功" << endl;
break;
}
case 2:
manager.displayDevices();
break;
case 3: {
int deviceNumber, quantity;
string deviceName, recipient, department, purchaseDate;
double price;
cout << "请输入要修改的设备号: ";
cin >> deviceNumber;
cout << "请输入设备名称: ";
cin.ignore();
getline(cin, deviceName);
cout << "请输入领用人: ";
getline(cin, recipient);
cout << "请输入所属部门: ";
getline(cin, department);
cout << "请输入数量: ";
cin >> quantity;
cout << "请输入购买时间: ";
cin.ignore();
getline(cin, purchaseDate);
cout << "请输入价格: ";
cin >> price;
manager.modifyDevice(deviceNumber, deviceName, recipient, department, quantity, purchaseDate, price);
break;
}
case 4: {
int deviceNumber;
cout << "请输入要删除的设备号: ";
cin >> deviceNumber;
manager.deleteDevice(deviceNumber);
break;
}
case 5: {
double totalValue = manager.calculateTotalValue();
cout << "设备总金额: " << totalValue << endl;
break;
}
case 6:
manager.classifyByDeviceType();
break;
case 7:
manager.classifyByDepartment();
break;
case 8: {
string filename;
cout << "请输入要保存的文件名: ";
cin >> filename;
manager.saveToFile(filename);
break;
}
case 9: {
string filename;
cout << "请输入要加载的文件名: ";
cin >> filename;
manager.loadFromFile(filename);
break;
}
case 0:
cout << "感谢使用设备信息管理系统,再见!" << endl;
break;
default:
cout << "无效的选择" << endl;
break;
}
cout << endl;
} while (choice != 0);
return 0;
}