[Cấu trúc dữ liệu và giải thuật] – Bài tập danh sách liên kết

Bài tập: Viết chương trình dùng danh sách liên kết quản lý thư viện.

**Yêu cầu:

  • Xây dựng kiểu dữ liệu thích hợp để lưu trữ thông tin sách.
  • Viết hàm nhập xuất danh sách thông tin sách. ( Ứng dụng danh sách liên kết ).
  • Viết hàm tìm kiếm không khóa ( tìm dựa trên tên sách người dùng nhập vào ) và tìm kiếm theo khóa ( tìm theo số thứ tự người dùng nhập vào ) .
  • Viết hàm sắp xếp sách theo số thứ tự.

**SOURCE CODE:

//BT QUẢN LÝ THƯ VIỆN
#include "pch.h"
#include <string.h>
#include <conio.h>
#include <iostream>
#include <stdio.h>

using namespace std;

//Định nghĩa cấu trúc Sách
typedef struct
{
	int stt;
	char ten_sach[100];
	char ten_TG[50];
	int namXB;
	int so_ban;
}stype;

//Định nghĩa nút (node) = phần tử danh sách
typedef struct Node
{
	stype infor; /*phần thông tin*/
	struct Node *next; /*Phần con trỏ*/
}snodetype;

//định nghĩa ds liên kết quản lý thông tin sách
typedef struct
{
	snodetype *head;
	snodetype *tail;
}qls_llist;

//Nhập thông tin 1 quyển sách
void Nhap_Sach(stype &s)
{
	cout << "\nSTT: ";
	cin >> s.stt;

	cin.ignore();
	cout << "\nTen cuon sach: ";
	cin.getline(s.ten_sach, 100);

	cout << "\nTen tac gia: ";
	cin.getline(s.ten_TG, 50);

	cout << "\nNam xuat ban: ";
	cin >> s.namXB;

	cout << "\nSo ban: ";
	cin >> s.so_ban;
}

//Xuất thông tin 1 quyển sách
void Xuat_Sach(stype s)
{
	cout << "\nSTT: " << s.stt;
	cout << "\nTen cuon sach: " << s.ten_sach;
	cout << "\nTac gia: " << s.ten_TG;
	cout << "\nNam xuat ban: " << s.namXB;
	cout << "\nSo ban: " << s.so_ban;
}

//Tạo node từ ô bự đã nhập
snodetype* get_snode(stype x)
{
	snodetype *p;
	p = new snodetype;
	p->infor = x;
	p->next = NULL;
	return p;
}

//Tạo node từ phần thông tin tự nhập
snodetype* get_node2()
{
	/*Nhập phần thông tin của node*/
	stype x;
	Nhap_Sach(x);

	//Tạo node trống
	snodetype *p;
	p = new snodetype;

	//Xử lý phần thông tin và phần con trỏ của Node
	p->infor = x;
	p->next = NULL;

	return p;
}

//In Node ra màn hình
void Print_snode(snodetype *n)
{
	Xuat_Sach(n->infor);
}

//Khởi tạo ds
void Init_qls_llist(qls_llist *l)
{
	l->head = NULL;
	l->tail = NULL;
}

//thêm phần tử vào đầu ds
void Addfirst(qls_llist *l, snodetype *n)
{
	if (l->head == NULL)
	{
		l->head = n;
		l->tail = n;
	}
	else
	{
		n->next = l->head;
		l->head = n;
	}
}

//In dslk
void printlist(qls_llist *l)
{
	snodetype *p;
	p = l->head;
	while (p != NULL)
	{
		Xuat_Sach(p->infor);
		p = p->next;
	}
}

//Tim kiem theo khoa
snodetype* findlist(qls_llist *l, int x)
{
	snodetype *p;
	p = l->head;
	while (p != NULL && p->infor.stt != x)
	{
		p = p->next;
	}
	return p;
}

//Tim kiem khong khoa, xuat ket qua dau tien tim thay
snodetype* findlist_2a(qls_llist *l, char ts[])
{
	snodetype *p;
	p = l->head;
	while (p != NULL && strcmp(p->infor.ten_sach, ts) != 0)
	{
		p = p->next;
	}
	return p;
}

//Tim kiem khong khoa, ket hop xuat tat ca ket qua 
int findlist_2b(qls_llist *l, char tg[])
{
	int so_kq = 0;
	snodetype *p;
	p = l->head;
	while (p != NULL)
	{
		if (strcmp(p->infor.ten_TG, tg) == 0)
		{
			so_kq++;
			Print_snode(p);
		}
		p = p->next;
	}
	return so_kq;

}

//ctc hoan vi 2 o bu
void swap(stype &a, stype &b)
{
	stype t = a;
	a = b;
	b = t;
}

//sx dslk
void SelectionSortlist(qls_llist* list)
{
	snodetype *p, *q, *min;
	p = list->head;
	while (p != list->tail)
	{
		q = p->next;
		/*tim min*/
		min = p;
		while (q != NULL)
		{
			if (q->infor.stt < min->infor.stt)
				min = q;
			q = q->next;
		}
		swap(min->infor, p->infor);
		p = p->next;
	}
}
void main()
{
	/*Test nhập xuất thông tin sách*/
	stype s;
	Nhap_Sach(s);
	Xuat_Sach(s);


	//test tạo node-in node
	stype s;
	Nhap_Sach(s);
	snodetype *n;
	n = new snodetype;
	n = get_snode(s);
	Print_snode(n);


	//test nhap-xuat dslk
	qls_llist *ds;
	ds = new qls_llist;
	Init_qls_llist(ds);
	char t = 'c';
	while (t == 'c' || t == 'C')
	{
		snodetype *n;
		n = new snodetype;
		cout << "\nNhap thong tin sach: ";
		n = get_node2();
		Addfirst(ds, n);
		cout << "\nNhap tiep (C/K)?";
		cin >> t;
	}
	printlist(ds);

	//test tim kiem theo khoa
	int x;
	cout << "\nNhap stt sach can tim: "; cin >> x;
	snodetype *kq;
	kq = findlist(ds, x);
	if (kq == NULL)
		cout << "\nKhong tim thay ";
	else
		Print_snode(kq);

	//test tim kiem khong khoa
	char ts[100];
	cin.ignore();
	cout << "\nNhap ten sach can tim: ";

	snodetype *kq;
	kq = findlist_2a(ds, ts);
	if (kq == NULL)
		cout << "\n Khong tim thay ";
	else
		Print_snode(kq);

		//test tim kiem khong khoa
		//Nhap ten tac gia can tim
		/*char tg[100];
		cin.ignore();
		cout << "\nNhap ten tac gia can tim: "; 
		cin.getline(tg, 100);
		int kq;
		cout << "\nKet qua tim theo tac gia: ";
		kq = findlist_2b(ds, tg);
		cout << "\nTong cong co: " << kq << " ket qua duoc tim thay.\n";*/
       SelectionSortlist(ds);
       printlist(ds);
		system("pause");
}
//Chúc các bạn thành công

Tác giả: Lê Minh Nghĩa – 18DHT02 ( Khoa Công Nghệ Thông Tin )

Một suy nghĩ 2 thoughts on “[Cấu trúc dữ liệu và giải thuật] – Bài tập danh sách liên kết”

  1. Bài toán 4: Tổ chức và Quản lý Câu lạc bộ bóng đá.
    Người ta biểu diễn thông tin các câu lạc bộ bóng đá chuyên nghiệp của một quốc gia dưới dạng cây nhị phân tìm kiếm có khóa là TenCLB (tên Câu lạc bộ). Mỗi nút của cây là một bản ghi gồm 4 trường: TenCLB và 3 trường con trỏ: Left, Right, First. Hai con trỏ Left và Right lần lượt trỏ đến 2 nút con trái và con phải của nút đó, con trỏ First trỏ đến phần tử đầu của một danh sách liên kết đơn chứa thông tin các cầu thủ của một câu lạc bộ được gọi là Dscauthu (danh sách này chứa ít nhất 11 phần tử). Mỗi phần tử của Dscauthu là một bản ghi gồm 4 trường: TenCT (tên cầu thủ), SoAo (số áo), Tuoi (tuổi) và Next (lưu địa chỉ của phần tử tiếp theo trong danh sách). Đồng thời, Dscauthu được sắp theo thứ tự tăng dần của SoAo.
    Với các định nghĩa như trên, cấu trúc dữ liệu của bài toán được khai báo như sau:
    typedef struct _cauthu
    {
    char *TenCT;//tên cầu thủ
    int SoAo;//số áo
    int Tuoi;//tuổi
    _cauthu *Next;// Con trỏ trỏ đến phần tử tiếp theo
    }_node_cauthu;
    typedef _ node_cauthu *type_cauthu;
    typedef struct _clb
    {
    _clb *Left;
    char *TenCLB;// tên câu lạc bộ
    _type_cauthu First;
    _clb *Right;
    }_clb_node;
    typedef _clb_node *type_clb; // con trỏ kiểu _clb_node

    Yêu cầu:
    4.1. Tổ chức file dữ liệu văn bản Input.txt chứa thông tin của n Câu lạc bộ.
    4.2. Vẽ hình minh họa cấu trúc dữ liệu của cây có gốc được trỏ bởi Roof và dữ liệu lấy từ Input.txt.
    4.3. Tạo cây nhị phân tìm kiếm.
    4.4. Viết hàm void line_update(type_line &first, type_line &last, type_line node, char *new_content) cho phép cập nhật nội dung của dòng được trỏ bởi node (thuộc văn bản được quản lý bởi first và last) với nội dung mới là new_content.
    4.5. Viết hàm void line_delete(type_line &first, type_line &last, type_line node) thực hiện xóa dòng được trỏ bởi node trong văn bản được quản lý bởi first và last.
    • Vấn đề 4b: Thao tác với khối (block operation)
    4.6. Viết hàm void block_delete(type_line &first, type_line &last, type_line fb, type_line lb)cho phép xóa khối văn bản được xác định bởi hai con trỏ fb và lb trong văn bản được quản lý bởi first và last.
    4.7. Viết hàm void block_move(type_line &first, type_line &last, type_line fb, type_line lb, type_line node) cho phép chuyển khối được xác định bởi hai con trỏ fb và lb đến sau dòng được trỏ bởi node trong văn bản được quản lý bởi first và last.
    4.8. Viết hàm void block_copy(type_line &first, type_line &last, type_line fb, type_line lb, type_line node) cho phép sao chép khối được xác định bởi hai con trỏ fb và lb và đặt sau dòng được trỏ bởi node trong văn bản được quản lý bởi first và last.
    4.9. Viết hàm void text_delete(type_line &first, type_line &last) cho phép xóa văn bản được quản lý bởi first và last.
    4.10. Hoàn chỉnh chương trình (với bảng lựa chọn) cho phép thực hiện kiểm thử (test) các thao tác ở trên.

    Làm giúp em bài này được k ạ ? có hậu tạ ạ.

    Thích

  2. 1. Cài đặt cấu trúc dữ liệu single list với bộ lặp xuôi với kiểu dữ liệu trừu tượng2. Cài đặt class hàng hóa gồm tên hàng, số lượng, đơn giá các thao tác nhập xuất3. Cài đặt class giỏ hàng với một danh sách liên kết đơn các hàng hóa cho phép thêm một hàng vào giỏ nếu có rồi thì tăng số lượng chưa có thì thêm mới vào cuối danh sách; bớt mặt hàng nếu bớt số lượng bằng 0 thì xóa khỏi giỏ. Tính tiền giỏ hàng bằng tổng tiền của từng mặt hàng. Xuất dữ liệu về giỏ hàng ra file văn bản hoadon.txt

    giúp em bài này với

    Thích

Bình luận về bài viết này