Danh sách được cài đặt bằng mảng được gọi là

Trong bài này chúng ta sẽ tìm hiểu 2 phần chính:

  • Danh sách liên kết cài đặt bằng mảng
  • Danh sách liên kết cài đặt bằng con trỏ

+/ Danh sách liên kết đơn
+/ Danh sách liên kết kép
Trong mỗi phần chúng ta sẽ tìm hiểu các vấn đề cơ bản sau:
  • Cài đặt danh sách (Khai báo)
  • Khởi tạo danh sách rỗng
  • Kiểm tra danh sách rỗng (danh sách đầy khi cài bằng mảng)
  • Chèn phần tử vào đầu danh sách
  • Chèn phần tử vào vị trí thứ k trong danh sách
  • Nhập danh sách
  • Xuất danh sách
  • Tìm 1 phần tử trong danh sách
  • Xóa phần tử đầu tiên trong danh sách
  • Xóa phần tử thứ k trong danh sách
  • Xóa phần tử có nội dung X trong danh sách

1/ Danh sách liên kết cài bằng mảng


Loại danh sách này thường được gọi là danh sách kế tiếp. Bây giờ ta sẽ làm việc với các vấn đề:
Danh sách được cài đặt bằng mảng được gọi là

1.1/ Cài đặt (khai báo) danh sách
Để khai báo danh sách này ta cần có 1 mảng có số phần tử tối đa là N có kiểu dữ liệu là item (item này là kiểu dữ liệu tổng quan, khi làm nó sẽ là kiểu int, float hay kiểu cấu trúc sinh viên). Cần thêm 1 biến size thể hiện số phần tử hiện có của danh sách.
Cụ thể như sau:
Danh sách được cài đặt bằng mảng được gọi là

1.2/ Khởi tạo danh sách rỗng


Danh sách của ta rỗng khi số phần tử trong danh sách bằng 0. Vì vậy chỉ cần khai báo trường size của ta bằng 0 là được.
Danh sách được cài đặt bằng mảng được gọi là

1.3/ Kiểm tra danh sách rỗng, danh sách đầy


Để kiểm tra danh sách rỗng hay đầy ta chỉ việc xem số phần tử của danh sách có bằng 0 hay không (rỗng) và có bằng N hay không (đầy).
Danh sách được cài đặt bằng mảng được gọi là

1.4/ Chèn phần tử vào vị trí k trong danh sách


Trước khi chèn phần tử vào trong danh sách chúng ta nên xây dựng 1 hàm trả về dữ liệu (nhập vào dữ liệu) của phần tử cần chèn đó.
Danh sách được cài đặt bằng mảng được gọi là

Sau đó tiến hành chèn:


Trong quá trình chèn chúng ta cần kiểm tra xem danh sách đầy chưa, nhập vị trí k cần chèn và kiểm tra nó, nếu phù hợp (0<k<=N) thì sẽ tiến hành chèn.
Để chèn được phần tử x vào vị trí k trong danh sách (trong mảng) ta cần dùng 1 vòng for để di chuyển các phần tử từ vị trí k về phía cuối mảng, sau đó chèn x vào vị trí k. Cuối cùng ta tăng size lên 1 đơn vị.
Danh sách được cài đặt bằng mảng được gọi là

Danh sách được cài đặt bằng mảng được gọi là

1.5/ Nhập danh sách


Nhập như bình thường với mảng
Danh sách được cài đặt bằng mảng được gọi là

1.6/ Tìm phần tử x trong danh sách


Ta duyệt từ đầu đến cuối danh sách nếu có giá trị x thì đưa ra vị trí của nó.
Danh sách được cài đặt bằng mảng được gọi là

1.7/ Xóa phần tử thứ k trong danh sách


Trước khi xóa ta phải kiểm tra xem danh sách có rỗng không. Nếu không rỗng ta nhập vào vị trí cần xóa và kiểm tra (phù hợp nếu 0<k<=N).
Ta dùng vòng for chạy đến vị trí thứ k, sau đó dồn các phần tử từ k+1 về trước 1 đơn vị. tuy nhiên ta cần lưu lại giá trị của phần tử xóa trước khi xóa để giữ lại thông tin nếu ta cần dùng đến nó. Cuối cùng là giảm size xuống 1 đơn vị.
Danh sách được cài đặt bằng mảng được gọi là

Danh sách được cài đặt bằng mảng được gọi là


1.8/ Xóa phần tử có nội dung x trong danh sách
Để xóa phần tử có nội dung x trong danh sách ta tiến hành tìm phần tử x trước bằng hàm search sau đó giá trị trả về là vị trí của x, ta tiếp tục sử dụng hàm del_k để xóa phần tử ở vị trí mà ta tìm được.
Danh sách được cài đặt bằng mảng được gọi là

Vậy là chúng ta đã xây dựng xong các thao tác cơ bản trên danh sách cài đặt bằng mảng. Các bạn ghép các hàm vào cùng với hàm main() gọi các hàm trên là ok.


Các bạn có thể tham khảo tại đây: http://ideone.com/VyjxYo
2. Danh sách liên kết đơn (gọi nhanh là danh sách liên kết - DSLK)

Trong các bài trước mình viết code tất cả đều là chuẩn C, nhưng từ bây giờ mình sẽ xen lẫn chút cấu trúc của C++ trong đó.


Một số vấn đề ta cần làm trong DSLK:
Danh sách được cài đặt bằng mảng được gọi là

2.1 Giống như trong phần danh sách liên kết xây dựng bởi mảng, bây giờ ta sẽ cài đặt danh sách:
Danh sách liên kết có thể được mô tả như sau:
Danh sách được cài đặt bằng mảng được gọi là

2.2 Khởi tạo danh sách rỗng
Danh sách được cài đặt bằng mảng được gọi là

Trong các bài trước để có thể thay đổi được giá trị của đối mà ta truyền vào hàm ta thưòng dùng biến con trỏ
Danh sách được cài đặt bằng mảng được gọi là
 và trong lời gọi hàm ta cần có & trước biến tuy nhiên khi chúng ta sử dụng cách truyền địa chỉ ngay khi khởi tạo hàm thì trong lời gọi hàm ta tiên hành truyền biến bình thưòng mà không phải lấy địa chỉ (thêm &) trước biến nữa. 
(Đây là một cách truyền địa chỉ cho biến trong hàm ở C++.)
2.3 Kiểm tra danh sách rỗng hay không
Cái này khỏi giải thích nhiều:
Danh sách được cài đặt bằng mảng được gọi là

2.4 Tính độ dài danh sách
Ta dùng 1 Node để duyệt từ đầu đến cuối, vừa duyệt vừa đếm

Danh sách được cài đặt bằng mảng được gọi là


2.5 Tạo 1 Node trong danh sách
Việc tạo 1 Node chứa thông tin trong danh sách sẽ giúp ta dễ dàng chèn, xóa và quản lý danh sách hơn. Trước tiên ta sẽ phải cấp phát vùng nhớ cho Node và sau đó gán Data vào là ok
Danh sách được cài đặt bằng mảng được gọi là

2.6 Chèn Node P vào vị trí đầu tiên
Để chèn P vào đầu danh sách trước tiên ta cho P trỏ đến L, sau đó chỉ việc cho L trỏ lại về P là ok

Danh sách được cài đặt bằng mảng được gọi là


2.7 Chèn Node P vào vị trí k trong danh sách:
Trước tiên ta kiểm tra vị trí chèn có hợp lệ không, nếu hợp lệ kiểm tra tiếp chèn vào vị trí 1 hay k >1 . Với k >1 ta thực hiện duyệt bằng Node Q đến vị trí k-1 sau đó cho P->Next trỏ đến Node Q->Next, tiếp đến cho Q->Next trỏ đến P

Danh sách được cài đặt bằng mảng được gọi là


2.8 Tìm phần tử co giá trị x trong danh sách:
Ta duyệt danh sách cho đến khi tìm thấy hoặc kết thúc và trả về vị trí nếu tìm thấy, ngược lại trả về 0
Danh sách được cài đặt bằng mảng được gọi là

2.9 Xóa phần tử ở vị trí đầu tiên

Trước tiên ta lưu giá trị của phần tử đầu tiên vào biến x, sau đó tiền hành cho L trỏ đến L->Next

