Cấu Trúc Dữ Liệu Và Giải Thuật Chapter 3.3 Doublelist Tài Liệu Bao Gồm 6 Chapter Mong các bạn theo dõi đầy đủ để đạt kết quả cao . Để Cập Nhật Thêm Tìm Hiểu Hơn Nữa Về Tài Liệu IT Thì Các Bạn Có Thể Truy Cập : https:123doc.orgtrangcanhan4336953tailieuit.htm CẢM ƠN CÁC BẠN ĐÃ THEO DÕI
Trang 1Danh sách liên kết đôi
1
Trang 22
Khái niệm DSLK đôi
Biểu diễn, quản lý DSLK đôi
Các thao tác trên DSLK đôi
Sao chép DSLK đôi
Sắp xếp trên DSLK đôi
Mục tiêu
Trang 31 Khái niệm
Mỗi phần tử có 2 mối liên kết với các phần
tử khác trong danh sách
Trang 42 Biểu diễn, quản lý DSLK đôi
Trang 55
Tạo danh sách rỗng
Thêm một phần tử vào danh sách
Tìm kiếm một giá trị trên danh sách
Trích một phần tử ra khỏi danh sách
Duyệt danh sách
Hủy toàn bộ danh sách
3 Các thao tác trên DSLK đôi
Trang 63.1 Khởi tạo danh sách
6
Thuật toán:
• Đầu vào: Danh sách cần khởi tạo
• Đầu ra: Danh sách sau khi khởi tạo
B1: Gán con trỏ pHead = NULL
B2: Gán con trỏ pTail = NULL
BKT: Kết thúc ;
Cài đặt thuật toán:
void KhoiTao(DList &l) {
l.pHead = NULL;
l.pTail = NULL;
}
Trang 73.2 Tạo mới một nút
Thuật toán:
• Đầu vào: Phần tử dữ liệu x
• Đầu ra: Nút p chứa dữ liệu x
B1: p = new DNode ;//cấp phát bộ nhớ cho con trỏ p B2: IF(p == NULL); // cấp phát không thành công
Trang 8Cài đặt thuật toán:
Trang 93.3 Thêm 1 nút vào danh sách
9
Thêm vào đầu danh sách
Thêm vào cuối danh sách
Thêm vào sau một nút q bất kỳ
Trang 1010
Thêm vào đầu danh sách
3.3 Thêm 1 phần tử vào danh sách
Trang 11Thuật toán thêm phần tử vào đầu danh sách:
• Đầu vào: Danh sách l; nút cần thêm p
• Đầu ra: Danh sách sau khi đã thêm nút p
B3: Nếu danh sách rỗng thì:
3.1: Đặt pHead = pTail = p;
3.2: Thực hiện BKT;
B4: Nếu danh sách không rỗng thì:
4.1: Điều chỉnh liên kết p ->Next = pHead
Trang 12Cài đặt thuật toán:
Void ThemDau (DList &l, DNode *p) {
Trang 13Bài tập 1: Trên ngôn ngữ C, viết chương trình thực hiện các yêu cầu sau:
1) Tạo một cấu trúc danh sách liên kết đôi, với
các thao tác:
Khởi tạo danh sách
Tạo mới 1 nút trong danh sách
Chèn một nút vào đầu danh sách
2) Sử dụng cấu trúc danh sách liên kết đôi vừa
tạo để lưu n số nguyên bất kỳ được nhập từ bàn phím:
13
Bài tập ứng dụng
Trang 14Thêm phần tử vào cuối danh sách
14
3.3 Thêm 1 phần tử vào danh sách
Trang 15Thuật toán thêm phần tử vào cuối danh sách:
• Đầu vào: Danh sách l; nút cần thêm p
• Đầu ra: Danh sách sau khi đã thêm nút p vào cuối
B3: Nếu danh sách rỗng thì:
3.1: Đặt pHead = pTail = p;
3.2: Thực hiện BKT;
B4: Nếu danh sách không rỗng thì:
4.1: Điều chỉnh liên kết l.pTail ->Next = p
Trang 16Cài thuật toán:
void ChenCuoi (DList &l, DNode*p){
Trang 17Bài tập 2: Mở rộng chương trình vừa viết bằng cách:
1) Bổ sung thêm thao tác chèn phần tử vào cuối
danh sách :
2) Tạo danh sách n số nguyên sử dụng thao tác
chèn phần tử vào cuối danh sách
17
Bài tập ứng dụng
Trang 18Thêm phần tử vào giữa danh sách (sau nút q)
18
3.3 Thêm 1 phần tử vào danh sách
Trang 19Thuật toán thêm phần tử vào sau phần tử q:
• Đầu vào: Danh sách l; nút q, nút cần thêm p
• Đầu ra: Danh sách sau khi đã thêm nút p sau nút q
B3: Nếu q là nút cuối trong danh sách thì:
3.1: Thực hiện thao tác ChenCuoi();
3.2: Thực hiện BKT;
B4: Nếu danh sách không rỗng thì:
4.1: Điều chỉnh liên kết l.pTail ->Next = p
Trang 20void ChenSau (DList &l, DNode *q, DNode *p) {
3.3 Thêm 1 phần tử vào danh sách
Cài đặt thuật toán:
Trang 21Bài tập 3: Mở rộng chương trình vừa viết:
Cho phép người dùng nhập:
+ Tạo nút p chứa giá trị x
+ Chèn nút p vào sau nút q
21
Bài tập ứng dụng
Trang 22Thuật toán:
Đầu vào: Danh sách cần duyệt l
Đầu ra: Tùy thuộc vào yêu cầu của bài toán
B1 Cho con trỏ p trỏ đến phần tử đầu danh sách;
B2: Bước lặp (thực hiện cho đến khi danh sách rỗng):
2.1: Xử lý phần tử p;
2.2: Cho p trỏ đến phần tử kế tiếp;
BKT: Kết thúc;
22
3.4 Duyệt danh sách
Trang 23Cài đặt thuật toán:
void DuyetDS (DList l)
Trang 24Bài tập 4: Mở rộng chương trình vừa viết:
+ Danh sách tạo bằng thao tác chèn đầu
+ Danh sách tạo bằng thao tác chèn cuối
24
Bài tập ứng dụng
Trang 253.5 Tìm kiếm phần tử
25
Thuật toán
• Đầu vào: Danh sách l, khóa tìm kiếm x
• Đầu ra: Con trỏ tới nút chứa khóa cần tìm
B1: p=pHead // p trỏ đến đầu danh sách
B2: Trong khi (p!= NULL) và (p->data != x)
Thực hiện p = p->next; // p trỏ tới phần tử kế BKT:
Nếu p!=NULL thi p trỏ tới phần tử cần tìm;
Ngược lại: không có phần tử cần tìm;
Trang 27Bài tập 5: Mở rộng chương trình vừa viết:
danh sách
xem có tồn tại nút trong danh sách chứa giá trị x Thông báo kết quả ra màn hình
27
Bài tập ứng dụng
Trang 283.6 Xóa phần tử trong danh sách
28
Nguyên tắc: Phải cô lập phần tử cần hủy
trước hủy
Các vị trị cần Xóa:
Xóa phần tử đứng đầu danh sách
Xóa phần tử có khoá bằng x
Xóa phần tử đứng sau q trong danh sách
Trang 293.6 Xóa phần tử trong danh sách
29
Thuật toán xóa phần tử ở đầu danh sách
• Đầu vào: Danh sách l
• Đầu ra: Danh sách sau khi đã xóa nút đầu
B1: p = l.pHead
B2: + l.pHead = l.pHead->Next;
+ l.pHead->Prev = NULL;
B3: if (l.pHead==NULL) //danh sách rỗng
Đặt lại l.pTail = NULL;
B4: delete p;
BKT: Kết thúc;
Trang 31Bài tập 6: Mở rộng chương trình vừa viết:
sách
Tạo danh sách n số nguyên
Hiển thị danh sách đã tạo ra màn hình
Xóa phần tử đầu danh sách và hiển thị danh sách sau khi đã xóa ra màn hình
31
Bài tập ứng dụng
Trang 323.6 Xóa phần tử trong danh sách
32
Thuật toán xóa phần tử ở cuối danh sách
• Đầu vào: Danh sách l
• Đầu ra: Danh sách sau khi đã xóa nút cuối
B1: p = l.pTail
B2: + l.pTail = l.pTail->Prev;
+ l.pTail->Next = NULL;
B3: if (l.pTail==NULL) //danh sách rỗng
Đặt lại l.pHead = NULL;
B4: delete p;
BKT: Kết thúc;
Trang 34Bài tập 7: Mở rộng chương trình vừa viết:
sách
Tạo danh sách n số nguyên
Hiển thị danh sách đã tạo ra màn hình
Xóa phần tử cuối danh sách và hiển thị danh sách sau khi đã xóa ra màn hình
34
Bài tập ứng dụng
Trang 353.6 Xóa phần tử trong danh sách
35
Thuật toán xóa phần tử có khóa k
• Đầu vào: Danh sách l, khóa k
• Đầu ra: Danh sách sau khi đã phần tử có khóa k
B1: p = TimKiem(l,k);
B2: if p!=NULL then
2.1 if p->Prev == NULL then xóa nút ở đầu ds;
2.2 else if p->Next ==NULL then xóa nút cuối ds; 2.3 else
+ p->Prev->Next = p->Next;
+ p->Next->Prev = p->Prev;
2.4 free (p)
BKT: Kết thúc;
Trang 36void XoaPhanTu(DList &l, int x){
Trang 37Bài tập 8: Mở rộng chương trình vừa viết:
kỳ
Tạo danh sách n số nguyên
Hiển thị danh sách đã tạo ra màn hình
Nhập vào 1 giá trị x cần xóa bất kỳ, tìm kiếm xem có tồn tại nút chứa giá trị x trong danh sách Nếu tìm thấy xóa x khỏi danh sách
37
Bài tập ứng dụng
Trang 38 Thực hiện nhiều lần thao tác hủy một nút
B1: if (l.pHead == NULL) Thực hiện BKT;
Trang 40Bài tập 10: Mở rộng chương trình vừa viết:
Tạo danh sách n số nguyên
Kiểm tra các thao tác thêm 1 phần tử vào sau nút q bất kỳ
Xóa 1 phần tử có khóa k
Hủy danh sách sau trước khi kết thúc chương trình
40
Bài tập ứng dụng
Trang 413.9 Sao chép danh sách
41
Thuật toán xóa phần tử có khóa k
• Đầu vào: Danh sách l1
• Đầu ra: Danh sách l2 được sao chép từ l1
Trang 424.3 Danh sách liên kết đôi (tt)
Trang 43Bài tập 11: Mở rộng chương trình vừa viết:
Trang 44Sắp xếp trên DSLK đôi
44
Trang 46Đánh giá ưu, nhược điểm
46
Trang 474 Đánh giá, ưu, nhược
4.1 Ưu nhược điểm của danh sách liên
kết
Nhược điểm
Mật độ sử dụng bộ nhớ của danh sách liên
kết không tối ưu tuyệt đối (<100%)
Việc truy xuất và tìm kiếm các phần tử trong
danh sách liên kết mất nhiều thời gian vì
phải duyệt tuần tự qua các phần tử trong danh sách
Bộ nhớ cần nhiều vì phải lưu thêm phần tử
liên kết, nếu vùng dữ liệu là lớn thì tỷ lệ mức sử dụng bộ nhớ là cao
47
Trang 48 Việc thêm, xóa phần tử trong danh sách liên
kết là dễ dàng, chỉ cần thay đổi mối liên kết của các phần tử với nhau
48