链表综合算法设计(c++数据结构)

这篇具有很好参考价值的文章主要介绍了链表综合算法设计(c++数据结构)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 文章来源地址https://www.toymoban.com/news/detail-785662.html

课程设计题目1--链表综合算法设计

一、设计内容
已知简单的人事信息系统中职工记录包含职工编号(no)、职工姓名(name)、部门名称(depname)、职称(title)和工资数(salary)等信息(可以增加其他信息),设计并完成一个简单的人事信息管理系统,要求完成但不限于以下功能:
(1)    增加一个职工信息;
(2)    显示所有职工信息;
(3)    按部门名称分类显示该部门所有职工信息;
(4)    按部门显示各部门职工工资总额;
(5)    删除职工信息(可以删除符合条件的一批记录)
(6)    按职称调整工资;
(7)    可自行增加功能(例如按职工编号排序等其他功能)
二、设计要求
(1)以菜单形式显示,主菜单包括(可以扩展)(1:增加职工信息 2:删除员工信息 3:查找职工信息 4:工资调整 5:统计分析  0:退出)相应的主菜单可以设计子菜单。(根据系统功能的多少评定成绩)
(2)提交设计报告,报告包括代码、设计思路(流程图)和实现界面截图等。

代码实现

#include <iostream>
#include <string>
using namespace std;
// 职工信息结构体
struct Employee {
    int no;
    string name;
    string depname;
    string title;
    double salary;
    Employee* next;
};
// 全局变量,链表头指针
Employee* head = nullptr;
// 操作函数声明
void addEmployee();
void displayAllEmployees();
void displayEmployeesByDepartment();
void displayDepartmentTotalSalary();
void deleteEmployee();
void adjustSalaryByTitle();
void menu();
// 增加一个职工信息
void addEmployee() {
    Employee* newEmployee = new Employee;
    cout << "请输入职工编号:";
    cin >> newEmployee->no;
    cout << "请输入职工姓名:";
    cin >> newEmployee->name;
    cout << "请输入部门名称:";
    cin >> newEmployee->depname;
    cout << "请输入职称:";
    cin >> newEmployee->title;
    cout << "请输入工资数:";
    cin >> newEmployee->salary;
    newEmployee->next = nullptr;
    if (head == nullptr) {
        head = newEmployee;
    }
    else {
        Employee* temp = head;
        while (temp->next != nullptr) {
            temp = temp->next;
        }
        temp->next = newEmployee;
    }
    cout << "职工信息添加成功!" << endl;
}
// 显示所有职工信息
void displayAllEmployees() {
    if (head == nullptr) {
        cout << "暂无职工信息!" << endl;
        return;
    }
    Employee* temp = head;
    cout << "所有职工信息:" << endl;
    while (temp != nullptr) {
        cout << "编号:" << temp->no << endl;
        cout << "姓名:" << temp->name << endl;
        cout << "部门:" << temp->depname << endl;
        cout << "职称:" << temp->title << endl;
        cout << "工资:" << temp->salary << endl;
        cout << "-------------------------" << endl;
        temp = temp->next;
    }
}
// 按部门名称分类显示该部门所有职工信息
void displayEmployeesByDepartment() {
    if (head == nullptr) {
        cout << "暂无职工信息!" << endl;
        return;
    }
    string department;
    cout << "请输入部门名称:";
    cin >> department;
    Employee* temp = head;
    bool found = false;
    cout << "部门" << department << "下的职工信息:" << endl;
    while (temp != nullptr) {
        if (temp->depname == department) {
            cout << "编号:" << temp->no << endl;
            cout << "姓名:" << temp->name << endl;
            cout << "职称:" << temp->title << endl;
            cout << "工资:" << temp->salary << endl;
            cout << "-------------------------" << endl;
            found = true;
        }
        temp = temp->next;
    }
    if (!found) {
        cout << "未找到部门" << department << "下的职工信息!" << endl;
    }
}
// 按部门显示各部门职工工资总额
void displayDepartmentTotalSalary() {
    if (head == nullptr) {
        cout << "暂无职工信息!" << endl;
        return;
    }
    // 使用一个数组来存储每个部门的工资总额
    const int MAX_DEPARTMENTS = 100;
    double departmentTotalSalary[MAX_DEPARTMENTS] = { 0.0 };
    Employee* temp = head;
    while (temp != nullptr) {
        departmentTotalSalary[temp->depname.length()] += temp->salary;
        temp = temp->next;
    }
    cout << "各部门职工工资总额:" << endl;
    for (int i = 0; i < MAX_DEPARTMENTS; i++) {
        if (departmentTotalSalary[i] > 0) {
            cout << "部门:" << i << " 工资总额:" << departmentTotalSalary[i] << endl;
        }
    }
}
// 删除职工信息
void deleteEmployee() {
    if (head == nullptr) {
        cout << "暂无职工信息!" << endl;
        return;
    }
    int employeeNo;
    cout << "请输入要删除的职工编号:";
    cin >> employeeNo;
    Employee* current = head;
    Employee* previous = nullptr;
    while (current != nullptr) {
        if (current->no == employeeNo) {
            if (previous == nullptr) {
                // 删除头节点
                head = current->next;
            }
            else {
                previous->next = current->next;
            }
            delete current;
            cout << "职工信息删除成功!" << endl;
            return;
        }
        previous = current;
        current = current->next;
    }
    cout << "未找到职工编号为" << employeeNo << "的记录!" << endl;
}
// 按职称调整工资
void adjustSalaryByTitle() {
    if (head == nullptr) {
        cout << "暂无职工信息!" << endl;
        return;
    }
    string jobTitle;
    cout << "请输入职称:";
    cin >> jobTitle;
    double salaryAdjustment;
    cout << "请输入工资调整金额:";
    cin >> salaryAdjustment;
    Employee* temp = head;
    bool found = false;
    while (temp != nullptr) {
        if (temp->title == jobTitle) {
            temp->salary += salaryAdjustment;
            found = true;
        }
        temp = temp->next;
    }
    if (found) {
        cout << "职称为" << jobTitle << "的职工工资调整成功!" << endl;
    }
    else {
        cout << "未找到职称为" << jobTitle << "的职工!" << endl;
    }
}
// 菜单
void menu() {
    int choice;
    do {
        cout << "-------------------------" << endl;
        cout << "1. 增加职工信息" << endl;
        cout << "2. 显示所有职工信息" << endl;
        cout << "3. 按部门分类显示职工信息" << endl;
        cout << "4. 按部门显示各部门职工工资总额" << endl;
        cout << "5. 删除职工信息" << endl;
        cout << "6. 按职称调整工资" << endl;
        cout << "0. 退出" << endl;
        cout << "请输入您的选择:";
        cin >> choice;
        switch (choice) {
        case 1:
            addEmployee();
            break;
        case 2:
            displayAllEmployees();
            break;
        case 3:
            displayEmployeesByDepartment();
            break;
        case 4:
            displayDepartmentTotalSalary();
            break;
        case 5:
            deleteEmployee();
            break;
        case 6:
            adjustSalaryByTitle();
            break;
        case 0:
            cout << "感谢使用人事信息管理系统!" << endl;
            break;
        default:
            cout << "无效的选择!" << endl;
            break;
        }
    } while (choice != 0);
}
int main() {
    menu();
    return 0;
}
 

