Bài 3 Cấu trúc dữ liệu biểu diễn danh sách (P3) Bài 5 Danh sách liên kết Giảng viên Hoàng Thị Điệp Khoa Công nghệ Thông tin – Đại học Công Nghệ HK I, 2012 2013 3 cách để liên kết dữ liệu • Mảng tập hợ[.]
HK I, 2012-2013 Bài 5: Danh sách liên kết Giảng viên: Hồng Thị Điệp Khoa Cơng nghệ Thơng tin – Đại học Công Nghệ cách để liên kết liệu • Mảng: tập hợp phần tử kiểu • struct/class: tập hợp thành phần có kiểu (có thể) khác • Con trỏ diepht@vnu INT2203/w05 Các KDLTT học • KDLTT danh sách • KDLTT tập động – Phép tốn • • • • • • – Phép tốn insert delete append at length empty • • • • • • • – Cài đặt – Cài đặt • mảng tĩnh • mảng động diepht@vnu insert delete search max empty length • mảng động khơng • mảng động INT2203/w05 Nhận xét • Độ phức tạp cài đặt danh sách mảng – – – – truy cập: getElement(A, i) cập nhật: update(A, i) xen thêm giá trị x: insert(A, i, x) xóa bớt: del(A, i) • Danh sách liên kết giúp insert del hiệu diepht@vnu INT2203/w05 KDLTT danh sách • Cài mảng – at: O(1) – insert: O(N) – delete: O(N) diepht@vnu • Cài danh sách liên kết INT2203/w05 So sánh Mảng Giống Khác diepht@vnu Danh sách liên kết Các phần tử có kiểu có thứ tự Bố cục logic giống với bố cục vật lý nhớ máy tính INT2203/w05 Bố cục logic khơng cần phải giống với bố cục vật lý Khái niệm • DSLK tạo thành từ nút – nút gồm phần • phần liệu: chứa phần tử liệu • phần trỏ: chứa địa – nút liên kết với thông qua trỏ liệu Nội Bài diepht@vnu trỏ liệu trỏ Đà Nẵng INT2203/w05 [dữ liệu] [con trỏ] liệu trỏ Tân Sơn Nhất DSLK C++ • Mỗi nút biến Node • Nút cuối có giá trị next NULL • Xác định DSLK địa nút danh sách – gọi biến lưu địa trỏ đầu head – khởi tạo danh sách rỗng: struct Node{ Item data; Node * next; }; Node * head = NULL; head Nội Bài diepht@vnu Đà Nẵng INT2203/w05 Tân Sơn Nhất DSLK C++ struct Node{ Item data; Node * next; }; Node * head; Node * tail; • Có thể sử dụng thêm trỏ tail để thao tác DSLK thuận lợi – danh sách rỗng head = tail = NULL; head tail Nội Bài diepht@vnu Đà Nẵng INT2203/w05 Tân Sơn Nhất typedef int Item; struct Node{ Item data; Node * next; }; struct SList{ Node * head; Node * tail; long size; SList(); ~SList(); Node* findPrevious(Node* p); Node* addFirst(const Item& v); Node* addLast(const Item& v); Node* insertAfter(Node* p, const Item& v); Node* insertBefore(Node* p, const Item& v); void removeFirst(); void remove(Node*& p); void print(); }; diepht@vnu INT2203/w05 10 Thêm vào sau nút p p head tail Đà Nẵng Nội Bài Nội Bài tail p head diepht@vnu Tân Sơn Nhất Cam Ranh Đà Nẵng INT2203/w05 x Tân Sơn Nhất 14 insertAfter(p, v) Algorithm insertAfter(p, v) Input liệu v cần thêm vào sau nút p danh sách Output q new Node() {tạo nút mới} (*q).data v {nút chứa liệu v} (*q).next (*p).next {nút chứa trỏ đến nút sau p} (*p).next q {nút p chứa trỏ đến nút mới} size size + {tăng biến đếm nút} cập nhật tail Nội Bài diepht@vnu tail p head Cam Ranh Đà Nẵng INT2203/w05 x Tân Sơn Nhất 15 Thêm vào trước nút p p head Nội Bài head Đà Nẵng Tân Sơn Nhất p Phú Bài Nội Bài diepht@vnu tail x Đà Nẵng INT2203/w05 tail Tân Sơn Nhất 16 insertBefore(p, v) Algorithm insertBefore(p, v) Input liệu v cần thêm vào trước nút p danh sách Output if p = head then addFirst(v) else tìm nút pre liền trước p insertAfter(pre, v) head Nội Bài diepht@vnu p Phú Bài x Đà Nẵng INT2203/w05 tail Tân Sơn Nhất 17 Thêm vào cuối danh sách tail head Nội Bài Đà Nẵng Tân Sơn Nhất tail Phú Quốc x head Nội Bài diepht@vnu Đà Nẵng Tân Sơn Nhất INT2203/w05 18 addLast(v) Algorithm addLast(v) Input liệu v cần thêm vào cuối danh sách Output q new Node() {tạo nút mới} (*q).data v {nút chứa liệu v} {nút chứa trỏ NULL} (*q).next NULL (*tail).next q {nút tail cũ chứa trỏ đến nút mới} {tail trỏ đến nút mới} tail q size size + {tăng biến đếm nút} tail head Nội Bài diepht@vnu Đà Nẵng Phú Quốc Tân Sơn Nhất INT2203/w05 19 Xóa nút đầu danh sách tail head Nội Bài Đà Nẵng Tân Sơn Nhất Tân Sơn Nhất tail head x Nội Bài diepht@vnu Đà Nẵng INT2203/w05 20 removeFirst() Algorithm removeFirst() Input Output if head = null then báo lỗi: danh sách rỗng t head head (*head).next {trỏ head đến nút sau nó} delete t {giải phóng vùng nhớ trỏ head cũ} {giảm biến đếm nút} size size - cập nhật tail tail head x Nội Bài diepht@vnu Đà Nẵng Tân Sơn Nhất INT2203/w05 21 Xóa nút khơng phải đầu danh sách p head tail Đà Nẵng Nội Bài Tân Sơn Nhất p head tail x Nội Bài diepht@vnu x Đà Nẵng INT2203/w05 Tân Sơn Nhất 22 remove(p) Algorithm remove(p) Input nút p cần xóa khỏi danh sách Output if p=head then removeFirst() else tìm nút pre liền trước p {pre chứa trỏ đến nút sau p} (*pre).next (*p).next delete p {giải phóng vùng nhớ trỏ p} size size - {giảm biến đếm nút} cập nhật tail p head tail x Nội Bài diepht@vnu x Đà Nẵng INT2203/w05 Tân Sơn Nhất 23 Các dạng DSLK • DSLK đơn – singly linked list, uni-directional list, one-way list • DSLK kép – doubly linked list, bi-directional list • DSLK vịng trịn – ring list diepht@vnu INT2203/w05 24 tail head Nội Bài Đà Nẵng tail head Nội Bài diepht@vnu Tân Sơn Nhất Đà Nẵng INT2203/w05 Tân Sơn Nhất 25 Cài đặt danh sách DSLK • Sinh viên tự nghiên cứu chương 5.4, 5.5 diepht@vnu INT2203/w05 26 Câu hỏi • Hãy mơ tả cấu trúc DSLK định nghĩa đoạn mã sau typedef struct Node ListNode; struct Node{ int data; ListNode *next; } typedef struct Node ListNode; struct Node{ int data; ListNode* next; } typedef struct FirstNode *LinkedList; struct FirstNode{ ListNode *first; } typedef struct FirstNode* LinkedList; struct FirstNode{ ListNode* first; } diepht@vnu INT2203/w05 27 Chuẩn bị tới • Đọc chương 6, giáo trình diepht@vnu INT2203/w05 28