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

Youtube Video

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

File List.h

#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

File List.cpp

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

File main.cpp

#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
Thuật toán sắp xếp trong C++
Sorting Algorithms

Tìm hiểu về các thuật toán sắp xếp phổ biến nhất, minh họa bằng ngôn ngữ C++

Kế thừa trong C++
Ke thua trong cpp

Tìm hiểu về tính kế thừa trong C++ | Một trong bốn tính chất quan trọng nhất trong kỹ thuật Read more

Thuật toán tìm kiếm trong C++
Searching Algorithms

Tìm hiểu về thuật toán tìm kiếm, ý tưởng của từng thuật toán và cách cài đặt chúng sử dụng Read more

Ngăn xếp và hàng đợi trong C++
Ngan xep va hang doi trong cpp

Tìm hiểu về ngăn xếp và hàng đợi, các thao tác trên các cấu trúc dữ liệu này.

Một bình luận

Để lại một trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *