Bài giảng Cấu trúc dữ liệu và giải thuật: Danh sách liên kết - Nguyễn Mạnh Hiển (HKI năm 2020-2021)

35 39 0
Bài giảng Cấu trúc dữ liệu và giải thuật: Danh sách liên kết - Nguyễn Mạnh Hiển (HKI năm 2020-2021)

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài giảng Cấu trúc dữ liệu và giải thuật: Danh sách liên kết cung cấp cho người học các kiến thức: Danh sách liên kết, danh sách liên kết đơn, danh sách liên kết đôi, danh sách liên kết vòng tròn. Mời các bạn cùng tham khảo nội dung chi tiết.

Danh sách liên kết (Linked Lists) Nguyễn Mạnh Hiển hiennm@tlu.edu.vn Nội dung Danh sách liên kết Danh sách liên kết đơn Danh sách liên kết đôi Danh sách liên kết vòng tròn Danh sách liên kết Danh sách liên kết • Là tập nút liên kết với theo trật tự tuyến tính (có trước có sau) • Mỗi nút chứa: − phần tử; − hai liên kết tới nút lân cận • Các nút nằm rải rác nhớ máy tính (trong phần tử mảng vector nằm liên tục) Các kiểu danh sách liên kết Danh sách liên kết đơn Danh sách liên kết đơi Danh sách liên kết vịng trịn Danh sách liên kết đơn Danh sách liên kết đơn • Mỗi nút có liên kết trỏ tới nút − Riêng nút cuối khơng có nút kế tiếp, trỏ NULL • Các thao tác chính: − Chèn phần tử vào đầu danh sách; − Xóa phần tử đầu danh sách; − Lấy phần tử đầu danh sách Cài đặt danh sách liên kết đơn template class SingleList { public: Hàm tạo, hàm hủy; Chèn/xóa đầu danh sách; Lấy phần tử đầu danh sách; private: struct Node { }; // Kiểu liệu nút Node * head; // Con trỏ tới nút đầu danh sách }; Kiểu liệu nút struct Node { T elem; // Phần tử Node * next; // Liên kết tới nút // Hàm tạo // (e: phần tử; n: địa nút kế tiếp) Node(T e, Node * n) { elem = e; next = n; } }; Hàm tạo hàm hủy SingleList() { head = NULL; // Ban đầu danh sách rỗng } // Hàm hủy dùng hàm empty để kiểm tra danh sách // rỗng, dùng hàm popFront để xóa phần tử đầu // danh sách (hai hàm ta lập trình sau) ~SingleList() { while (!empty()) // Cứ xóa phần tử popFront(); // danh sách } // rỗng thơi Khai báo thao tác DoubleList(); ~DoubleList(); bool empty(); T front(); T back(); T current(); void moveNext(); void movePrevious(); void moveFront(); void moveBack(); // // // // // // // // // // Hàm tạo Hàm hủy Kiểm tra rỗng Lấy phần tử đầu danh sách Lấy phần tử cuối danh sách Lấy phần tử hành Chuyển sang nút Chuyển nút liền trước Chuyển đầu danh sách Chuyển cuối danh sách Khai báo thao tác (tiếp) void void void void pushFront(T e); pushBack(T e); popFront(); popBack(); // // // // Chèn vào đầu danh sách Chèn vào cuối danh sách Xóa đầu danh sách Xóa cuối danh sách // Chèn vào (ngay trước) vị trí hành void insert(T e); // Xóa phần tử vị trí hành void remove(); Chèn vào trước vị trí hành Chèn vào trước nút (nút v) Đây nút cần chèn (nút u) Chèn vào trước vị trí hành (tiếp) // Trước chèn: nút trước (v->prev)  nút sau (v) // (nút sau nút hành) void insert(T e) { // e phần tử cần chèn DNode * v = currentPos; // Nút hành DNode * u = new DNode; // Nút cần chèn u->elem = e; // Nút chứa phần tử mới, u->next = v; // trỏ tới nút sau u->prev = v->prev; // trỏ nút trước v->prev->next = u; // Nút trước trỏ tới nút v->prev = u; // Nút sau trỏ nút } Xóa phần tử vị trí hành Nút trước (nút u) Nút cần xóa (nút v) Nút sau (nút w) Xóa phần tử vị trí hành (tiếp) // nút trước (u)  nút cần void remove() { DNode * v = currentPos; DNode * u = v->prev; DNode * w = v->next; xóa (v)  nút sau (w) // Nút hành cần xóa // Nút trước // Nút sau u->next = w; w->prev = u; // Nút trước trỏ tới nút sau // Nút sau trỏ nút trước delete v; // Xóa nút hành cũ currentPos = w; // Nút sau thành nút hành } Danh sách liên kết vòng tròn Danh sách liên kết vòng tròn • Cấu trúc tương tự danh sách liên kết đơn • Có thêm trỏ đặc biệt cursor trỏ đến cuối danh sách (back); liên kết next nút cuối trỏ vịng đầu danh sách (front) • Các thao tác chính: − Chèn xóa sau cursor (đồng nghĩa với đầu danh sách); − Lấy phần tử đầu cuối danh sách; − Dịch chuyển cursor sang vị trí Cài đặt danh sách liên kết vòng tròn template class CircleList { public: Hàm tạo, hàm hủy, kiểm tra rỗng; Chèn/xóa sau cursor; Lấy phần tử đầu cuối danh sách; Dịch chuyển cursor sang vị trí tiếp theo; private: struct CNode { }; // Kiểu nút CNode * cursor; // Con trỏ đặc biệt (trỏ }; // tới cuối danh sách) Kiểu liệu nút struct CNode { T elem; // Phần tử CNode * next; // Liên kết tới nút }; Chú ý: Vì cấu trúc CNode khơng có hàm tạo, tạo nút phải khởi tạo giá trị cho trường (elem next) thông qua câu lệnh gán riêng biệt Khai báo thao tác CircleList(); ~CircleList(); bool empty(); T front(); T back(); void moveNext(); void insert(T e); void remove(); // // // // // // // // Hàm tạo Hàm hủy Kiểm tra rỗng Lấy phần tử đầu danh sách Lấy phần tử cuối danh sách Dịch chuyển cursor Chèn vào sau cursor Xóa nút sau cursor Chèn vào sau cursor // Chèn phần tử (e) vào sau cursor (đầu danh sách) void insert(T e) { CNode * v = new CNode; // Tạo nút (v) v->elem = e; // Nút chứa phần tử if (cursor == NULL) { // Nếu danh sách rỗng, v->next = v; // nút trỏ tới cursor = v; // cursor trỏ tới nút (vì } // nút nút cuối) else { // Nếu danh sách có phần tử, v->next = cursor->next; // nút trỏ tới nút đầu cursor->next = v; // nút trở thành nút đầu } // Chú ý cursor->next giữ địa nút đầu } Xóa nút sau cursor void remove() { CNode * old = cursor->next; // Giữ lại địa // nút cần xóa (nút đầu) if (old == cursor) // Nếu danh sách có nút // (nút đầu cuối trùng nhau), cursor = NULL; // danh sách rỗng sau xóa else // Nếu danh sách có nhiều nút, cursor->next = old->next; // nút thứ hai trở // thành nút đầu delete old; // Xóa nút đầu cũ } Bài tập Vì hàm hủy danh sách liên kết đơn tốn thời gian chạy O(n), vector O(1)? Hãy đề xuất thuật tốn chèn/xóa cuối danh sách liên kết đơn? So sánh thời gian chạy với thao tác chèn/xóa đầu danh sách? Trong trường hợp thuật tốn đề xuất chạy chậm hơn, có cách làm cho chạy nhanh khơng? Hãy đề xuất thuật toán truy nhập phần tử danh sách liên kết đơn thông qua số So sánh thời gian chạy thuật toán với thuật toán tương ứng vector Bài tập Vì chèn/xóa danh sách liên kết (đơn, đơi vịng trịn) chạy nhanh chèn/xóa vector? Nêu ứng dụng danh sách liên kết vòng tròn (Gợi ý: chương trình nghe nhạc) Phải điều chỉnh ứng dụng dùng danh sách liên kết đơn thay cho danh sách liên kết vòng tròn? ...Nội dung Danh sách liên kết Danh sách liên kết đơn Danh sách liên kết đôi Danh sách liên kết vòng tròn Danh sách liên kết Danh sách liên kết • Là tập nút liên kết với theo trật tự... hai liên kết tới nút lân cận • Các nút nằm rải rác nhớ máy tính (trong phần tử mảng vector nằm liên tục) Các kiểu danh sách liên kết Danh sách liên kết đơn Danh sách liên kết đôi Danh sách liên. .. Lấy phần tử đầu danh sách: O(1) Chèn/xóa đầu danh sách: O(1) Danh sách liên kết đơi Danh sách liên kết đơi • Mỗi nút chứa phần tử hai liên kết: − liên kết tới nút (next); − liên kết nút liền trước

Ngày đăng: 05/11/2020, 18:13

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan