Chương 3 cung cấp kiến thức về danh sách liên kết. Chương này giúp người học nắm vững khái niệm về kiểu dữ liệu tĩnh và động, nắm vững cách tổ chức dữ liệu động bằng danh sách liên kết và minh họa được các thao tác xử lý trên danh sách liên kết đơn, cài đặt minh họa được các thao tác của danh sách đơn bằng ngôn ngữ C/C++. Mời các bạn cùng tham khảo.
CHƯƠNG DANH SÁCH LIÊN KẾT Võ Quang Hoàng Khang Email: vqhkhang@gmail.com 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 10 3 15 ? Làm để chèn thêm số vào vị trí mảng Vấn đề kiểu liệu tĩnh 10 ? Giả sử cần thêm tiếp phần tử 3 15 Bổ sung thêm 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 3 15 ? Làm để xóa phần tử Vấn đề kiểu liệu tĩnh 10 3 15 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ố nguyên 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 Các thao tác DSLK (tt) … Xóa phần tử danh sách (đầu, cuối, giữa) Sắp xếp danh sách Chèn node vào trước node p – Cách pPrev p pNew list pHead pTail 55 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 Bước Chèn pNew vào sau q Bước Hoán vị giá trị pNew q q pNew list pHead pTail 57 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 58 Xóa nút danh sách Xóa nút đầu danh sách Cần xóa 30 list pHead 25 41 78 pTail pDel NODE *pDel = list.pHead list.pHead = list.pHead->pNext delete pDel 59 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) 60 Xóa nút danh sách Xóa nút cuối danh sách 30 list pHead Cần xóa pPrev pDel 41 78 25 pTail NODE *pDel = list.pTail NODE *pPrev = “Tìm node trước pTail” pPrev->pNext = NULL list.pTail = pPrev delete pDel 61 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 danh sách cịn node trước xóa) 62 Xóa nút danh sách Xóa nút danh sách Cần xóa 30 list pHead pPrev pDel 25 41 96 78 pTail NODE *pPrev = “Tìm node trước pDel” pPrev->pNext = pDel->pNext delete pDel 63 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 &L, NODE *pDel) 64 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) 65 Bài tập Cài đặt hàm sau dslk đơn số nguyên: Đếm số lượng node dslk int DemSL(LIST list); Tìm node có giá trị lớn NODE* TimMax(LIST list); Tìm node có giá trị x NODE* TimX(LIST list, int x); In node có giá trị chẵn void InChan(LIST list); Tính giá trị trung bình node lẻ float TBLe(LIST list); 66 Chèn node có giá trị x vào phía sau node có giá trị lớn void ChenXSauMax(LIST &list, int x); Xóa node có giá trị x bool XoaX(LIST &list, int x); Sắp tăng dslk void SapTang(LIST &list); 67 Sắp xếp void Doichotructiep ( LIST &L ) { Node *p,*q; for (p=L.DAU ; p!=L.CUOI ; p=p->tiep ) for (q=p->tiep; q!=NULL ; q=q->tiep) if ( p->dulieu > q->dulieu) Hoanvi( p->dulieu , q->dulieu ); } 68 ... nút: đầu, cuối, nút có giá trị x Tìm phần tử Sắp xếp danh sách 33 Cấu trúc tổng quát chương trình Khai báo thư viện hàm Khai báo cấu trúc danh sách liên kết Khai báo nguyên mẫu hàm void main() {... 26 DSLK đơn Data pNext Cấu trúc node List pHead pTail Data : Dữ liệu node pNext : Con trỏ đến node pHead: Con trỏ đến node đầu pTail: Con trỏ đến node cuối 27 Khai báo cấu trúc node pNext Data... 2.Thêm pNew vào cuối (AddTail) 38 TH Thêm nút vào đầu danh sách 30 list pHead 25 pTail pNew 39 TH Thêm nút vào đầu danh sách 30 list pHead 25 pTail Vẽ lại 25 list pHead 30 pTail 40 TH Thêm nút vào