Các loại danh sách liên kết Danh sách liên kết đơn M i phần tử có M T liên kết đến M T phần tử khác phần tử đứng sau... Các loại danh sách liên kết Danh sách liên kết kép M i phần tử
Trang 1Trường Đại học Khoa học Tự nhiên
Khoa Công nghệ thông tin
KỸ THUẬT LẬP TRÌNH
DANH SÁCH LIÊN KẾT
Trang 2Nội dung trình bày
Giới thiệu
Các loại danh sách liên kết
Các thao tác trên danh sách liên kết
So sánh danh sách liên kết và mảng
Trang 5Giới thiệu
Thực tế:
Không xác định được chính xác số lượng
phần tử
• Danh sách bệnh nhân: tăng/giảm
• Danh sách sinh viên: tăng/giảm
Vùng nhớ thay đổi trong quá trình sử dụng
=> Không đủ vùng nhớ cấp phát liên tục
Trang 6Các loại danh sách liên kết
Danh sách liên kết đơn
singly linked list
uni-directional linked list
Danh sách liên kết kép
doubly linked list
bi-directional linked list
Danh sách liên kết vòng
circularly linked list
ring list
Trang 7Các loại danh sách liên kết
Danh sách liên kết đơn
M i phần tử có M T liên kết đến M T phần tử khác (phần tử đứng sau)
Trang 8Các loại danh sách liên kết
Danh sách liên kết kép
M i phần tử có HAI liên kết đến hai phần tử
đứng sau và trước nó
Trang 9Các loại danh sách liên kết
Danh sách liên kết vòng
Có mối liên kết giữa phần tử cuối và phần tử
đầu
Trang 10Phần tử trên danh sách liên kết
Trang 11Phần tử trên danh sách liên kết
Trang 12Phần tử trên danh sách liên kết
Trang 13Phần tử trên danh sách liên kết
Trang 14Phần tử trên danh sách liên kết
Trang 15Phần tử trên danh sách liên kết
Trang 16Phần tử trên danh sách liên kết
Trang 17Phần tử trên danh sách liên kết
Trang 18Phần tử trên danh sách liên kết
Cài đặt
Viết cài đặt cấu trúc phần tử trong trường hợp
Trang 19Tổ chức danh sách liên kết
Tổ chức
M i danh sách liên kết bao gồm:
Con trỏ đến phần tử đầu (hoặc/và cuối) danh sách
(Các) phần tử trên danh sách
• Dữ liệu
• Các mối liên kết
Trang 20Tổ chức danh sách liên kết
Tổ chức
pHead
Trang 23pNode -> number = Data;
pNode -> pNext = NULL;
Trang 25pNode -> number = Data;
pNode -> pPrevious = NULL;
pNode -> pNext = NULL;
Trang 26Các thao tác trên danh sách
Trang 27Các thao tác trên danh sách liên kết
Trang 28Các thao tác trên danh sách liên kết
Thêm phần tử
Vào đầu danh sách:
int AddHead (NODE* & pHead , float Data );
Nếu danh sách r ng
• Phần tử vừa thêm là phần tử đầu danh sách
Ngược lại,
pHead
Trang 29Các thao tác trên danh sách liên kết
Thêm phần tử
Vào đầu danh sách:
Nếu danh sách r ng
if (pHead == NULL) {
}
Ngược lại
else {
Trang 30Các thao tác trên danh sách liên kết
Thêm phần tử
Vào đầu danh sách:
int AddHead (NODE* & pHead , float Data )
{
NODE *pNode;
pNode = CreateNode (Data );
if ( pNode == NULL ) return 0;
Trang 31Các thao tác trên danh sách liên kết
Trang 32Các thao tác trên danh sách liên kết
• Tạo node mới có dữ liệu là Data
• Cập nhật lại liên kết của pNode và node vừa tạo
X
pNode
Trang 33Các thao tác trên danh sách liên kết
Trang 34Các thao tác trên danh sách liên kết
Thêm phần tử
Vào cuối danh sách:
int AddLast (NODE* & pHead , float Data );
int AddLast (NODE *& pHead , NODE* & pTail ,
float Data );
Trang 35Các thao tác trên danh sách liên kết
Duyệt danh sách
Đảm bảo việc truy xuất đến tất cả các phần tử trên danh sách
Thuật toán:
Bắt đầu từ phần tử đầu tiên
Trong khi chưa hết danh sách
• Xử lý phần tử hiện hành
• Di chuyển đến phần tử kế tiếp
Trang 36Các thao tác trên danh sách liên kết
Trang 37Các thao tác trên danh sách liên kết
Trang 38Các thao tác trên danh sách liên kết
Trang 39Các thao tác trên danh sách liên kết
Trang 40Các thao tác trên danh sách liên kết
Trang 41Các thao tác trên danh sách liên kết
Xoá phần tử
Cuối danh sách:
Cập nhật lại pTail
Xóa pTail cũ
Trang 42Các thao tác trên danh sách liên kết
Trang 43Các thao tác trên danh sách liên kết
Trang 44Các thao tác trên danh sách liên kết
Trang 45Các thao tác trên danh sách liên kết
Trang 46Các thao tác trên danh sách liên kết
Bài tập 1
Cho m t DSLK đơn, m i node trong DSLK lưu thông tin là 1 số nguyên và con trỏ đến node kế Tạo 2 DSLK đơn mới (không phá huỷ DSLK đã cho)
M t danh sách chứa các số lẻ của danh sách
đã cho
M t danh sách chứa các số chẵn của danh
sách đã cho
Trang 47Các thao tác trên danh sách liên kết
Trang 48Các thao tác trên danh sách liên kết
Bài tập 2
Cho danh sách liên kết đơn L, lập giải thuật thực hiện các phép sau đây:
Tính số lượng các nút của danh sách
Tìm tới nút thứ k trong danh sách, nếu có nút thứ k thì cho biết địa chỉ của nút đó, ngược lại trả về null
Bổ sung m t nút vào sau nút k
Loại bỏ nút đứng trước nút k
Trang 49Các thao tác trên danh sách liên kết
Bài tập 2
Cho con trỏ M trỏ tới 1 node có trong danh
sách nói trên và m t danh sách đơn khác có node đầu tiên là P Chèn danh sách P vào
sau nút trỏ bởi M
Đảo ngược danh sách đã cho
Trang 50Các thao tác trên danh sách liên kết
Bài tập 3
Hàm MoveToFront có tác dụng di chuyển 1
node trong xâu lên đầu xâu, như hình sau:
Chọn kiểu khai báo hàm phù hợp và viết code
void MoveToFront (NODE pHead , NODE pTail ,
NODE pNode )
Lưu ý: các kí hiệu có thể là *, & hoặc khoảng
trắng
Trang 51Các thao tác trên danh sách liên kết
Bài tập 4
Quản lý thông tin sinh viên của m t lớp gồm :
Mã sinh viên : chu i 8 ký tự
Tên sinh viên : chu i 20 ký tự
Điểm Toán, Lý, Hoá
Tổ chức cấu trúc dữ liệu thích hợp để biểu diễn
các thông tin trên, và cài đặt các chức năng:
Trang 52Các thao tác trên danh sách liên kết
Viết hàm rút gọn danh sách liên kết trên theo
dạng sau: nếu các phần tử có cùng khóa Key thì chỉ giữ lại m t phần tử và giá trị Value thì c ng
dồn vào phần tử đó
Trang 53Các thao tác trên danh sách liên kết
Viết hàm rút gọn danh sách liên kết trên theo
dạng sau: nếu các phần tử có cùng khóa Key thì chỉ giữ lại m t phần tử và giá trị Value thì c ng
dồn vào phần tử đó
Trang 55Danh sách liên kết kép
Các thao tác
Chèn vào đầu danh sách
int AddHead (DNODE *& pHead, DNODE *& pTail, float Data)
Bước 1:
Trang 56Danh sách liên kết kép
Các thao tác
Chèn vào cuối danh sách
int AddTail(DNODE *& pTail, float Data)
- Bước 1:
- Bước 2:
- Bước 3:
Trang 59Danh sách liên kết kép
Các thao tác
Hủy m t phần tử đứng sau m t phần tử cho
trước
int RemoveAfter (DNODE *& pHead, DNODE *pNode)
int RemoveAfter (DNODE *& pTail, DNODE *pNode)
pNode cần xóa
Trang 61Các thao tác trên danh sách liên kết kép
Bài tập 6
Cho DSLK kép L mà m i node có lưu thông tin
là m t số nguyên Viết hàm loại bỏ tất cả các
node có thông tin là giá trị K cho trước
Trang 6262
Nhắc lại: có mối liên kết giữa phần tử cuối và
phần tử đầu
– Văn Chí Nam – Nguyễn Thị Hồng Nhung – Đặng
Trang 64Danh sách liên kết vòng
Các thao tác
Thêm cuối danh sách
Trang 66Danh sách liên kết vòng
Bài tập 7
Lập giải thuật thực hiện các phép sau đây đối
với danh sách liên kết vòng:
Ghép 2 danh sách nói vòng có nút “đầu danh sách” lần lượt trỏ bởi p và q thành m t danh sách mà nút đầu danh sách trỏ bởi p
Lập bản sao của m t danh sách nối vòng có nút đầu danh sách trỏ bởi L
Trang 67- Truy xuất tuần tự, danh sách
liên kết đơn chỉ có thể duyệt 1
chiều
- Truy xuất ngẫu nhiên, đơn giản, nhanh chóng
- Cần nhiều bộ nhớ hơn để lưu
trữ con trỏ tham chiếu - Không cần
Trang 68So sánh danh sách liên kết đơn
và kép
DSLK kép: cho phép duyệt danh sách theo 2
chiều
DSLK kép cần nhiều b nhớ hơn để lưu trữ
DSLK kép: các thao tác phức tạp hơn (vì phải
cập nhật cả 2 con trỏ)