Bài giảng Cấu trúc dữ liệu và giải thuật trong C++ - Bài 7: Danh sách liên kết cung cấp cho người học các kiến thức: Vấn đề của Mảng, danh sách liên kết, cấu trúc của một Node, cấu trúc danh sách liên kết đơn,... Mời các bạn cùng tham khảo nội dung chi tiết.
Bài Danh sách liên kết (Linked List) Vấn đề Mảng Xét lại vấn đề sử dụng mảng để tạo danh sách : Thêm phần tử : O(n) Xoá phần tử : O(n) Số phần tử mảng cố định!!! Vấn đề Mảng Làm thêm (hay xố) phần tử mà di chuyển phần tủ khác? Làm để danh sách “động” hơn? Cần dùng cấu trúc lưu trữ với yêu cầu Các phần tử phải tách rời Và nối với “dây liên kết” Khi thêm phần tử cần thay đổi mối liên kết chi phí xử lý thấp DANH SÁCH LIÊN KẾT Mơ hình cấu trúc liệu trừu tượng Linked List dãy vị trí lữu trữ đối tượng với số lượng tùy ý Nó thiết lập mối quan hệ trước/sau vị trí Danh sách liên kết đơn Danh sách liên kết kép Danh sách liên kết đơn Các nút (node) cài đặt bao gồm: next Phần tử lưu trữ Một liên kết đến nút Sử dụng môt trỏ header, trỏ vào node đầu danh sách trỏ trailer trỏ vào node cuối danh sách elem node trailer header node NULL elem Cấu trúc Node Các thuộc tính Element *elem; Node *next; Các phương thức Node *getnext() - Trả lại địa nút Element *getElem() - Trả lại địa phần tử mà nút trỏ tới nút void setNext(Node *) - Đặt thuộc tính next trỏ đến đ/c phần tử đối phương thức void setElem(Element e) - Đặt phần tử e vào nút Cấu trúc danh sách liên kết đơn Các thuộc tính: Node *header Node *trailer Các phương thức chung: long size(), int isEmpty() Các phương thức cập nhật: void replace(Node *p, Element e) Node *insertAfter(Node *p, Element e) Node * insertFirst(Element e) Node * insertLast(Element e) Node * getNode(int i) void remove(Node *p) Các phương thức truy cập: Node *first() Node *last() Insertion First Hình ảnh phép tốn insertFirst(), phép tốn trả lại vị trí q trailer header NULL A B C trailer header NULL X q A B C trailer header NULL X A B C Insertion Last Hình ảnh phép tốn insertLast(), phép tốn trả lại vị trí q trailer header NULL A B C trailer header NULL A B NULL C X q trailer header NULL A B C X Insertion After Hình ảnh phép tốn insertAfter(p, X), phép tốn trả lại vị trí q trailer p header NULL A B C trailer header NULL A B X C trailer header NULL A B X C 10 Remove Hình ảnh phép toán remove(p) trailer p header NULL A B C X trailer header p A B X NULL C trailer header NULL A B C 11 Bài tập nhà Xây dựng lớp ứng dụng sử dụng lớp Danh sách liên kết đơn để lưu trữ danh sách sinh viên Mỗi sinh viên gồm thông tin sau: MaSv, Hoten, Ngay, Thang, Nam sinh, gioi tinh, que quan Lớp có chức sau: -Thêm sinh viên vào cuối DS - Thêm sinh viên vào đầu DS - Xóa bỏ sinh viên thu i khỏi DS - Thay sinh viên thứ i sinh viên Xây dựng chương trình để chạy lớp ứng dụng 12 Danh sách liên kết kép Các nút (node) cài đặt bao gồm: Phần tử lưu trữ Một liên kết đến nút trước Một liên kết đến nút Có hai nút đặc biệt trailer header header prev next elem node n trailer Elem 13 Cấu trúc Node Các thuộc tính • • Element *elem; Node *next, *pre; Các phương thức • Node *getnext() Node *getPre() Element *getElem() void setNext(Node *) • void setPre(Node *) • void setElem(Element e) • • • - Trả lại địa nút Trả lại địa nút trước Trả lại địa phần tử lưu nút Đặt thuộc tính Next trỏ đến đ/c phần tử đối phương thức - Đặt thuộc tính Prior trỏ đến đ/c phần tử đối phương thức - Đặt phần tử e vào nút 14 Cấu trúc Danh sách liên kết kép Các thuộc tính: Node *header Node *trailer Các phương thức chung: long size(), int isEmpty() Các phương thức truy cập: Các phương thức cập nhật: void replace(Node *p, e) Node *insertAfter(Node *p, Elemnt e) Node *insertBefore(Node *p, Element e) Node * insertFirst(Element e) Node * insertLast(Element e) Node * getNode(int i) void remove(Node *p) Node *first() Node *last() 15 Insert First Hình ảnh phép tốn insertFirst(X), phép tốn trả lại vị trí q header trailer A B C trailer header q A B C X header q p X trailer A B C 16 Insert Last Hình ảnh phép tốn insertLast( X), phép tốn trả lại vị trí q header trailer A B C trailer header A B q C X q header A B C trailer X 17 Insert After Hình ảnh phép tốn insertAfter(p, X), phép tốn trả lại vị trí q p A B C p A q B C X p A q B X C 18 Thuật toán Insert After Algorithm insertAfter(p,e): //Bổ sung phần tử e vào sau // phần tử nút p Tạo nút q q->setElement(e) //Đặt gia trị e vào nút q q->setNext(p->getNext())//liên kết với phần tử sau p.getNext()->setPrev(q)//Liên kết phần tử sau p với q q->setPrev(p) //liên kết q với phần tử trước p->setNext(q) //liên kết p với q return q //trả lại vị trí q 19 Insert Before Hình ảnh phép tốn insertBefore(p, X), phép tốn trả lại vị trí q p header A trailer B C p header q A trailer B C X p header A q X trailer B C 20 Xóa - Remove Hình ảnh minh họa phép tốn remove(p), p = last() p header A B C trailer D header trailer A B C p D header trailer A B C 21 Thuật toán remove Algorithm remove(Node *p): //kết nối phần tử trước p với phần tử sau p p->getPre()->setNext(p->getNext()) //kết nối phần tử sau p với pần tử trước p p->getNext()->setPre(p->getPre()) //bỏ kết nối p với phần tử trước p.setPre(NULL) p.setNext(NULL) delete p 22 So sánh mảng DSLK Mảng Bộ nhớ sử dụng lưu trữ phụ thuộc vào việc cài đặt số lượng thực cần lưu Mối quan hệ phần tử đầu phần tử khác Các phần tử xếp cho phép tìm kiếm nhanh Việc chèn xóa phần tử địi hỏi phải di chuyển phần tử Danh sách liên kết Bộ nhớ sử dụng để lưu trữ tương ứng với số lượng phần tử thực cần lưu tai thời điểm Sử dụng trỏ để lưu phần tử đầu, từ đến phần tử khác Việc bổ sung xóa bỏ phần tử di chuyển phần tử Truy nhập đến phần tử thực cách dọc theo chuỗi mắt xích từ phần tử đầu Vì danh sách liên kết đơn thời gian tìm kiếm phần tử O(n) 23 Bài tập - Xây dựng lớp Node Xây dựng lớp DblList Xây dựng lớp DblItr //Lớp lặp Xây dựng lớp ứng dụng sử dụng lớp Danh sách liên kết đơn để lưu trữ danh sách sinh viên Mỗi sinh viên gồm thông tin sau: MaSv, Hoten, Ngay, Thang, Nam sinh, gioi tinh, que quan Lớp có các chức sau: - Thêm sinh viên vào cuối DS - Thêm sinh viên vào đầu DS - Xóa bỏ sinh viên thứ i khỏi DS - Thay sinh viên thứ i sinh viên Xây dựng chương trình để chạy lớp ứng dụng 24 Hết 25 ... Danh sách liên kết đơn Danh sách liên kết kép Danh sách liên kết đơn Các nút (node) cài đặt bao gồm: next Phần tử lưu trữ Một liên kết đến nút Sử dụng môt trỏ header, trỏ vào node đầu danh. .. cấu trúc lưu trữ với yêu cầu Các phần tử phải tách rời Và nối với “dây liên kết? ?? Khi thêm phần tử cần thay đổi mối liên kết chi phí xử lý thấp DANH SÁCH LIÊN KẾT Mơ hình cấu trúc liệu. .. sau: -Thêm sinh viên vào cuối DS - Thêm sinh viên vào đầu DS - Xóa bỏ sinh viên thu i khỏi DS - Thay sinh viên thứ i sinh viên Xây dựng chương trình để chạy lớp ứng dụng 12 Danh sách liên kết