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

2 Comments

  1. Avatar for wrose wrose
    02/04/2020
  2. Avatar for Tran Duy Tran Duy
    02/08/2020

Leave a Reply

Your email address will not be published