Danh sách liên kết 1 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 So sánh các thực thi của danh sách So sánh danh sách liên kết và mảng 2 Tập có thứ tự Số lượng phần tử cố đị[.]
Danh sách liên kết Giới thiệu Các loại danh sách liên kết Các thao tác danh sách So sánh thực thi danh sách So sánh danh sách liên kết mảng Giới thiệu Mảng: Cấu trúc liệu quen thuộc Tập có thứ tự Số lượng phần tử cố định (tĩnh) Cấp phát vùng nhớ liên tục Truy xuất phần tử thông qua số Giới thiệu Đánh giá thao tác mảng: Truy xuất phần tử ? Cập nhật ? Chèn phần tử ? Xóa phần tử ? Giới thiệu Thực tế: không xác đị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 q trình sử dụng Khơng đủ vùng nhớ cấp phát liên tục ? Cấu trúc liệu động đáp ứng nhu cầu Khái Niệm danh sách liên kết Danh sách liên kết tập liệu mà phần tử(element) chứa vị trí phần tử element = data + link Ví dụ: Các loại danh sách liên kết Danh sách liên kết đơn Danh sách liên kết kép Danh sách liên kết vòng Danh sách liên kết đơn Mỗi phần tử có liên kết đến phần tử phía sau Danh sách liên kết kép Mỗi phần tử có hai liên phần tử đứng trước sau Danh sách liên kết vịng Là danh sách liên kết đơn có mối liên kết phần tử cuối phần tử đầu Phần tử danh sách liên kết Phần tử = liệu + liên kết 10 Remove Node from a Linked List (cont.) There is no difference between Removal a node from the middle (a) and removal a node from the end (b) of the list head (a) pPre->link = pDel->link Recycle pDel pDel pPre … X head pPre pDel pPre pDel … (b) head … X 45 Remove Node from a Linked List (cont.) There is no difference between removal the node from the beginning (a) of the list and removal the only-remained node in the list (b) (a) head X pDel … (b) head head = pDel->link pDel 46 Recycle pDel head pDel RemoveNode Algorithm Remove (ref DataOut ) Removes a node from a singly linked list Pre DataOut contains the key need to be removed Post If the key is found, DataOut will contain the data corresponding to it, and that node has been removed from the list; otherwise, list remains unchanged Return success or failed 47 RemoveNode Algorithm (cont.) Remove (ref DataOut ) Allocate pPre, pDel // pPre remains NULL if the node to be deleted is at the beginning of the list or is the only node if (pDel is not found) return failed else DataOut = pDel->data if (pPre = NULL) // Remove the first node or the only node head = pDel->link else // Remove the node in the middle or at the end of the list pPre->link = pDel->link recycle pDel return success end Remove 48 Các thao tác danh sách liên kết đơn Xóa nút đầu DS Trước xóa (2) 15 Count 99 pHead pCurr (1) L.pHead = pCurr pNext; delete pCurr; Sau xóa 99 Count 11/1/2016 pHead Bộ mơn KHMT - Khoa CNTT - Trường ĐH Tôn Đức Thắng 49 Các thao tác danh sách liên kết đơn Xóa nút đầu DS (ql trỏ đầu) Nếu pHead != NULL Lấy nút đầu DS (pCurr) để xóa Tách pCurr khỏi danh sách Delete pCurr Void DeleteFirst(LIST &L) { NODE *pCurr; if(L.pHead != NULL) { pCurr = L.pHead; L.pHead = L.pHead pNext;// L.pHead=pCurr->pNext delete pCurr; } } Bộ môn KHMT - Khoa CNTT - Trường ĐH Tôn 11/1/2016 Đức Thắng 50 Các thao tác danh sách liên kết đơn Xóa nút đầu DS (ql trỏ đầu cuối) Nếu pHead != NULL Lấy nút đầu DS (pCurr) để xóa Tách nút đầu DS (pCurr) khỏi danh sách Delete pCurr Nếu pHead = NULL pTail = NULL: Xâu rỗng Void DeleteFirst(LIST &L) { NODE *pCurr; if(L.pHead != NULL) { pCurr = L.pHead; L.pHead = L.pHead pNext; delete pCurr; } if(L.pHead == NULL) L.pTail = NULL; } Bộ môn KHMT - Khoa CNTT - Trường ĐH Tôn 11/1/2016 Đức Thắng 51 Các thao tác danh sách liên kết đơn Xóa nút DS Sau nút pRev (ql trỏ đầu) Trước xóa 15 Count 50 99 pHead pPrev pCurr pPrev pNext = pCurr pNext Delete pCurr Sau xóa 15 Count 99 pHead pPrev 11/1/2016 Bộ môn KHMT - Khoa CNTT - Trường ĐH Tôn Đức Thắng 52 Các thao tác danh sách liên kết đơn Xóa nút DS Sau nút pRev (ql trỏ đầu) Void DeleteAfter_pPrev(LIST & L, NODE * pPrev) { NODE * pCurr; pCurr = pPrev pNext;// lấy nút sau pPrev để xóa pPrev pNext =pCurr pNext; delete pCurr; } 11/1/2016 Bộ môn KHMT - Khoa CNTT - Trường ĐH Tôn Đức Thắng 53 Các thao tác danh sách liên kết đơn Xóa nút DS Sau nút pRev (ql trỏ đầu cuối) Int DeleteAfter_pPrev(LIST & L, NODE * pPrev) { NODE * pCurr; if(pPrev == L.pTail) return 0; pCurr = pPrev pNext; pPrev pNext =pCurr pNext; delete pCurr; if(pPrev pNext == NULL) L.pTail = pPrev; } 11/1/2016 Bộ môn KHMT - Khoa CNTT - Trường ĐH Tôn Đức Thắng 54 Các thao tác danh sách liên kết đơn Xóa nút DS ( tổng quát) void DeleteNode(LIST & L, NODE * pPrev, NODE * PCurr) { if(pPrev == NULL) // xóa nút đầu L.pHead =pCurr pNext; else // Xóa nút pPrev pNext =pCurrpNext; delete pCurr; L.count ; } 11/1/2016 Bộ môn KHMT - Khoa CNTT - Trường ĐH Tôn Đức Thắng 55 Các thao tác danh sách liên kết đơn Duyệt DSLK Đơn: từ đầu DSLK cuối DSLK Để từ đầu DSLK đến cuối DSLK ta sử dụng biến trỏ NODE để giữ địa NODE DSLK void PrintList( LIST L) { NODE * pCurr = L.pHead; while( pCurr != NULL) { cout