. Xố nút new_ele; Trả về CurrPtr;
d. Bi ểu diễn ma trận thưa nhờ DSLK
Thơng thường ta cài đặt ma trận cấp m x n bằng mảng 2 chiều. Nhưng trong các bài tốn thực tế (chẳng hạn các bài tốn trong kết cấu xây dựng, kinh tế, ...) ta thường gặp các ma trận thưa (ma trận cĩ rất ít phần tử khác 0) cĩ cấp rất lớn, cách cài đặt bởi mảng sẽ khơng hiệu qủa vì lãng phí bộ nhớ (thậm chí cịn
khơng khả thi về tốc độ thực hiện khi phải thao tác và lưu trữ những mảng cực lớn trên bộ nhớ phụ), do phải chứa quá nhiều các phần tử 0 khơng chứa đựng nhiều thơng tin đặc trưng của bài tốn. Do đĩ, cần chọn một kiểu cài đặt khác sao cho
chỉ cần lưu lại các phần tử khác 0 của ma trận. * Ví du: Cho ma trận thưa
9 0 0 8 0 7 0 0 0 0 7 0 0 0 0 A = 0 0 0 0 0
-1 6 0 -8 0
Một trong những cách cài đặt là dùng mảng 1 chiều A[m], trong đĩ mỗi hàng A[i] là một DSLK chỉ chứa các phần tử khác 0 của hàng thứ i+1 của ma trận, ∀ i = 0 .. m-1. Mỗi nút của DSLK cĩ cấu trúc:
Col Value Next Cột Giá trị khác 0 Từđĩ, ta cĩ : A[0] ? ? 1 9 4 8 • A[1] ? ? 1 7 • A[2] ? ? • A[3] ? ? 1 -1 2 6 4 -8 • • Cài đặt cấu trúc dữ liệu cho ma trận thưa // m là số dịng của ma trận #define m ...
typedef double ElememtType; // Kiểu của phần tử của ma trận typedef NodeType *NodePointer;
typedef struct Node {unsigned int Col; ElementType Value; NodePointer Next; } NodeType;
NodePointer PointerArray[m]; PointerArray A;
Đối với ma trận cĩ rất nhiều dịng bằng 0, cần phải thay đổi cách cài đặt cho ma trận thưa để việc lưu trữ và các thao tác trên ma trận thưa cĩ hiệu quả hơn bằng cách sử dụng kiểu DSLK tổng quát, nghĩa là DSLK mà mỗi nút cĩ thể lại là một kiểu DSLK nào đĩ. Kiểu DSLK này cịn được ứng dụng trong lý thuyết đồ thị, trí tuệ nhân tạo, …
Sau đây, ta minh họa một ứng dụng của DSLK tổng quát vào bài tốn sắp xếp tơpơ sau đây. Qua đĩ ta càng thấy rõ tính linh hoạt của kiểu DSLK động.