Quản lý nhân viên bằng danh sách liên kết đơn [Bài tập C++]

Nội dung bài viết Ẩn
Quản lý nhân viên bằng danh sách liên kết đơn [Bài tập C++] | Khiêm Lê

Trong video, phương thức RemoveStaffWithCode chưa được hoàn chỉnh, nên mình sửa lại một chút, các bạn có thể thao khảo source code bên dưới.

Đề bài

Viết chương trình thực hiện các yêu cầu sau trên danh sách liên kết đơn Quản lý các nhân viên:

  1. Khai báo cấu trúc dữ liệu của dslk đơn các nhân viên, biết rằng thông tin của một nhân viên: Mã số nhân viên (kiểu ký tự), họ tên nhân viên (30 ký tự), ngày sinh (kiểu ngày), lương (số thực), giới tính (0: nữ, 1: nam).
  2. Viết hàm nhập thông tin nhân viên theo phương pháp thêm vào đầu danh sách.
  3. Liệt kê tên các nhân viên năm sinh nhỏ hơn hoặc bằng 1980.
  4. Đếm số lượng nhân viên có lương lớn hơn 10 triệu đồng.
  5. Xoá một nhân viên có mã số bằng x, x nhập từ bàn phím, nếu không có thì thông báo là không có.
  6. Sắp xếp các nhân viên giảm dần theo năm sinh (không quan tâm ngày và tháng).

Source code

#ifndef List_h
#define List_h

struct Date
{
	int Day;
	int Month;
	int Year;
};

void PrintDate(Date date);

struct Staff
{
	char Code[10];
	char Fullname[30];
	Date DateOfBirth;
	float Salary;
	// 0: Female, 1: Male
	int Gender;
};

void PrintStaff(Staff staff);

struct Node
{
	Staff data;
	Node* pNext;
};

struct List
{
	Node* pHead;
	Node* pTail;
};

Node* CreateNode(Staff initData);
void CreateList(List& l);
void AddHead(List& l, Node* p);
void PrintList(List l);
void ListStaffWithYearLowerThan1980(List l);
int CountStaffWithSalaryMoreThan10M(List l);
int RemoveStaffWithCode(List& l, char code[]);
void SelectionSort(List& l);
void DestroyList(List& l);

#endif
#include "List.h"
#include <iostream>
#include <cstring>
using namespace std;

void CreateList(List& l)
{
	l.pHead = NULL;
	l.pTail = NULL;
}

Node* CreateNode(Staff initData)
{
	Node* p = new Node;
	p->data = initData;
	p->pNext = NULL;
	return p;
}

void AddHead(List& l, Node* p)
{
	if (l.pHead == NULL)
	{
		l.pHead = p;
		l.pTail = p;
	}
	else
	{
		p->pNext = l.pHead;
		l.pHead = p;
	}
}

void PrintDate(Date date)
{
	cout << date.Day << '/' << date.Month << '/' << date.Year;
}

void PrintStaff(Staff staff)
{
	cout << staff.Code << '\t';
	cout << staff.Fullname << '\t';
	PrintDate(staff.DateOfBirth); cout << '\t';
	cout << staff.Salary << '\t';
	cout << staff.Gender << endl;
}

void PrintList(List l)
{
	Node* p = l.pHead;
	while (p != NULL)
	{
		PrintStaff(p->data);
		p = p->pNext;
	}
}

void ListStaffWithYearLowerThan1980(List l)
{
	Node* p = l.pHead;
	while (p != NULL)
	{
		if (p->data.DateOfBirth.Year <= 1980)
			cout << p->data.Fullname << endl;
		p = p->pNext;
	}
}

int CountStaffWithSalaryMoreThan10M(List l)
{
	int count = 0;
	Node* p = l.pHead;
	while (p != NULL)
	{
		if (p->data.Salary >= 10000000)
			count++;
		p = p->pNext;
	}
	return count;
}

int RemoveStaffWithCode(List& l, char code[])
{
	Node* p = l.pHead, *prev = NULL;
	while (p != NULL && strcmp(p->data.Code, code) != 0)
	{
		prev = p;
		p = p->pNext;
	}
	if (p != NULL)
	{
		if (prev != NULL)
			prev->pNext = p->pNext;
		else
		{
			l.pHead = p->pNext;
			if (l.pHead == NULL)
				l.pTail = NULL;
		}
		delete p;
		return 1;
	}
	return 0;
}

void SelectionSort(List& l)
{
	Node* p, * q, * max;
	p = l.pHead;
	while (p != l.pTail)
	{
		max = p;
		q = p->pNext;
		while (q != NULL)
		{
			if (q->data.DateOfBirth.Year > p->data.DateOfBirth.Year)
				max = q;
			q = q->pNext;
		}
		swap(p->data, max->data);
		p = p->pNext;
	}
}

void DestroyList(List& l)
{
	Node* p = l.pHead;
	while (l.pHead != NULL)
	{
		l.pHead = p->pNext;
		delete p;
		p = l.pHead;
	}
}
#include <iostream>
using namespace std;

#include "List.h"

int main()
{

	List list;
	CreateList(list);

	Staff staff1{
		"100",
		"Khiem Le",
		Date{24, 9, 2018},
		9000000,
		1
	};
	Staff staff2{
		"120",
		"Nguyen Van A",
		Date{3, 9, 2001},
		22000000,
		0
	};
	Staff staff3{
		"150",
		"Nguyen Van A",
		Date{3, 9, 2005},
		9000000,
		1
	};

	Node* p = CreateNode(staff1);
	AddHead(list, p);
	p = CreateNode(staff2);
	AddHead(list, p);
	p = CreateNode(staff3);
	AddHead(list, p);

	cout << "Your list:\n";
	PrintList(list);

	cout << "Staffs with year lower than 1980:\n";
	ListStaffWithYearLowerThan1980(list);

	cout << "Number of staff with salary more than 10M: ";
	cout << CountStaffWithSalaryMoreThan10M(list);

	cout << "Enter staff's code to remove: ";
	char code[10]; cin >> code;
	int res = RemoveStaffWithCode(list, code);
	if (res)
	{
		cout << "List after remove:\n";
		PrintList(list);
		cout << endl;
	}
	else
		cout << "Not found\n";

	SelectionSort(list);
	cout << "List after sort:\n";
	PrintList(list);

	DestroyList(list);
	
	return 0;
}
Bài viết liên quan
Dãy Fibonacci [Bài tập Python]
Fibonacci-bai-tap-python

Tìm hiểu về dãy Fibanacci, các thuật toán tính số Fibanacci trong Python

Định nghĩa class CHAR và STRING trong C++ [Bài tập OOP]
Giai-bai-tap-OOP-cpp

Giải bài tập OOP: định nghĩa class CHAR và STRING trong C++

Các phép toán cơ bản trên phân số [Bài tập C++]
Cac-phep-toan-co-ban-tren-phan-so-cpp

Giải bài tập các phép toán cơ bản trên phân số C++

Quản lý sinh viên [Bài tập C++]
Quan-ly-sinh-vien-cpp

Video và source cách giải bài quản lý sinh viên chi tiết bằng C++

guest
2 Comments
Inline Feedbacks
View all comments
wrose

làm video linkedlist với class đi anh ơi =))

Tran Duy

bài này sao em xóa đầu danh sách lại báo lỗi hả a?