vs代码实现

#include <iostream>
#include <string>
using namespace std;

// 职工信息结构体
struct Employee {
	int no;
	string name;
	string depname;
	string title;
	double salary;
	Employee* next;
};

// 全局变量,链表头指针
Employee* head = nullptr;

// 操作函数声明
void addEmployee();
void displayAllEmployees();
void displayEmployeesByDepartment();
void displayDepartmentTotalSalary();
void deleteEmployee();
void adjustSalaryByTitle();
void menu();

// 增加一个职工信息
void addEmployee() {
	Employee* newEmployee = new Employee;
	cout << "请输入职工编号:";
	cin >> newEmployee->no;
	cout << "请输入职工姓名:";
	cin >> newEmployee->name;
	cout << "请输入部门名称:";
	cin >> newEmployee->depname;
	cout << "请输入职称:";
	cin >> newEmployee->title;
	cout << "请输入工资数:";
	cin >> newEmployee->salary;

	newEmployee->next = nullptr;

	if (head == nullptr) {
		head = newEmployee;
	}
	else {
		Employee* temp = head;
		while (temp->next != nullptr) {
			temp = temp->next;
		}
		temp->next = newEmployee;
	}

	cout << "职工信息添加成功!" << endl;
}

// 显示所有职工信息
void displayAllEmployees() {
	if (head == nullptr) {
		cout << "暂无职工信息!" << endl;
		return;
	}

	Employee* temp = head;
	cout << "所有职工信息:" << endl;
	while (temp != nullptr) {
		cout << "编号:" << temp->no << endl;
		cout << "姓名:" << temp->name << endl;
		cout << "部门:" << temp->depname << endl;
		cout << "职称:" << temp->title << endl;
		cout << "工资:" << temp->salary << endl;
		cout << "-------------------------" << endl;
		temp = temp->next;
	}
}

