Trong các kiểu lưu trữ dữ liệu tập hợp cơ bản hẳn là các bạn đã làm quen với :
- Mảng một chiều (array) .
- Mảng hai chiều (two-dimensional array) .
- Mảng nhiều chiều (multiple dimensional array) .
Dùng để lưu trữ các giá trị có cùng kiểu phần tử như: ký tự (char), số nguyên (int), số thập phân (float), mây mây.
Được đánh index và lưu trữ một cách liên tục trên bộ nhớ. Điều nay vô tình làm cho kiểu lưu trữ này phải khai báo trước số lượng phần tử, mô hình chung làm nó không có khả năng mở rộng.
Vì vậy để giải quyết vấn đề này người ta đã nghĩ ra cách thu thập các phần tử có cùng kiểu dữ liệu nằm rải rác trên bộ nhớ gom lại thành một danh sách, và linked list ra đời.
Giới thiệu
Node là kiểu dữ liệu có cấu trúc được định nghĩa gồm có hai phần: lưu trữ giá trị, lưu trữ địa chỉ.

Tập hợp các node lại với nhau thông qua việc lưu trữ địa chỉ của node tiếp theo chúng ta sẽ có một danh sách liên kết.
Node đầu tiên trong danh sách được gọi là Head Node, Node cuối cùng của danh sách được gọi là Tail Node.

So sánh giữa mảng và linked list
- Chèn phần tử: trên một danh sách liên kết, việc chèn phần tử chúng ta chỉ cần kết nối một phần tử mới ở bất kỳ đâu chúng ta muốn bằng cách bằng cách điều chỉnh con trỏ ở node này sang node tiếp theo. Còn đối với mảng chúng ta phải tạo một vùng lưu trữ mới lớn hơn và sao chép các phần tử hiện có, để lại những vùng trống nếu chưa có giá trị gây lãng phí.
- Tra cứu: việc tìm kiếm đến một giá trị được cung cấp chỉ mục (index) trên một danh sách có độ phức tạp là O(n), trong trường hợp xui xẻo nhất việc này khiến cho việc di chuyển trên một danh sách liên kết đơn khá chậm. Vì vậy người ta mở rộng ra các kiểu lưu trữ mới hơn như danh sách liên kết kép, vòng... Nhưng đối với một mảng việc tìm kiếm khi có index rất dễ dàng với độ phức tạp O(1).
- hiệu quả bộ nhớ: chúng ta có thể tính toán được không gian bộ nhớ dùng cho việc lưu trữ mảng thông qua số lượng index và kích thước cố định của kiểu dữ liệu.
Các thành phần trong linked list thường có
- Đếm số lượng node có trong danh sách.
- Xuất danh sách liên kết vừa tạo.
- Tìm phần tử chính giữa của danh sách.
- Đếm số lượng số âm trong danh sách liên kết.
- Tìm số âm cuối cùng trong danh sách liên kết.
- Đảo danh sách liên kết vừa nhập.
- Thêm một node có giá trị X vào cuối danh sách liên kết.
- Thêm một node có giá trị X vào vị trí thứ K của danh sách.
- xoá một node ở vị trí thứ K của danh sách.
- xoá tất cả các node có giá trị X trong danh sách.
- sửa tất cả các giá trị số âm thành số dương trong danh sách.
Cài đặt cơ bản
Tạo cấu trúc dữ liệu node và linked list
struct Node{
int data;
Node *pNext;
};
struct List{
Node *pHead;
Node *pTail;
};
Hàm khởi tạo linked list
ban đầu danh sách của chúng ta chưa có bất kỳ node nào nên các giá trị pHead và pTail là null.
Void Init(List &l){
l.pHead = NULL;
l.pTail = NULL;
};
Hàm tạo node mới và gán giá trị

Node *CreateNode(int x){
Node *p = new Node;
if (p == NULL)
return NULL;
else{
p->data = x;
p->pNext = NULL;
}
return p;
}
Hàm thêm node mới vào đầu danh sách

Void AddHead(List &l, Node *p){
if (l.pHead == NULL){
l.pHead = p;
l.pTail = l.pHead;
}
p->pNext = l.pHead;
l.pHead = p;
}
Hàm xoá node đầu danh sách

Void RemoveHead(List &l, Node *p){
Node *p = l.pHead;
l.pHead = l.pHead->pNext;
delete p;
}Hàm thêm node vào cuối danh sách

void AddTail(List &l, Node *p){
if (l.pHead == NULL){
l.pHead = p;
l.pTail = l.pHead;
}
l.pTail->pNext = p;
l.pTail = p;
}
Hàm đảo danh sách liên kết
void ReverseList(List &l, Node *p){
Node *p, *q;
p = l.pHead;
l.pTail = p;
p = p->pNext;
l.pHead = p->pNext;
l.pTail->pNext = NULL;
p->pNext = l.pTail;
while (l.pHead != NULL){
q = l.pHead->pNext;
l.pHead->pNext = p;
p = l.pHead;
if (q != NULL)
l.pHead = q;
else
break;
}
}Kết luận
Kết luận là có nhiều cấu trúc dữ liệu khác nhau. Mỗi cấu trúc dữ liệu có điểm mạnh và điểm yếu ảnh hưởng đến hiệu suất tùy thuộc vào nhiệm vụ. Hôm nay, chúng ta đã khám phá hai cấu trúc dữ liệu: mảng và danh sách liên kết. Mảng cho phép truy cập ngẫu nhiên và yêu cầu ít bộ nhớ hơn cho mỗi phần tử (không cần không gian cho con trỏ) trong khi thiếu hiệu quả cho các hoạt động chèn / xóa và cấp phát bộ nhớ. Ngược lại, danh sách được liên kết có độ phức tạp về thời gian, chèn / xóa nhanh hơn. Tuy nhiên, danh sách liên kết có thời gian tìm kiếm chậm hơn và con trỏ yêu cầu thêm bộ nhớ cho mỗi phần tử trong danh sách.
Hình sau cho biết điểm mạnh yếu giữa mảng và danh sách liên kết.


Cùng trao đổi
Bình luận bằng tài khoản Google qua Blogger.
Nhận xét
Đăng nhận xét