Khái niệ m

Một phần của tài liệu Bài giảng cấu trúc dữ liệu và giải thuật (2013) (Trang 41 - 42)

Khác với mảng, danh sách liên kết là 1 cấu trúc dữ liệu có kiểu truy cập tuần tự. Mỗi phần tử trong danh sách liên kết có chứa thông tin về phần tử tiếp theo, qua đó ta có thể truy cập tới phần tử này.

R. Sedgewick (Alogrithms in Java - 2002) định nghĩa danh sách liên kết như sau:

Danh sách liên kết là 1 cấu trúc dữ liệu bao gồm 1 tập các phần tử, trong đó mỗi phần tử là 1 phần của 1 nút có chứa một liên kết tới nút kế tiếp.

Nói “mỗi phần tử là 1 phần của 1 nút” bởi vì mỗi nút ngoài việc chứa thông tin về phần tử còn chứa thông tin về liên kết tới nút tiếp theo trong danh sách.

Có thể nói danh sách liên kết là 1 cấu trúc dữ liệu được định nghĩa kiểu đệ qui, vì trong định nghĩa 1 nút của danh sách có tham chiếu tới khái niệm nút. Thông thường, một nút thường có liên kết trỏ tới một nút khác, tuy nhiên nó cũng có thể trỏ tới chính nó.

Danh sách liên kết có thể được xem như là 1 sự bố trí tuần tự các phần tử trong 1 tập. Bắt đầu từ 1 nút, ta coi đó là phần tử đầu tiên trong danh sách. Từ nút này, theo liên kết mà nó trỏ tới, ta có nút thứ 2, được coi là phần tử thứ 2 trong danh sách, v.v. cứ tiếp tục như vậy cho đến hết danh sách. Nút cuối cùng có thể có liên kết là một liên kết null, tức là không trỏ tới nút nào, hoặc nó có thể trỏ về nút đầu tiên để tạo thành 1 vòng.

36

Hình 3.1 Danh sách liên kết

Như vậy, mặc dù cùng là cấu trúc dữ liệu bao gồm 1 tập các phần tử, nhưng giữa danh sách liên kết và mảng có 1 số điểm khác biệt sau:

- Mảng có thể được truy cập ngẫu nhiên thông qua chỉ số, còn danh sách chỉ có thể truy cập tuần tự. Trong danh sách liên kết, muốn truy cập tới 1 phần từ phải bắt đầu từ đầu danh sách sau đó lần lượt qua các phần tử kế tiếp cho tới khi đến phần tử cần truy cập.

- Việc bố trí, sắp đặt lại các phần tử trong 1 danh sách liên kết đơn giản hơn nhiều so với mảng. Bới vì đối với danh sách liên kết, để thay đổi vị trí của 1 phần tử, ta chỉ cần thay đổi các liên kết của một số phần tử có liên quan, còn trong mảng, ta thường phải thay đổi vị trí của rất nhiều phần tử.

- Do bản chất động của danh sách liên kết, kích thước của danh sách liên kết có thể linh hoạt hơn nhiều so với mảng. Kích thước của danh sách không cần phải khai báo trước, bất kỳ lúc nào có thể tạo mới 1 phần tử và thêm vào vị trí bất kỳ trong danh sách. Nói cách khác, mảng là 1 tập có số lượng cố định các phần tử, còn danh sách liên kết là 1 tập có số lượng phần tử không cố định.

Để khai báo một danh sách trong C, ta có thể dùng cấu trúc tự trỏ. Ví dụ, để khai báo một danh sách liên kết mà mỗi nút chứa một phần tử là số nguyên như sau:

struct node { int item;

struct node *next; };

typedef struct node *listnode;

Đầu tiên, ta khai báo một cấu trúc node bao gồm 2 thành phần. Thành phần thứ nhất là 1 biến nguyên chứa dữ liệu, thành phần thứ 2 là một con trỏ chứa địa chỉ của nút kế tiếp. Tiếp theo, ta định nghĩa một kiểu dữ liệu con trỏ tới nút có tên là listnode.

Với các danh sách liên kết có kiểu phần tử phức tạp hơn, ta phải khai báo cấu trúc của phần tử này trước (itemstruct), sau đó đưa kiểu cấu trúc đó vào kiểu phần tử trong cấu trúc node.

struct node {

itemstruct item; struct node *next; };

typedef struct node *listnode;

Một phần của tài liệu Bài giảng cấu trúc dữ liệu và giải thuật (2013) (Trang 41 - 42)

Tải bản đầy đủ (PDF)

(189 trang)