// 按部门名称分类显示该部门所有职工信息
void displayEmployeesByDepartment() {
	if (head == nullptr) {
		cout << "暂无职工信息!" << endl;
		return;
	}

	string department;
	cout << "请输入部门名称:";
	cin >> department;

	Employee* temp = head;
	bool found = false;
	cout << "部门" << department << "下的职工信息:" << endl;
	while (temp != nullptr) {
		if (temp->depname == department) {
			cout << "编号:" << temp->no << endl;
			cout << "姓名:" << temp->name << endl;
			cout << "职称:" << temp->title << endl;
			cout << "工资:" << temp->salary << endl;
			cout << "-------------------------" << endl;
			found = true;
		}
		temp = temp->next;
	}

	if (!found) {
		cout << "未找到部门" << department << "下的职工信息!" << endl;
	}
}

// 按部门显示各部门职工工资总额
void displayDepartmentTotalSalary() {
	if (head == nullptr) {
		cout << "暂无职工信息!" << endl;
		return;
	}

	// 使用一个数组来存储每个部门的工资总额
	const int MAX_DEPARTMENTS = 100;
	double departmentTotalSalary[MAX_DEPARTMENTS] = { 0.0 };

	Employee* temp = head;
	while (temp != nullptr) {
		departmentTotalSalary[temp->depname.length()] += temp->salary;
		temp = temp->next;
	}

	cout << "各部门职工工资总额:" << endl;
	for (int i = 0; i < MAX_DEPARTMENTS; i++) {
		if (departmentTotalSalary[i] > 0) {
			cout << "部门:" << i << " 工资总额:" << departmentTotalSalary[i] << endl;
		}
	}
}

// 删除职工信息
void deleteEmployee() {
	if (head == nullptr) {
		cout << "暂无职工信息!" << endl;
		return;
	}

	int employeeNo;
	cout << "请输入要删除的职工编号:";
	cin >> employeeNo;

	Employee* current = head;
	Employee* previous = nullptr;

	while (current != nullptr) {
		if (current->no == employeeNo) {
			if (previous == nullptr) {
				// 删除头节点
				head = current->next;
			}
			else {
				previous->next = current->next;
			}

			delete current;
			cout << "职工信息删除成功!" << endl;
			return;
		}

		previous = current;
		current = current->next;
	}

	cout << "未找到职工编号为" << employeeNo << "的记录!" << endl;
}

// 按职称调整工资
void adjustSalaryByTitle() {
	if (head == nullptr) {
		cout << "暂无职工信息!" << endl;
		return;
	}

	string jobTitle;
	cout << "请输入职称:";
	cin >> jobTitle;

	double salaryAdjustment;
	cout << "请输入工资调整金额:";
	cin >> salaryAdjustment;

	Employee* temp = head;
	bool found = false;
	while (temp != nullptr) {
		if (temp->title == jobTitle) {
			temp->salary += salaryAdjustment;
			found = true;
		}
		temp = temp->next;
	}

	if (found) {
		cout << "职称为" << jobTitle << "的职工工资调整成功!" << endl;
	}
	else {
		cout << "未找到职称为" << jobTitle << "的职工!" << endl;
	}
}

