Bộ môn Máy tính và Hệ thống nhúng
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
1
Bài 05
DANH SÁCH LIÊN KẾT
I. Mục tiêu
Hoàn tất bài thực hành này, sinh viên có thể:
Cài đặt được danh sách liên kết bằng ngôn ngữ C/C++.
Triển khai và quản lý dữ liệu bằng danh sách liên kết.
II. Lý thuyết
1. Định nghĩa:
Danh sách là tp hợp gồm một số hữu hạn các phần tử có cng kiểu dữ liệu.
Có 2 cách cài đặt danh sách:
Cài đặt theo kiểu kế tiếp
Cài đặt theo kiểu liên kết
Các dạng danh sách liên kết:
Danh sách liên kết đơn
Danh sách liên kết kép
Danh sách liên kết vòng
Các thao tác cơ bản trên danh sách liên kết
Tạo danh sách rỗng
Bộ môn Máy tính và Hệ thống nhúng
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
2
Thêm một phần tử vào danh sách
Thêm vào đầu danh sách
input: danh sách (first, last), phần tử mới new_ele
output: danh sách (first, last) với new_ele ở đầu DS
* Nếu Danh sách rỗng Thì
first = new_ele;
last = first;
* Ngược lại
new_ele ->link = first;
first = new_ele ;
Thêm vào cuối danh sách
input: danh sách (first, last), phần tử mới new_ele
output: danh sách (first, last) với new_ele ở cuối DS
* Nếu Danh sách rỗng Thì
first = new_ele;
last = first;
* Ngược lại
last->link = new_ele ;
last = new_ele ;
Thêm vào sau phần tử “q”
input: danh sách (first, last), q, phần tử mới new_ele
output: danh sách (first, last) với new_ele ở sau q
* Nếu ( q != NULL) thì
new_ele -> link = q -> link;
q -> link = new_ele ;
Nếu ( q == last) thì
last = new_ele;
* Ngược lại
Thêm new_ele vào đầu danh sách
Bộ môn Máy tính và Hệ thống nhúng
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
3
Xóa một phần tử ra khỏi danh sách
Xóa đầu danh sách
ớc 1: Gọi p là node đầu của danh sách (là l.first)
ớc 2: Cho l.first trỏ vào node sau node p (là p->link)
ớc 3: Nếu danh sách trở thành rỗng thì l.last=NULL
ớc 4: Giải phóng vng nhớ mà p trỏ tới
Xóa sau phần tử “q”
Điều kiện để có thể xóa được node sau q là :
+ q phải khác NULL
+ Node sau q phải khác NULL
Có 3 thao tác
ớc 1: Gọi p là node sau q
ớ 2: Cho vng link của q trỏ vào node đứng sau p (là l.link)
ớc 3: Nếu p là phần tử cuối thì l.last trỏ vào q
ớc 4: Giải phóng vng nhớ mà p trỏ tới
Duyệt danh sách
ớc 1: p = first; //Cho p trỏ đến phần tử đầu danh sách
ớc 2: Trong khi (Danh sách chưa hết) thực hiện
B21 : Xử lý phần tử p;
B22 : p:=p->link; // Cho p trỏ tới phần tử kế
Hủy toàn bộ danh sách
ớc 1: Trong khi (Danh sách chưa hết) thực hiện
B11:
p = first;
first =first->link; // Cho p trỏ tới phần tử kế
B12:
Hủy p;
ớc 2:
last = NULL;//Bảo đảm tính nhất quán khi xâu rỗng
III. Thực hành
Bài tập bắt buộc:
1. Hoàn thành các yêu cầu bên dưới:
Cho các tên hàm:
struct birth {
unsigned char day;
unsigned char month;
unsigned int year;
};
struct Student {
char name[50];
Bộ môn Máy tính và Hệ thống nhúng
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
4
struct birth;
char studentID[8];
float GPA;
};
struct NODE {
// thêm định nghĩa node vào đây
};
struct LIST{
// thêm định ngĩa list vào đây
};
void GetNode (Student X); // hàm tạo node mới
void AddFirst(LIST &l, NODE* new_ele); // Thêm node mới vào đầu danh
// sách
void AddLast(LIST &l, NODE *new_ele) ; // Thêm node mới vào cuối danh
// sách
NODE * SearchNode (LIST l, Student x); // Tìm node với khoa xalloc
void AddAfter (LIST &l, NODE * new_ele, NODE * q); // Thêm vào sau
// node qsort
void PrintList(LIST l); // In danh sách
void RemoveFirst (LIST &l); // Xóa phần tử ở đầu sách
void RemoveLast (LIST &l); // Xóa phần tử ở cuối danh sách
1.1.Viết lại nội dung cho các hàm trên.
1.2.Viết hàm main để gọi các hàm trên để tạo một chương trình hoàn chỉnh.
Bài tập nâng cao:
1. Sửa lại các hàm ở phần trên để tạo sử dụng danh sách liên kết kép.
2. Thêm hàm đọc và ghi file để đọc/ghi dữ liệu giữa file data.txt và danh sách liên kết kép.
3. Viết thêm hàm tìm tất cả sinh viên có điểm trung bình dưới năm và xóa khỏi danh sách
ban đầu và thêm vào danh sách thứ hai.

Preview text:

