Quản lý sinh viên sử dụng danh sách liên kết đơn

Trong hướng dẫn này mình sẽ thực hiện một chương trình quản lý sinh viên sử dụng danh sách liên kết đơn.

test php

banquyen png

Bài viết này được đăng tại

freetuts.net

, không được copy dưới mọi hình thức.

Chúng ta sẽ quản lý sinh viên với những thông tin thiết yếu và những thao tác thêm, xóa và sắp xếp sinh viên .

Đề bài: Xây dựng chương trình quản lý sinh viên bằng DSLK đơn

Cho một sinh viên có cấu trúc : mã ( int ), tên ( char * ). Dùng list link đơn với con trỏ phead để thao tác :

  • Khởi tạo list dạng con trỏ
  • Thêm node vào cuối danh sách
  • Sắp xếp theo mã
  • Xóa node

Chương trình quản lý sinh viên sử dụng DSLK đơn

Chúng ta sẽ lần lượt tạo cấu trúc sinh viên, cấu trúc list link đơn và những thao tác tương quan .

Đầu tiên chúng ta cần tạo một cấu trúc sinh viên với mã số sinh viên ma và tên sinh viên ten.

//tao cau truc sinh vien
struct SinhVien
{
	int ma;
	char ten[150];
};

Tiếp đến tạo cấu trúc tài liệu của list link đơn với giá trị data và con trỏ pNext. Khởi tạo giá trị cho pHead và pTail bằng NULL .

//tao cau truc danh sach lien ket don
struct Node
{
	SinhVien *data;
	Node *pNext;
};
struct SingleList
{
	Node *pHead;
};
//khoi tao danh sach lien ket don
void Initialize(SingleList *&list)
{
	list=new SingleList;
	list->pHead=NULL;
}

Tạo một hàm NhapSinhVien() sử dụng cấu trúc SinhVien để nhập các thông tin của sinh viên như: MSSV và tên sinh viên

SinhVien *NhapSinhVien()
{
	SinhVien *sv=new SinhVien;
	cout<<"Nhap MSSV:";
	cin>>sv->ma;
	cin.ignore();
	cout<<"Nhap ho va ten:";
	gets(sv->ten);
	return sv;
}

Bây giờ chúng ta bắt đầu tạo Node với các thông tin của cấu trúc SinhVien, sau đó thêm Node vào cuối danh sách.

//tao node sinh vien
Node *CreateNode(SinhVien *sv)
{
	Node *pNode=new Node;
	if(pNode!=NULL)
	{
		pNode->data=sv;
		pNode->pNext=NULL;
	}
	else
	{
		cout<<"cap phat bo nho that bai!!!";
	}
	return pNode;
}
//them node vao cuoi danh sach
void InsertLast(SingleList *&list,SinhVien *sv)
{
	Node *pNode=CreateNode(sv);
	if(list->pHead==NULL)
	{
		list->pHead=pNode;
	}
	else
	{
		Node *pTmp=list->pHead;
		
		while(pTmp->pNext!=NULL)
		{
			pTmp=pTmp->pNext;
		}
		pTmp->pNext=pNode;
	}
}

Sau khi thêm Node vào list ta triển khai những thao tác theo nhu yếu của đề bài. Đầu tiên là việc sắp xếp những sinh viên theo MSSV .

Ở bài tìm kiếm và sắp xếp trong danh sách liên kết đơn mình đã giới thiệu các bạn thao tác sắp xếp. Dựa vào đó ta chỉ cần biến đổi một chút sẽ có ngay hàm sắp xếp SortList() theo MSSV.

void SortList(SingleList *&list)
{
	for(Node *pTmp=list->pHead;pTmp!=NULL;pTmp=pTmp->pNext)
	{
		for(Node *pTmp2=pTmp->pNext;pTmp2!=NULL;pTmp2=pTmp2->pNext)
		{	
			SinhVien *svTmp=pTmp->data;
			SinhVien *svTmp2=pTmp2->data;
			if(svTmp2->mama)
			{
				int ma=svTmp->ma;
				char ten[150];
				strcpy(ten,svTmp->ten);
				
				svTmp->ma=svTmp2->ma;
				strcpy(svTmp->ten,svTmp2->ten);
				svTmp2->ma=ma;
				strcpy(svTmp2->ten,ten);				
			}
		}	
	}
}

Tương tự như hàm sắp xếp, để xóa một sinh viên dựa vào tên ta triển khai vòng lặp while lặp từng thành phần trong list. Nếu thành phần đó trùng với thành phần được nhập vào từ bàn phím ta triển khai delete thành phần đó ra khỏi list .

void RemoveNode(SingleList *&list,int ma)
{
	Node *pDel=list->pHead;
	if(pDel==NULL)
	{
		cout<<"Danh sach rong!";
	}
	else
	{
		Node *pPre=NULL;
		while(pDel!=NULL)
		{
			SinhVien *sv=pDel->data;
			if(sv->ma==ma)
				break;
			pPre=pDel;
			pDel=pDel->pNext;
		}
		if(pDel==NULL)
		{
			cout<<"khong tim thay MSSV: "<pHead)
			{
				list->pHead=list->pHead->pNext;
				pDel->pNext=NULL;
				delete pDel;
				pDel=NULL;
			}
			else
			{
				pPre->pNext=pDel->pNext;
				pDel->pNext=NULL;
				delete pDel;
				pDel=NULL;
			}
		}
	}
}

