Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 113 a. 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ò các con trỏ quản lý đòa chỉ hai nút đầu và cuối danh sách liên kết đôi về con trỏ NULL. Hàm khởi tạo danh sách liên kết đôi như sau: DLLP_Type DLL_Initialize(DLLP_Type &DList) { DList.DLL_First = NULL; DList.DLL_Last = NULL; return (DList); } Hình ảnh minh họa: DList NULL DLL_First DLL_Last 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: DNode = new DLL_OneNode B2: IF (DNode = NULL) Thực hiện Bkt B3: DNode->NextNode = NULL B4: DNode->PreNode = NULL B5: DNode->Key = NewData Bkt: Kết thúc - Cài đặt thuật toán: Hàm DLL_Create_Node có prototype: DLL_Type DLL_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. DLL_Type DLL_Create_Node(T NewData) { DLL_Type Pnode = new DLL_OneNode; if (Pnode != NULL) { Pnode->NextNode = NULL; Pnode->PreNode = 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 Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 114 Pnode = new DLL_OneNode Pnode Pnode->NextNode = NULL Pnode->PreNode = NULL Pnode->Key = NewData Pnode NULL 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 đôi: B1: NewNode = DLL_Create_Node (NewData) B2: IF (NewNode = NULL) Thực hiện Bkt B3: IF (DLL_List.DLL_First = NULL) // Danh sách rỗng B3.1: DLL_List.DLL_First = NewNode B3.2: DLL_List.DLL_Last = NewNode B3.3: Thực hiện Bkt B4: NewNode->NextNode = DLL_List.DLL_First // Nối DLL_First vào B5: DLL_List.DLL_First->PreNode = NewNode // sau NewNode // Chuyển vai trò đứng đầu của NewNode cho DLL_First B6: DLL_List.DLL_First = 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à 27: NewData = 27 NewNode NULL 27 NULL DLL_List DLL_First DLL_Last NULL 16 20 18 40 30 NULL NewNode->NextNode = DLL_List.DLL_First: Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 115 NewNode 27 NULL DLL_List DLL_First DLL_Last NULL 16 20 18 40 30 NULL DLL_List.DLL_First->PreNode = NewNode: NewNode 27 NULL DLL_List DLL_First DLL_Last NULL 16 20 18 40 30 DLL_List.DLL_First = NewNode: NewNode 27 NULL DLL_List DLL_First DLL_Last NULL 16 20 18 40 30 Kết quả sau khi chèn: DLL_List DLL_First DLL_Last NULL 27 16 20 18 40 30 NULL - Thuật toán thêm phần tử vào cuối danh sách liên kết đôi: B1: NewNode = DLL_Create_Node (NewData) B2: IF (NewNode = NULL) Thực hiện Bkt B3: IF (DLL_List.DLL_First = NULL) // Danh sách rỗng Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 116 B3.1: DLL_List.DLL_First = NewNode B3.2: DLL_List.DLL_Last = NewNode B3.3: Thực hiện Bkt B4: DLL_List.DLL_Last->NextNode = NewNode // Nối NewNode vào B5: NewNode->PreNode = DLL_List.DLL_Last // sau DLL_Last // Chuyển vai trò đứng cuối của NewNode cho DLL_Last B6: DLL_List.DLL_Last = 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: NewData = 25 NewNode NULL 25 NULL DLL_List DLL_First DLL_Last NULL 16 20 18 40 30 NULL DLL_List.DLL_Last->NextNode = NewNode: NewNode NULL 25 NULL DLL_List DLL_First DLL_Last 16 20 18 40 30 NULL NewNode->PreNode = DLL_List.DLL_Last NewNode NULL 25 DLL_List DLL_First DLL_Last 16 20 18 40 30 NULL Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật Trang: 117 DLL_List.DLL_Last = NewNode: NewNode NULL 25 DLL_List DLL_First DLL_Last 16 20 18 40 30 NULL Kết quả sau khi chèn: DLL_List DLL_First DLL_Last NULL 16 20 18 40 30 25 NULL - Thuật toán thêm phần tử vào giữa danh sách liên kết đôi: 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 DLL_List 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: IF (InsNode->NextNode = NULL) // Thêm vào cuối DSLK B1.1: DLL_Add_Last (DLL_List, NewData) B1.2: Thực hiện Bkt B2: NewNode = DLL_Create_Node (NewData) B3: IF (NewNode = NULL) Thực hiện Bkt // Nối các nút kế sau InsNode vào sau NewNode B4: NewNode->NextNode = InsNode->NextNode B5: InsNode->NextNode->PreNode = NewNode // Chuyển mối liên kết giữa InsNode với nút kế của nó về NewNode B6: InsNode->NextNode = NewNode B7: NewNode->PreNode = InsNode 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 Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m Click to buy NOW! P D F - X C h a n g e V i e w e r w w w . d o c u - t r a c k . c o m . . 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. DLL_Type DLL_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 B3: IF (DLL _List. DLL_First = NULL) // Danh sách rỗng B3.1: DLL _List. DLL_First = NewNode B3.2: DLL _List. DLL_Last = NewNode B3.3: Thực hiện Bkt B4: NewNode->NextNode = DLL _List. DLL_First