Danh sách được cài đặt bằng mảng được gọi là

2.10 Xóa phần tư ở vị trí k


Dùng P duyệt đến vị trí k-1 và tiến hành cho P->Next trỏ đến phần tư kế tiếp k mà bỏ qua k. Lưu ý trong hình mình quên không lưu lại giá trị cần xóa tuy nhiên các bạn cần lưu lại như khi xóa ở vị trí đầu tiên.

Danh sách được cài đặt bằng mảng được gọi là


2.11 Xóa phần tử có giá trị x
Đon giản là ta tìm x trong danh sách bằng hàm Search và xóa tại vị trí tìm thấy mà ta nhận được
Danh sách được cài đặt bằng mảng được gọi là

Đến đây coi như đã hoàn thiện phần danh sách liên kết đơn. 

Danh sách được cài đặt bằng mảng được gọi là
.


Các bạn có thể tham khảo code hoàn chỉnh tại đây: http://ideone.com/BMPAja

3. Danh sách liên kết kép


Danh sách liên kết kép cũng là một dạng danh sách liên kết nhưng mỗi phần tử liên kết với phần tử đứng trước và sau nó trong danh sách

3.1 Cài đặt danh sách:


Cấu trúc của 1 Node trong danh sách liên kết kép tương đối giống với DSLKD nhưng có thêm một con trỏ trỏ về Node trước nó
Danh sách được cài đặt bằng mảng được gọi là

Danh sách được cài đặt bằng mảng được gọi là

Cấu trúc của DSLKK không như DSLKD có 1 Con trỏ trỏ đến đầu DS, nhưng DSLKK ngoài con trỏ trỏ đến đầu danh sách còn có thêm 1 con trỏ trỏ đến Node cuối của danh sách

3.2 Một số thao tác chính


Danh sách được cài đặt bằng mảng được gọi là

3.3 Khởi tạo và kiểm tra rỗng


Khởi tạo ta cho 2 con trỏ đầu và cuối trỏ vê NULL, Khi kiểm tra rỗng thi chỉ cần xem con trỏ đầu có trỏ về NULL không là đủ
Danh sách được cài đặt bằng mảng được gọi là

3.4 Độ dài danh sách:


Để tìm độ dài của DSLKK ta hoàn toàn có thể làm giống như DSLKD, tức dùng con trỏ duyệt từ đầu đến cuối, nhưng trong DSLKK ta có thể dùng 2 con trỏ ở đầu và cuối để đếm
Danh sách được cài đặt bằng mảng được gọi là

3.5 Tạo 1 Node P chứa thông tin


Danh sách được cài đặt bằng mảng được gọi là

3.6 Chèn phần tử vào vị trí đầu tiên:


Trước khi chèn vào đầu danh sách cần kiểm tra xem danh sách rỗng hay không.
Nếu danh sách rỗng ta cho Head và Tail đều trỏ đến P. Nếu không rỗng thực hiện chèn.
Danh sách được cài đặt bằng mảng được gọi là

3.7 Chèn phần tử vào cuối danh sách tương tự như đầu danh sách


Danh sách được cài đặt bằng mảng được gọi là

3.8 Chèn phần tử vào vị trí k


Trước khi chèn vào vị trí k cần kiểm tra vị trí k có phù hợp, có phải đầu danh sách hay cuối danh sách. Nếu chèn vào giữa danh sách ta thực hiện theo 4 bước
Danh sách được cài đặt bằng mảng được gọi là

3.9 Xóa phần tử đầu, cuối danh sách


Danh sách được cài đặt bằng mảng được gọi là

3.10 Xóa phần tử ở vị trí k


Trước khi xóa ở vị trí k cần kiểm tra vị trí k có phù hợp, có phải đầu danh sách hay cuối danh sách hay ở giữa
Danh sách được cài đặt bằng mảng được gọi là

3.11 Tìm phần tử x trong DS


Danh sách được cài đặt bằng mảng được gọi là

3.12 Xóa phần tử x trong DS


Danh sách được cài đặt bằng mảng được gọi là

Vậy là phần này coi như chúng ta đa tìm hiểu xong danh sách liên kết: (DSLK mảng, DSLK đơn, DSLK kép).