Ngộ nhận ra bài này mình viết code rất dở, để khi nào rảnh sẽ edit lại. Danh sách liên kết có những ứng dụng rất thú vị
- Cung cấp giải pháp để chứa cấu trúc dữ liệu tuyến tính.
- Dễ dàng thêm hoặc xóa các phần tử trong danh sách mà không cần phải cấp phát hoặc tổ chức lại trật tự của mảng.
- Cấp phát bộ nhớ động
- Một danh sách liên kết đơn giản không cho phép truy cập ngẫu nhiên dữ liệu.
- Chính vì lí do trên mà một số phép tính như tìm phần tử cuối cùng, xóa phần tử ngẫu nhiên hay chèn thêm, tìm kiếm có thể phải duyệt tất cả các phần tử.
- Danh sách tuyến tính (Linear list):
- Danh sách vòng (circular list):
- Danh sách liên kết đôi (Double list):
Head: biến tham chiếu trỏ đến phần tử đầu tiên của danh sách.
Struct LLnode {
DataType Data;
LLnode* next;
};
struct LLintNode {
int Data;
struct LLintNode* Next;
};
int LengthLL(LLNode* head) {
int length = 0;
while (head != NULL) {
++length;
head = head ->Next;
}
return length;
}
void AddLast(LLNode** head, int data) {
LLNode** tmp = head;
LLNode* NewNode;
NewNode = (LLNode*) malloc(sizeof(LLNode));
NewNode->Data = data;
NewNode->Next = NULL;
if ((*tmp) == NULL) {
(*tmp) = NewNode;
} else {
while ((*tmp)->Next !=NULL) {
tmp = &((*tmp)->Next);
}
(*tmp)->Next = NewNode;
}
}
void RemoveLast(LLNode** head) {
LLNode** tmp = head;
if ((*tmp) !=NULL) {
while ((*tmp)->Next != NULL) {
tmp = &((*tmp)->Next);
}
}
(*tmp) = NULL;
}
void AddFirst(LLNode** head, int Data) {
LLNode** tmp = head;
LLNode* NewNode;
NewNode = (LLNode*) malloc(sizeof(LLNode));
NewNode->Data = Data;
NewNode->Next = (*head);
(*tmp) = NewNode;
}
void RemoveFirst(LLNode** head) {
LLNode** tmp = head;
if ((*tmp) != NULL) {
(*tmp) = (*tmp)->Next;
}
}
LLNode* FindNode(LLNode** head,LLNode* src) {
LLNode** tmp = head;
while ( src->Data != (*tmp)->Data) {
tmp = &((*tmp)->Next);
}
return (*tmp);
}
int InsertNode(LLNode** head, LLNode* current, LLNode* NewNode) {
LLNode** tmp = head;
while ((current != (*tmp)) && (*tmp != NULL)) {
tmp = &((*tmp)->Next);
}
if (*tmp == NULL) {
return 0;
} else {
NewNode->Next= current->Next;
current->Next = NewNode;
(*tmp) = current;
return 1;
}
}
int RemoveNode(LLNode** head, LLNode* current) {
LLNode** tmp = head;
while ((current != (*tmp)) && (*tmp != NULL)) {
tmp = &((*tmp)->Next);
}
if (*tmp == NULL) {
return 0;
} else {
(*tmp) = (*tmp)->Next;
return 1;
}
}