Sau khi triển khai tạo những thao tác, ta chỉ cần tạo hàm main ( ) và gọi những thao tác đó ra để sử dụng .

int main(int argc, char** argv) {
	SingleList *list;
	Initialize(list);
	SinhVien *teo=NhapSinhVien();
	InsertLast(list,teo);
	SinhVien *ty=NhapSinhVien();
	InsertLast(list,ty);
	SinhVien *bin=NhapSinhVien();
	InsertLast(list,bin);
	PrintList(list);
	SortList(list);
	cout<<"\nSau khi sap xep:\n";
	PrintList(list);
	cout<<"\Ban muon xoa sinh vien co MSSV: ";
	int ma;
	cin>>ma;
	RemoveNode(list,ma);
	cout<<"\nSau khi xoa:\n";
	PrintList(list);
}

Full code:

#include 
#include 
#include 
using namespace std;
//tao cau truc sinh vien
struct SinhVien
{
	int ma;
	char ten[150];
};
//tao cau truc danh sach lien ket don
struct Node
{
	SinhVien *data;
	Node *pNext;
};
struct SingleList
{
	Node *pHead;
};
//khoi tao danh sach lien ket don
void Initialize(SingleList *&list)
{
	list=new SingleList;
	list->pHead=NULL;
}
//nhap thong tin sinh vien
SinhVien *NhapSinhVien()
{
	SinhVien *sv=new SinhVien;
	cout<<"Nhap MSSV:";
	cin>>sv->ma;
	cin.ignore();
	cout<<"Nhap ho va ten:";
	gets(sv->ten);
	return sv;
}
//tao node sinh vien
Node *CreateNode(SinhVien *sv)
{
	Node *pNode=new Node;
	if(pNode!=NULL)
	{
		pNode->data=sv;
		pNode->pNext=NULL;
	}
	else
	{
		cout<<"cap phat bo nho that bai!!!";
	}
	return pNode;
}
//them node vao cuoi danh sach
void InsertLast(SingleList *&list,SinhVien *sv)
{
	Node *pNode=CreateNode(sv);
	if(list->pHead==NULL)
	{
		list->pHead=pNode;
	}
	else
	{
		Node *pTmp=list->pHead;
		
		while(pTmp->pNext!=NULL)
		{
			pTmp=pTmp->pNext;
		}
		pTmp->pNext=pNode;
	}
}
//hien thi danh sach
void PrintList(SingleList *list)
{
	Node *pTmp=list->pHead;
	if(pTmp==NULL)
	{
		cout<<"Danh sach rong";
		return;
	}
	while(pTmp!=NULL)
	{
		SinhVien *sv=pTmp->data;
		cout<ma<<"\t"<ten<<"\n";
		pTmp=pTmp->pNext;
	}
}
//sap xep
void SortList(SingleList *&list)
{
	for(Node *pTmp=list->pHead;pTmp!=NULL;pTmp=pTmp->pNext)
	{
		for(Node *pTmp2=pTmp->pNext;pTmp2!=NULL;pTmp2=pTmp2->pNext)
		{	
			SinhVien *svTmp=pTmp->data;
			SinhVien *svTmp2=pTmp2->data;
			if(svTmp2->mama)
			{
				int ma=svTmp->ma;
				char ten[150];
				strcpy(ten,svTmp->ten);
				
				svTmp->ma=svTmp2->ma;
				strcpy(svTmp->ten,svTmp2->ten);
				svTmp2->ma=ma;
				strcpy(svTmp2->ten,ten);				
			}
		}	
	}
}
//xoa
void RemoveNode(SingleList *&list,int ma)
{
	Node *pDel=list->pHead;
	if(pDel==NULL)
	{
		cout<<"Danh sach rong!";
	}
	else
	{
		Node *pPre=NULL;
		while(pDel!=NULL)
		{
			SinhVien *sv=pDel->data;
			if(sv->ma==ma)
				break;
			pPre=pDel;
			pDel=pDel->pNext;
		}
		if(pDel==NULL)
		{
			cout<<"khong tim thay MSSV: "<pHead)
			{
				list->pHead=list->pHead->pNext;
				pDel->pNext=NULL;
				delete pDel;
				pDel=NULL;
			}
			else
			{
				pPre->pNext=pDel->pNext;
				pDel->pNext=NULL;
				delete pDel;
				pDel=NULL;
			}
		}
	}
}
int main(int argc, char** argv) {
	SingleList *list;
	Initialize(list);
	SinhVien *teo=NhapSinhVien();
	InsertLast(list,teo);
	SinhVien *ty=NhapSinhVien();
	InsertLast(list,ty);
	SinhVien *bin=NhapSinhVien();
	InsertLast(list,bin);
	PrintList(list);
	SortList(list);
	cout<<"\nSau khi sap xep:\n";
	PrintList(list);
	cout<<"\Ban muon xoa sinh vien co MSSV: ";
	int ma;
	cin>>ma;
	RemoveNode(list,ma);
	cout<<"\nSau khi xoa:\n";
	PrintList(list);

  cout<<"\n---------------------------\n";
  cout<<"Chuong trinh nay duoc dang tai Freetuts.net";
}

Kết quả:

bai tap 1 PNG

Như vậy là tất cả chúng ta đã triển khai xong chương trình quản lý sinh viên sử dụng list link đơn. Hãy rèn luyện thật nhiều nhé, chúc những bạn thực thi thành công xuất sắc ! ! !