Danh sách liên kết (Linked List) Mô hình cấu trúc dữ liệu trừu tượng Linked List là một dãy các vị trí lữu trữ các đối tượng với số lượng tùy ý.
Bài Danh sách liên kết (Linked List) 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 header elem nod e trailer 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() Element *getElem() nút void setNext(Node *) - Trả lại địa nút - Trả lại địa phần tử mà trỏ tới nút - Đặ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 truy cập: Node *first() Node *last() Các phương thức cập nhật: void replace(Node *p, e) Node *insertAfter(Node *p, Elemnt e), Node * insertFirst(Element e) Node * insertLast(Element e) Node * getNode(int i) void remove(Node *p) 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 Remove Hình ảnh phép tố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 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ó 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 thu i khỏi DS - Thay sinh viên thứ I sinh viên Xây dựng chương trinh để chạy lớp ứng dụng 10 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 11 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() - 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 • void setNext(Node *) - Đặt thuộc tính Next trỏ đến đ/c phần tử đối phương thức • void setPre(Node *) - Đặt thuộc tính Prior trỏ đến đ/c phần tử đối phương thức • void setElem(Element e) - Đặt phần tử e vào nút 12 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: Node *first() Node *last() 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) 13 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 14 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 15 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 16 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 p q.setPrev(p) //liên kết q với phần tử trước 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 p.setNext(q) //liên kết p với q return q //trả lại vị trí q 17 Insert Before Hình ảnh phép tốn insertBefore(p, X), phép tốn trả lại vị trí q p heade r trailer A B C p heade r q A trailer B C X p heade r A q X trailer B C 18 Xóa - Remove Hình ảnh minh họa phép toán remove(p), p = last() p heade r A B C trailer D heade r trailer A B C p D heade r trailer A B C 19 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 20 So sánh mảng danh sách liên kết Những đặc trưng 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ử Những đặc trưng 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ử khơng phải 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) 21 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 22 Hết 23 ... //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... 11 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() - Trả lại địa nút - Trả lại địa nút trước - Trả lại... setNext(Node *) - Đặt thuộc tính Next trỏ đến đ/c phần tử đối phương thức • void setPre(Node *) - Đặt thuộc tính Prior trỏ đến đ/c phần tử đối phương thức • void setElem(Element e) - Đặt phần tử