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
Đa hình trong C++
Da-hinh-trong-cpp

Tìm hiểu về tính đa hình trong C++, phương thức ảo, phương thức thuần ảo, lớp trừu tượng và interface.

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

Nạp chồng toán tử trong C++
Nap chong toan tu trong cpp

Tìm hiểu về nạp chồng toán tử trong C++

Hàm bạn và lớp bạn trong C++
Ham-ban-va-lop-ban-trong-cpp

Tìm hiểu về hàm bạn và lớp bạn trong C++

Subscribe
Notify of
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?