Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 85 trang
THÔNG TIN TÀI LIỆU
Cấu trúc
Môn: CẤU TRÚC DỮ LIỆU
4. Danh sách liên kết (Linked List)
4. Danh sách liên kết (tt)
4.2. Danh sách liên kết đơn (SLL)
Slide 5
Slide 6
4.2. Danh sách liên kết đơn (tt)
Slide 8
Slide 9
Slide 10
Slide 11
Slide 12
Slide 13
Slide 14
Slide 15
Slide 16
Slide 17
Slide 18
Slide 19
Slide 20
Slide 21
Slide 22
Slide 23
Slide 24
Slide 25
Slide 26
Slide 27
Slide 28
Slide 29
Slide 30
Slide 31
Slide 32
Slide 33
Slide 34
Slide 35
Slide 36
Slide 37
Slide 38
Slide 39
Slide 40
Slide 41
Slide 42
Slide 43
Slide 44
Slide 45
Slide 46
Slide 47
Slide 48
Slide 49
DANH SÁCH LIÊN KẾT ĐÔI (KÉP) (DOUBLE LINKED LIST)
4.3. Danh sách liên kết đôi (DLL)
4.3. Danh sách liên kết đôi (tt)
Slide 53
Slide 54
Slide 55
Slide 56
Slide 57
Slide 58
Slide 59
Slide 60
Slide 61
Slide 62
Slide 63
Slide 64
Slide 65
Slide 66
Slide 67
Slide 68
Slide 69
Slide 70
Slide 71
Slide 72
Slide 73
Slide 74
Slide 75
Slide 76
Slide 77
Slide 78
Slide 79
Slide 80
Slide 81
Slide 82
Slide 83
4. Danh sách liên kết
Slide 85
Nội dung
Môn: CẤU TRÚC DỮ LIỆU Chương 6: DANH SÁCH (LIST) Danh sách liên kết (Linked List) 4.1 Định nghĩa 4.2 Danh sách liên kết đơn (Simply Linked List) 4.3 Danh sách liên kết kép (Doubly Linked List) 4.4 Danh sách liên kết vòng 4.5 Ưu nhược điểm danh sách liên kết Danh sách liên kết (tt) 4.1 Định nghĩa Là tập hợp phần tử mà chúng có nối kết với thơng qua vùng liên kết chúng Tùy cách liên kết phần tử, danh sách liên kết chia thành loại khác nhau: ◦ ◦ ◦ ◦ Danh sách liên kết đơn Danh sách liên kết đôi/kép Danh sách đa liên kết Danh sách liên kết vòng (vịng đơn, vịng đơi) Mỗi loại danh sách có cách biểu diễn theo cấu trúc liệu thao tác liệu khác 4.2 Danh sách liên kết đơn (SLL) 4.2 Danh sách liên kết đơn (SLL) 4.2.1 Cấu trúc liệu Nội dung phần tử (nút) danh sách liên kết gồm vùng Vùng liệu Vùng liên kết struct node { int data; node *link; // liên kết đến vùng phần tử }; data link 4.2 Danh sách liên kết đơn (SLL) 4.2.1 Cấu trúc liệu 4.2 Danh sách liên kết đơn (tt) 4.2.1 Cấu trúc liệu (tt) Để quản lý danh sách liên kết dùng nhiều phương pháp khác nhau, phương pháp có cấu trúc liệu cụ thể ◦ Quản lý địa phần đầu cuối danh sách struct List { Node *pHead; Node *pTail; }; pHead info pNext pTail 4.2 Danh sách liên kết đơn (tt) 4.2.1 Cấu trúc liệu (tt) 4.2 Danh sách liên kết đơn (tt) 4.2.2 Các thao tác danh sách liên kết đơn a Khởi tạo danh sách SLL b Tạo phần tử (nút) danh sách SLL c Thêm phần tử vào danh sách SLL Thêm vào đầu | cuối | danh sách liên kết đơn d Duyệt qua nút danh sách e Tìm kiếm phần tử danh sách f Hủy bỏ phần tử danh sách g Hủy danh sách h Tạo danh sách/Nhập danh sách i Tách danh sách thành nhiều danh sách j Nhập nhiều danh sách thành danh sách k Sắp xếp thứ tự phần tử danh sách 4.2 Danh sách liên kết đơn (tt) 4.2.2 Các thao tác danh sách liên kết đơn: Giả sử ta có định nghĩa sau: struct node{ int data; node *link; }; struct List{ node *pHead; node *pTail; }; node *p; List l; 4.3 Danh sách liên kết đôi (tt) 4.3.2.e Tìm kiếm phần tử danh sách Giả sử cần tìm kiếm danh sách liên kết đơn phần tử có phần liệu X Thuật toán: B1: P = L.First B2: IF (P == NULL OR P->info = X) Thực BKT B3: P = P ->Next B4: Lặp lại B2 BKT: Kết thúc 4.3 Danh sách liên kết đơi (tt) 4.3.2.e Tìm kiếm phần tử danh sách Cài đặt thuật toán: Node* search(List L, int X) { Node* P = L.First; while (P!= NULL) { if (P->data == X) break; P = P ->Next } return (P); } 4.3 Danh sách liên kết đôi (tt) 4.3.2.f Loại bỏ phần tử danh sách Thuật toán B1: Del = Timkiem(L, X) // Tìm kiếm nút DelData B2: IF(Del== NULL) Thực BKT B3: IF(Del->Pre=NULL AND Del->Next=NULL) B3.1: L.First = L.Last = NULL B3.2: Thực B8 B4: IF (Del ->Pre = NULL) // Loại nút DS B4.1: L.First = L.First ->Next B4.2: L.First ->Pre = NULL B4.3: Thực B8 4.3 Danh sách liên kết đôi (tt) 4.3.2.f Loại bỏ phần tử danh sách Thuật toán B5: IF (Del ->Next = NULL) // Loại nút cuối DS B4.1: L.Last = L.Last ->Pre B4.2: L.Last ->Next= NULL B4.3: Thực B8 // Liên kết nút trước sau nút bị xóa B6: Del->Pre ->Next = Del->Next B7: Del->Next->Pre= Del->Pre // Bỏ mối liên kết Del nút trước & sau B8: Del->Next = Del ->Pre= NULL B9: delete Del BKT: Kết thúc 4.3 Danh sách liên kết đôi (tt) Cài đặt thuật toán: int DeleteNode (List &L, int X){ Node* Del = search(L, X) if (Del == NULL) return (-1); if (Del->Next == NULL && Del ->Pre == NULL) L.First = L.Last = NULL; else if (Del ->Pre==NULL){ L.First = L.First ->Next ; L.First ->Pre= NULL; } else 4.3 Danh sách liên kết đôi (tt) } if (Del ->Next ==NULL){ L.Last = L.Last ->Pre ; L.Last ->Next = NULL; } else{ Del ->Pre ->Next = Del ->Next; Del ->Next ->Pre = Del ->Pre ; } del->next=del->pre=NULL; free(del); return 1; 4.3 Danh sách liên kết đơi (tt) 4.3.2.g Hủy tồn danh sách Thực nhiều lần thao tác hủy nút Thuật toán B1: IF (L.LFirst == NULL) Thực BKT B2: Temp = L.First B3: L.First = L.First ->Next B4: IF (L.First == NULL) B4.1: L.Last = NULL B4.2: Thực B7 B5: L.First ->Pre = NULL B6: Temp ->Next = NULL B7: delete Temp B8: Lặp lại B1 BKT: Kết thúc 4.3 Danh sách liên kết đôi (tt) 4.3.2.g Hủy toàn danh sách (tt) Cài đặt thuật toán void DeleteList (List &L){ Node* Temp = L.First; while (Temp!= NULL){ L.First = L.First ->Next; Temp ->Next = NULL; if (L.First != NULL) L.First ->Pre = NULL; delete Temp; Temp=L.First; } } 4.3 Danh sách liên kết đôi (tt) 4.3.2.h Tạo danh sách mới/Nhập danh sách Thuật toán B1: Khoitao(L) B2: i= B3: IF (i >N) Thực BKT B4: X = Nhapgiatri(); B5: Themcuoi(L, X) B6: i++ B7: Lặp lại B3 BKT: Kết thúc 4.3 Danh sách liên kết đôi (tt) 4.3.2.h Tạo danh sách mới/Nhập danh sách Cài đặt thuật toán void CreateList(List &L, int n) { init(L); int X; for (int i=1; i Key < Jnode ->Pre->Key) Swap(Jnode->Key,Jnode->Pre->Key) Jnode = Jnode ->Pre ; } Inode = Inode ->Next ; } return; } 4.3 Danh sách liên kết đôi (tt) 4.3.2.l Sao chép danh sách thành danh sách Thuật toán B1: KhoitaoDS(NewList) B2: P = L.First B3: IF (P == NULL) Thực BKT B4: Themcuoi(NewList, P->Key) B5: P = P ->Next B6: Lặp lại B3 BKT: Kết thúc 4.3 Danh sách liên kết đôi (tt) 4.3.2.l Sao chép danh sách thành danh sách Cài đặt thuật toán List DLLCopy(List &L, List &NewList) { KhoitaoDS(NewList); Node* P = L.First; while (P!= NULL) { if (Themcuoi(NewList, P->Key) == NULL) { XoaDS(NewList); break; } P= P ->Next ; } return (NewList); } Danh sách liên kết 4.4 Ưu nhược điểm danh sách liên kết Nhược điểm ◦ Mật độ sử dụng nhớ danh sách liên kết không tối ưu tuyệt đối (