C. Mở rộn g: Danh sách liên kết đơn
4, Thao tác với danh sách liên kết 4.1, Thêm
4.1, Thêm
Tươ ng tự như mả ng, danh sách liên kế t đơ n cũng có rấ t nhiề u kiể u thêm. Tôi sẽ giới thiệ u 3 kiể u thêm cơ bả n : thêm đầ u, thêm cuố i và thêm giữ a và sẽ chỉ nói về thêm dầu vì các phầ n sau khá giống nhau.
Vớ i thêm đầ u, chúng ta cầ n truyề n tham chiế u mả ng và truyền đị a chỉ con trỏ p của Node mà chúng ta đã tạ o. Chúng ta sẽ chia ra làm 2 trườ ng hợ p là danh sách liên kết đơ n rỗ ng và danh sách liên kế t đơ n đã có phầ n tử . Vớ i danh sách liên kết đơn rỗng cũng đồ ng nghĩa vớ i con trỏ pHead và pTail trỏ tớ i rỗng. Vậy lúc khi thêm 1 Node vào, Node ấ y vừ a là Node đầ u đồ ng thờ i là Node cuố i, cho nên chúng ta sẽ cập nhật
pHead và pTail sẽ chứ a đị a chỉ củ a Node mớ i tạ o. Vớ i danh sách liên kết đơn đã có phầ n tử , chúng ta sẽ đư a Node mớ i lên đầ u, cho con trỏ trong Node trỏ t ới Node đầu cũ và cậ p nhậ t lạ i pHead bở i lúc này, Node mớ i thêm đã đứng đầu !
Tươ ng tự như thế vớ i phầ n thêm cuối :
Vớ i phầ n thêm sau, chỉ có điề u khác biệ t ở chỗ, chúng ta cần truyền vào sau Node có giá trị nào và chúng ta muố n tạ o Node có giá trị bao nhiêu :
4.2, Xóa
Tươ ng tự thêm, xóa cũng có xóa đầ u, xóa cuố i và ngoài ra còn có xóa chọn theo giá trị
trong Node là gì. Xóa mà tôi dề cậ p trong đây, chính là giả i phóng bộ nhớ , trả lại bổ
nhớ cho máy tính. Khi ta cấ p phát bộ nhớ độ ng là lúc mà ta xin máy tính cấp cho ta
mộ t vùng nhớ để chứ a giá trị . Vậ y khi kế t thúc chươ ng trình hay không muốn sử dụng, loạ i bỏ thì chúng ta sẽ sử dụ ng đế n giả i phóng bộ nhớ.
Tôi sẽ đi sâu vào xóa ở đầ u vì các xóa kia cũng tương tự như thế. Xóa đầu cũng chia ra làm hai trườ ng hợ p. Trườ ng hợ p thứ nhấ t cũng dễ hiể u, kiểm tra xem danh sách có
phầ n tử nào không. Trườ ng hợ p thứ hai, ta sẽ cầ n đế n con trỏ trung gian để xóa phần tử phía trướ c và cậ p nhậ t lạ i con trỏ đầ u ( pHead ). Giả i phóng chúng ta sẽ dùng hàm free( ) trong C.
Tươ ng tự vớ i xóa cuối:
Và xóa chọ n khác ở chỗ chúng ta truyền số cần xóa vào:
4.3, Duyệt
Tươ ng tự mả ng, chúng ta có vòng lặ p for ( ) để duyệ t, như ng vớ i các chỉ số, điều kiện bên trong khác. Chúng ta sẽ dùng đị a chỉ để duyệ t và truy cậ p các thành phần bên
trong Node. Điề u kiệ n sẽ chạ y đế n khi nào NULL thì dừng. Trong vòng lặp chúng ta sẽ cho in ra thành phầ n giá trị và thành phầ n liên kết bên trong nó.
4.4, Sắp xếp
Ở đây, tôi dùng thuậ t toán đổ i chỗ trự c tiế p – thuậ t toán căn bản nhấ t và dễ nhấ t. Đổi chỗ thì có 2 kiể u đổ i chỗ : đổ i chỗ thành phầ n liên kế t hoặ c đổ i chỗ thành phầ n giá trị. Đoạ n code trên, tôi sử dụ ng đổ i chỗ thành phầ n giá trị và sắ p xế p tăng dần. Còn về đổi
chỗ thì cũng tươ ng tự như đổ i chỗ trự c tiế p củ a mả ng. Chúng ta so sánh bắt đầu từ
phầ n tử đầ u vớ i các phầ n tử tiế p theo, sau đó tăng dầ n phầ n tử đầ u lên cho đến khi còn phầ n tử n và n-1 so sánh với nhau.
Độ phứ c tạ p củ a thuậ t toán Interchange Sort cũng như trong mảng. Mỗi vòng lặp While có trườ ng hợ p tệ nhấ t sẽ là n lầ n. Vậ y độ phứ c tạ p củ a cả thuậ t toán sắp xếptheo quy tắ c nhân sẽ là O(n^2).
4.5, Tìm kiếm
Thuậ t toán tìm kiế m cũng vô cùng gầ n gũi, chúng ta sẽ sử dụ ng thuậ t toán tìm kiếm tuyế n tính, tứ c là duyệ t từ trái sang phả i. Sử dụ ng vòng lặ p for ( ) tươ ng tự như ở trên, tìm giá trị bằ ng nó, nế u có thì trả về con trỏ chứa Node, nếu không thì trả về NULL.
Phầ n tìm kiế m này là tìm kiế m tuyế n tính, sẽ có 1 vòng lặ p chạ y tệ nhấ t là n lầ n, vậy ta có thể đư a ra kế t luậ n rằ ng, độ phứ c tạ p củ a tìm kiế m tuyế n tính ở đây là O(n).
4.6, Kết luận
Sau khi hiể u đượ c nhữ ng phầ n cơ bả n trên, chúng ta có thể làm đượ c một vài tính năng khác như trong mả ng, tự lậ p menu để ngườ i dùng có thể sử dụ ng, có thể tham khảo menu củ a tôi dưới đây :