Để quản lý một danh sách liên kết chúng ta có thể sử dụng nhiều phương pháp khác nhau và tương ứng với các phương pháp này chúng ta sẽ có các cấu trúc dữ liệu khác nhau, cụ thể: - Quản l
Trang 1Để quản lý một danh sách liên kết chúng ta có thể sử dụng nhiều phương pháp khác nhau và tương ứng với các phương pháp này chúng ta sẽ có các cấu trúc dữ liệu khác nhau, cụ thể:
- Quản lý địa chỉ phần tử đầu danh sách:
SLL_Type SLList1;
Hình ảnh minh họa:
- Quản lý địa chỉ phần tử đầu và cuối danh sách:
typedef struct SLL_PairNode { SLL_Type SLLFirst;
SLL_Type SLLLast;
} SLLP_Type;
SLLP_Type SLList2;
Hình ảnh minh họa:
- Quản lý địa chỉ phần tử đầu, địa chỉ phần tử cuối và số phần tử trong danh sách:
typedef struct SLL_PairNNode { SLL_Type SLLFirst;
SLL_Type SLLLast;
unsigned NumNode;
} SLLPN_Type;
SLLPN_Type SLList3;
Hình ảnh minh họa:
NumNode = 7
B Các thao tác trên danh sách liên kết đơn:
Với mỗi cách quản lý khác nhau của danh sách liên kết đơn , các thao tác cũng sẽ có sự khác nhau về mặt chi tiết song nội dung cơ bản ít có sự khác nhau Do vậy, ở đây chúng ta chỉ trình bày các thao tác theo cách quản lý thứ nhất (quản lý địa chỉ của phần tử đầu danh sách liên kết đơn), các cách quản lý khác sinh viên tự vận dụng để điều chỉnh cho thích hợp
w
Trang 2a Khởi tạo danh sách (Initialize):
Trong thao tác này chỉ đơn giản là chúng ta cho giá trị con trỏ quản lý địa chỉ phần tử đầu danh sách về con trỏ NULL Hàm khởi tạo danh sách liên kết đơn như sau:
void SLL_Initialize(SLL_Type &First) { First = NULL;
return;
} Hình ảnh minh họa:
SLList1 NULL
b Tạo mới một phần tử / nút:
Giả sử chúng ta cần tạo mới một phần tử có thành phần dữ liệu là NewData
- Thuật toán:
B1: First = new SLL_OneNode B2: IF (First = NULL)
Thực hiện Bkt B3: First->NextNode = NULL B4: First->Key = NewData Bkt: Kết thúc
- Cài đặt thuật toán:
Hàm SLL_Create_Node có prototype:
SLL_Type SLL_Create_Node(T NewData);
Hàm tạo mới một nút có thành phần dữ liệu là NewData, hàm trả về con trỏ trỏ tới địa chỉ của nút mới tạo Nếu không đủ bộ nhớ để tạo, hàm trả về con trỏ NULL
SLL_Type SLL_Create_Node(T NewData) { SLL_Type Pnode = new SLL_OneNode;
if (Pnode != NULL) { Pnode->NextNode = NULL;
Pnode->Key = NewData;
} return (Pnode);
}
- Minh họa thuật toán:
Giả sử chúng ta cần tạo nút có thành phần dữ liệu là 20: NewData = 20 Pnode = new SLL_OneNode
Pnode
Pnode->NextNode = NULL Pnode->Key = NewData
w
Trang 3Pnode 20 NULL
c Thêm một phần tử vào trong danh sách:
Giả sử chúng ta cần thêm một phần tử có giá trị thành phần dữ liệu là NewData vào trong danh sách Việc thêm có thể diễn ra ở đầu, cuối hay ở giữa danh sách liên kết
Do vậy, ở đây chúng ta trình bày 3 thao tác thêm riêng biệt nhau:
- Thuật toán thêm phần tử vào đầu danh sách liên kết đơn:
B1: NewNode = SLL_Create_Node (NewData) B2: IF (NewNode = NULL)
Thực hiện Bkt B3: NewNode->NextNode = SLList // Nối SLList vào sau NewNode B4: SLList = NewNode // Chuyển vai trò đứng đầu của NewNode cho SLList Bkt: Kết thúc
- Minh họa thuật toán:
Giả sử chúng ta cần thêm nút có thành phần dữ liệu là 25: NewData = 25 NewNode
NULL
NewNode->NextNode = SLList:
NewNode
25
NULL
SLList = NewNode:
NewNode
25
Kết quả sau khi chèn:
- Thuật toán thêm phần tử vào cuối danh sách liên kết đơn:
B1: NewNode = SLL_Create_Node (NewData) B2: IF (NewNode = NULL)
w
Trang 4Thực hiện Bkt B3: IF (SLList = NULL) B3.1: SLList = NewNode B3.2: Thực hiện Bkt // Tìm đến địa chỉ của phần tử cuối cùng trong danh sách liên kết đơn B4: CurNode = SLList
B5: IF (CurNode->NextNode = NULL) Thực hiện B8
B6: CurNode = CurNode->NextNode // Chuyển qua nút kế tiếp B7: Lặp lại B5
B8: CurNode->NextNode = NewNode // Nối NewNode vào sau CurNode Bkt: Kết thúc
- Minh họa thuật toán:
Giả sử chúng ta cần thêm nút có thành phần dữ liệu là 25: NewData = 25
NULL
CurNode->NextNode = NewNode:
NULL
Kết quả sau khi chèn:
- Thuật toán thêm phần tử vào giữa danh sách liên kết đơn:
Giả sử chúng ta cần thêm một phần tử có giá trị thành phần dữ liệu là NewData vào trong danh sách SLList vào ngay sau nút có địa chỉ InsNode Trong thực tế nhiều khi chúng ta phải thực hiện thao tác tìm kiếm để xác định địa chỉ InsNode, ở đây giả sử chúng ta đã xác định được địa chỉ này
B1: NewNode = SLL_Create_Node (NewData) B2: IF (NewNode = NULL)
Thực hiện Bkt B3: IF (InsNode->NextNode = NULL) B3.1: InsNode->NextNode = NewNode B3.2: Thực hiện Bkt
w
Trang 5// Nối các nút kế sau InsNode vào sau NewNode B4: NewNode->NextNode = InsNode->NextNode // Chuyển mối liên kết giữa InsNode với nút kế của nó về NewNode B5: InsNode->NextNode = NewNode
Bkt: Kết thúc
- Minh họa thuật toán:
Giả sử chúng ta cần thêm nút có thành phần dữ liệu là 25 vào sau nút có địa chỉ InsNode như sau: NewData = 25
NewNode->NextNode = InsNode->NextNode:
InsNode->NextNode = NewNode:
SLList
InsNode Kết quả sau khi chèn:
- Cài đặt thuật toán:
Các hàm thêm phần tử tương ứng với các trường hợp có prototype như sau:
SLL_Type SLL_Add_First(SLL_Type &SList, T NewData);
SLL_Type SLL_Add_Last(SLL_Type &SList, T NewData);
SLL_Type SLL_Add_Mid(SLL_Type &SList, T NewData, SLL_Type &InsNode);
Hàm thực hiện việc chèn phần tử có giá trị thành phần dữ liệu NewData vào trong danh sách liên kết đơn quản lý bởi con trỏ đầu danh sách SList tương ứng với 3 trường hợp: Thêm đầu, thêm cuối, thêm giữa Các hàm trả về giá trị là địa chỉ của nút đầu tiên nếu việc thêm thành công Trong trường hợp ngược lại, các hàm trả về con trỏ NULL
Riêng đối với trường hợp thêm giữa, hàm SLL_Add_Mid thực hiện việc thêm vào ngay sau nút có địa chỉ InsNode Nội dung của các hàm như sau:
w