Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 4: Danh sách liên kết cung cấp cho người học các kiến thức về: Đặt vấn đề, kiểu dữ liệu con trỏ, biến không động, kiểu con trỏ, biến động, danh sách liên kết. Mời các bạn cùng tham khảo.
Chương Danh sách liên kết Trần Minh Thái Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn Cập nhật: ngày 10 tháng 04 năm 2016 Mục tiêu Nắm vững khái niệm kiểu liệu tĩnh động Nắm vững cách tổ chức liệu động danh sách liên kết minh họa thao tác xử lý danh sách liên kết đơn Cài đặt minh họa thao tác danh sách đơn ngôn ngữ C/ C++ Vấn đề kiểu liệu tĩnh 66 10 10 55 77 33 99 15 15 22 11 ? Làm để chèn thêm số vào vị trí mảng Vấn đề kiểu liệu tĩnh 66 ? 10 10 Giả sử cần thêm tiếp phần tử 55 77 33 99 15 15 22 Bổ sung thêm 11 Bài tập Hãy cài đặt hàm (bằng ngôn ngữ C/C++) chèn phần tử có giá trị x vào vị trí vt mảng số nguyên a, kích thước n, theo mẫu hàm sau: void ChenX(int a[], int &n, int x, int vt); Vấn đề kiểu liệu tĩnh 10 10 55 77 33 99 15 15 22 11 ? Làm để xóa phần tử Vấn đề kiểu liệu tĩnh 10 10 55 77 33 99 15 15 22 11 Bài tập Hãy cài đặt hàm (bằng ngơn ngữ C/C++) xóa phần tử có giá trị x (nếu có) mảng số ngun a, kích thước n (giả sử giá trị phần tử mảng không trùng nhau), theo mẫu hàm sau: void XoaX (int a[], int &n, int x); Vấn đề kiểu liệu tĩnh i Độ phức tạp chèn/ xóa mảng chiều O(n) Vấn đề kiểu liệu tĩnh Giải vấn đề phức tạp chèn/ xóa? Giải vấn đề giới hạn kích thước vùng nhớ tối đa? Giải vấn đề vùng nhớ không liên tục? Giải vấn đề giải phóng vùng nhớ khơng cần dùng đến? DÙNG CẤU TRÚC DỮ LIỆU ĐỘNG 10 Chèn node vào trước node p – Cách ? Hãy viết hàm tìm trả trỏ node đứng trước trỏ node p (bằng ngôn ngữ C/C++), theo mẫu sau: NODE *PrevNode (LIST list, NODE *p) 56 Chèn node vào trước node p – Cách NODE *PrevNode (LIST list, NODE *p) { if(p == list.pHead) return NULL; NODE *pTruoc = list.pHead; while(pTruoc->pNext != p) pTruoc = pTruoc -> pNext; return pTruoc; } 57 Chèn node vào trước node p – Cách void ChenTruocP1 (LIST &list, NODE *p, NODE *pNew) { NODE *pTruoc = PrevNode(list, p); if(pTruoc == NULL) AddHead(list, pNew); else { pTruoc -> pNext = pNew; pNew -> pNext = p; } } 58 Chèn node vào trước node p – Cách Bước Chèn pNew vào sau p Bước Hoán vị giá trị pNew p p list pHead pTail pNew 59 Xóa nút danh sách Xóa nút đầu danh sách Ảnh hưởng pHead Xóa nút cuối danh sách Ảnh hưởng pTail Xóa nút danh sách 60 Xóa nút danh sách Xóa nút đầu danh sách Cần xóa list 30 pHead 25 41 78 pTail pDel NODE *pDel = list.pHead list.pHead = list.pHead->pNext delete pDel 61 Xóa nút danh sách ? Hãy viết hàm xóa nút đầu danh sách (bằng ngôn ngữ C/C++), theo mẫu sau: void DeleteHead (LIST &list) (lưu ý trường hợp danh sách node trước xóa) 62 Xóa nút danh sách void DeleteHead (LIST &list) { NODE *pDel = list.pHead; if(list.pHead != list.pTail) list.pHead = pDel -> pNext; else list.pHead = list.pTail = NULL; delete pDel; } 63 Xóa nút danh sách Cần xóa Xóa nút cuối danh sách list 30 pHead 25 pPrev pDel 41 78 pTail NODE *pDel = list.pTail NODE *pPrev = “Tìm node trước pTail” pPrev->pNext = NULL list.pTail = pPrev delete pDel 64 Xóa nút danh sách ? Hãy viết hàm xóa nút cuối danh sách (bằng ngơn ngữ C/C++), theo mẫu sau: void DeleteTail (LIST &list) (lưu ý trường hợp xóa danh sách có node) 65 Xóa nút danh sách void DeleteTail (LIST &list) { NODE *pDel = list.pTail; NODE *pTruoc = PrevNode(list, list.pTail); if(pTruoc != NULL) { pTruoc -> pNext = NULL; list.pTail = pTruoc; } else list.pHead = list.pTail = NULL; delete pDel; 66 Xóa nút danh sách Xóa nút danh sách list 30 pHead Cần xóa pPrev pDel 25 41 96 78 pTail NODE *pPrev = “Tìm node trước pDel” pPrev->pNext = pDel->pNext delete pDel 67 Xóa nút danh sách ? Hãy viết hàm xóa node danh sách (bằng ngôn ngữ C/C++), theo mẫu sau: void DeleteNode (LIST &list, NODE *pDel) 68 Xóa nút danh sách ? Hãy viết hàm hủy tồn danh sách (bằng ngơn ngữ C/C++), theo mẫu sau: void DestroyList (LIST &list) 69 Bài tập Chèn node có giá trị x vào phía sau node có giá trị lớn (giả sử danh sách khơng có giá trị trùng nhau) void ChenXSauMax(LIST &list, int x); Xóa node có giá trị x xuất danh sách (nếu có xóa: trả true, ngược lại trả false) bool XoaX(LIST &list, int x); Sắp tăng dslk void SapTang(LIST &list); 70 ... &list, NODE *pNew) 46 Nhập liệu vào danh sách Nhập liệu cho node Tạo trỏ node Thêm node vào danh sách 47 Nhập liệu vào danh sách Để tạo node từ liệu x có sẵn Đưa liệu có giá trị x vào phần Data... NODE; if(p == NULL) { cout