Bộ môn Máy tính và Hệ thống nhúng Bài 05 DANH SÁCH LIÊN KẾT I. Mục tiêu
Hoàn tất bài thực hành này, sinh viên có thể:
▪ Cài đặt được danh sách liên kết bằng ngôn ngữ C/C++.
▪ Triển khai và quản lý dữ liệu bằng danh sách liên kết. II. Lý thuyết 1. Định nghĩa:
Danh sách là tập hợp gồm một số hữu hạn các phần tử có cùng kiểu dữ liệu.
❖ Có 2 cách cài đặt danh sách:
• Cài đặt theo kiểu kế tiếp
• Cài đặt theo kiểu liên kết
❖ Các dạng danh sách liên kết:
• Danh sách liên kết đơn
• Danh sách liên kết kép
• Danh sách liên kết vòng
❖ Các thao tác cơ bản trên danh sách liên kết • Tạo danh sách rỗng
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 1
Bộ môn Máy tính và Hệ thống nhúng
• Thêm một phần tử vào danh sách Thêm vào đầu danh sách
input: danh sách (first, last), phần tử mới new_ele
output: danh sách (first, last) với new_ele ở đầu DS
* Nếu Danh sách rỗng Thì ▪ first = new_ele; ▪ last = first; * Ngược lại
▪ new_ele ->link = first; ▪ first = new_ele ; Thêm vào cuối danh sách
input: danh sách (first, last), phần tử mới new_ele
output: danh sách (first, last) với new_ele ở cuối DS
* Nếu Danh sách rỗng Thì ▪ first = new_ele; ▪ last = first; * Ngược lại ▪ last->link = new_ele ; ▪ last = new_ele ;
Thêm vào sau phần tử “q”
input: danh sách (first, last), q, phần tử mới new_ele
output: danh sách (first, last) với new_ele ở sau q * Nếu ( q != NULL) thì
▪ new_ele -> link = q -> link; ▪ q -> link = new_ele ; Nếu ( q == last) thì ▪ last = new_ele; * Ngược lại
▪ Thêm new_ele vào đầu danh sách
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 2
Bộ môn Máy tính và Hệ thống nhúng
• Xóa một phần tử ra khỏi danh sách Xóa đầu danh sách
▪ Bước 1: Gọi p là node đầu của danh sách (là l.first)
▪ Bước 2: Cho l.first trỏ vào node sau node p (là p->link)
▪ Bước 3: Nếu danh sách trở thành rỗng thì l.last=NULL
▪ Bước 4: Giải phóng vùng nhớ mà p trỏ tới Xóa sau phần tử “q”
✓ Điều kiện để có thể xóa được node sau q là : + q phải khác NULL
+ Node sau q phải khác NULL ➢ Có 3 thao tác
▪ Bước 1: Gọi p là node sau q
▪ Bướ 2: Cho vùng link của q trỏ vào node đứng sau p (là l.link)
▪ Bước 3: Nếu p là phần tử cuối thì l.last trỏ vào q
▪ Bước 4: Giải phóng vùng nhớ mà p trỏ tới • Duyệt danh sách ▪
Bước 1: p = first; //Cho p trỏ đến phần tử đầu danh sách
Bước 2: Trong khi (Danh sách chưa hết) thực hiện
▪ B21 : Xử lý phần tử p; ▪ B22 : p:=p->link;
// Cho p trỏ tới phần tử kế
• Hủy toàn bộ danh sách ▪
Bước 1: Trong khi (Danh sách chưa hết) thực hiện ▪ B11: ▪ p = first; ▪
first =first->link; // Cho p trỏ tới phần tử kế ▪ B12: ▪ Hủy p; ▪ Bước 2: ▪
last = NULL;//Bảo đảm tính nhất quán khi xâu rỗng III. Thực hành
Bài tập bắt buộc:
1. Hoàn thành các yêu cầu bên dưới: Cho các tên hàm: struct birth { unsigned char day; unsigned char month; unsigned int year; }; struct Student { char name[50];
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 3
Bộ môn Máy tính và Hệ thống nhúng struct birth;
char studentID[8]; float GPA; }; struct NODE {
// thêm định nghĩa node vào đây }; struct LIST{
// thêm định ngĩa list vào đây };
void GetNode (Student X); // hàm tạo node mới
void AddFirst(LIST &l, NODE* new_ele); // Thêm node mới vào đầu danh // sách
void AddLast(LIST &l, NODE *new_ele) ; // Thêm node mới vào cuối danh // sách
NODE * SearchNode (LIST l, Student x); // Tìm node với khoa xalloc
void AddAfter (LIST &l, NODE * new_ele, NODE * q); // Thêm vào sau // node qsort
void PrintList(LIST l); // In danh sách
void RemoveFirst (LIST &l); // Xóa phần tử ở đầu sách
void RemoveLast (LIST &l); // Xóa phần tử ở cuối danh sách
1.1.Viết lại nội dung cho các hàm trên.
1.2.Viết hàm main để gọi các hàm trên để tạo một chương trình hoàn chỉnh. ❖ Bài tập nâng cao:
1. Sửa lại các hàm ở phần trên để tạo sử dụng danh sách liên kết kép.
2. Thêm hàm đọc và ghi file để đọc/ghi dữ liệu giữa file data.txt và danh sách liên kết kép.
3. Viết thêm hàm tìm tất cả sinh viên có điểm trung bình dưới năm và xóa khỏi danh sách
ban đầu và thêm vào danh sách thứ hai.
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT 4