// 菜单
void menu() {
	int choice;
	do {
		cout << "-------------------------" << endl;
		cout << "1. 增加职工信息" << endl;
		cout << "2. 显示所有职工信息" << endl;
		cout << "3. 按部门分类显示职工信息" << endl;
		cout << "4. 按部门显示各部门职工工资总额" << endl;
		cout << "5. 删除职工信息" << endl;
		cout << "6. 按职称调整工资" << endl;
		cout << "0. 退出" << endl;
		cout << "请输入您的选择:";
		cin >> choice;

		switch (choice) {
		case 1:
			addEmployee();
			break;
		case 2:
			displayAllEmployees();
			break;
		case 3:
			displayEmployeesByDepartment();
			break;
		case 4:
			displayDepartmentTotalSalary();
			break;
		case 5:
			deleteEmployee();
			break;
		case 6:
			adjustSalaryByTitle();
			break;
		case 0:
			cout << "感谢使用人事信息管理系统!" << endl;
			break;
		default:
			cout << "无效的选择!" << endl;
			break;
		}
	} while (choice != 0);
}

int main() {
	menu();
	return 0;
}


到了这里,关于链表综合算法设计(c++数据结构)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】链表

    对于顺序表存在一些缺陷: 中间/头部的插入删除,时间复杂度为O(N) 。头部插入需要挪动后面的元素 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插

    2023年04月09日
    浏览(23)
  • 02-链表 (数据结构和算法)

    3.1 链表的基本概念 前面我们在学习顺序表时,线性表的顺序存储结构的特点是逻辑关系上相邻的两个数据元素在物理位置上也是相邻的。我们会发现虽然顺序表的查询很快,时间复杂度为O(1),但是增删的效率是比较低的,因为每一次增删操作都伴随着大量的数据元素移动。为

    2024年02月16日
    浏览(21)
  • C++数据结构之链表(详解)

    主要参考文章地址 01.链表基础知识 | 算法通关手册 (itcharge.cn)) 本次内容是对链表的总结,可以看了上面的文章之后。 在看我下面的内容,做一个简短的复习,且本内容的代码均用C++实现,而参考资料的代码则为python。 每一个标题都有一个完整的链接,也可以点击下面的链

    2024年02月15日
    浏览(35)
  • Python数据结构与算法-数据结构(列表、栈、队列、链表)

    数据结构是指相互之间存在这一种或者多种关系的数据元素的集合和该集合中元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字典等都是一种数据结构。 N.Wirth:“程序=数据结构+算法” 数据结构按照其 逻辑结

    2024年02月08日
    浏览(25)
  • 算法与数据结构之链表

    链表的定义,相信大家都知道,这里就不赘述了只是链表分单向链表和双向链表,废话不多说,直接上代码 链表节点的定义: 打印链表的两种方式: 翻转单向链表:核心思路是先断开连接,再将next指向前继节点,为了避免断开之后,找不到前继节点,需要用一个临时变量记

    2024年02月05日
    浏览(26)
  • 【数据结构与算法】双向链表

    作者:旧梦拾遗186 专栏:数据结构成长日记   带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了。 现在我们来通

    2024年02月11日
    浏览(29)
  • 数据结构与算法:双向链表

    朋友们大家好啊,在上节完成单链表的讲解后,我们本篇文章来对 带头循环双向链表进行讲解 单链表中,一个节点存储数据和指向下一个节点的指针,而双向链表除了上述两个内容,还包括了 指向上一个节点的指针 带头的双向链表,是指在双向链表的最前端添加了一个 额

    2024年02月20日
    浏览(26)
  • 【数据结构和算法】奇偶链表

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:分离节点后合并 三、代码 3.1 方法一:分离节点后合并 四、复杂度分析 4.1 方法一:分离节点后合并 这是力扣的 328 题,难

    2024年01月20日
    浏览(26)
  • 【数据结构和算法】反转链表

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 方法一:迭代(双指针) 2.2 方法二:递归 三、代码 3.1 方法一:迭代(双指针) 3.2 方法二:递归 四、复杂度分析 4.1 方法一:迭代

    2024年01月18日
    浏览(26)
  • 【c++学习】数据结构中的链表

    链表与线性表相对,链表数据在内存中的存储空间是不连续的,链表每个节点包含数据域和指针域。 下述代码实现了链表及其接口 包括增、删、查、改以及其他一些简单的功能 运行结果: 于 2024-01-23 第一次整理编写 学习时整理,不当之处烦请指正 码字不易,留个赞再走吧

    2024年01月24日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包