4. Danh sách liên kết (tt)
4.3. Danh sách liên kết đôi (tt)
4.3.1. Quản lý danh sách liên kết liên kết đôi:
Quản lý địa chỉ phần tử đầu của danh sách
DLLType DLList1
Quản lý địa chỉ phần tử đầu và phần tử cuối của danh sách typedef struct DLLPairNode
{ DLLType DLLFirst; DLLType DLLLast; } DLLPType;
DLLPType DLList2;
Quản lý địa chỉ phần tử đầu, phần tử cuối và số phần tử của danh sách
typedef struct DLLPairNode { DLLType DLLFirst;
DLLType DLLLast; unsigned NumNode; } DLLPNType;
57
4.3. Danh sách liên kết đôi (tt)
4.3.2. Thao tác trên danh sách liên kết đôi a. Khởi tạo danh sách liên kết đôi
b. Tạo mới 1 phần tử
c. Thêm 1 phần tử vào danh sách
d. Duyệt qua các nút trong 1 danh sách e. Tìm kiếm 1 phần tử trong danh sách f. Loại bỏ 1 phần tử trong danh sách g. Hủy toàn bộ danh sách
h. Tạo 1 danh sách mới/Nhập danh sách i. Tách 1 danh sách thành nhiều danh sách j. Nhập nhiều danh sách thành 1 danh sách
k. Sắp xếp thứ tự thành phần dữ liệu trong danh sách l. Sao chép 1 danh sách thành 1 danh sách mới
4.3. Danh sách liên kết đôi (tt)
4.3.2.a. Khởi tạo danh sách liên kết đôi
Cho giá trị các con trỏ quản lý địa chỉ 2 nút đầu và cuối danh sách liên kết đôi về NULL
DLLPType DLLInitialize(DLLPType &DList) {
DList.DLLFirst = NULL; DList.DLLast = NULL; return (DList);
59
4.3. Danh sách liên kết đôi (tt)
4.3.2.b. Tạo mới 1 phần tử
Tạo nút mới có thành phần dữ liệu là NewData Thuật toán
B1: Dnode = New DLLOneNode B2: IF (Dnode == NULL)
Thực hiện BKT
B3: DNode ->NextNode = NULL B4: DNode ->Key = NewData B5: DNode ->PreNode = NULL BKT: Kết thúc
DLLType DLLCreateNode(T NewData) { DLLType Pnode = new DLLOneNode;
if (Pnode != NULL)
{ Pnode ->NextNode = NULL; Pnode ->Key = NewData
Pnode ->PreNode = NULL; }
return (Pnode); }
4.3. Danh sách liên kết đôi (tt)
4.3.2.c. Thêm 1 phần tử vào danh sách (Thêm đầu) B1: NewNode = DLLCreateNode(NewData) B2: IF (NewNode == NULL) Thực hiện BKT B3: IF(DLLList.DLLFirst == NULL) B3.1: DLLList.DLLFirst = NewNode B3.2: DLLList.DLLLast = NewNode B3.3: Thực hiện BKT
B4: NewNode ->NextNode = DLLList.DLLFirst B5: DLLList.DLLFirst ->PreNode = NewNode
// chuyển vai trò đứng đầu của NewNode cho DLLFirst B6: DLLList.DLLFirst = NewNode
61
4.3. Danh sách liên kết đôi (tt)
4.3.2.c. Thêm 1 phần tử vào danh sách (Thêm đầu) DLLType DLLAddFirst(DLLPType &DList, T NewData) {
DLLType NewNode = DLLCreateNode(NewData); if (NewNode == NULL)
return (NULL);
if (DList.DLLFirst == NULL)
DList.DLLFirst = DList.DLLLast = NewNode; else
{
NewNode ->NextNode = DList.DLLFirst; DList.DLLFirst ->PreNode = NewNode; DList.DLLFirst = NewNode;
}
return (NewNode); }
4.3. Danh sách liên kết đôi (tt)
4.3.2.c. Thêm 1 phần tử vào danh sách (Thêm cuối) B1: NewNode = DLLCreateNode(NewData) B2: IF (NewNode == NULL) Thực hiện BKT B3: IF(DLLList.DLLFirst == NULL) B3.1: DLLList.DLLFirst = NewNode B3.2: DLLList.DLLLast = NewNode B3.3: Thực hiện BKT
B4: DLLList.DLLLast ->NextNode = NewNode B5: NewNode ->PreNode = DLLList.DLLLast
// chuyển vai trò đứng đầu của NewNode cho DLLFirst B6: DLLList.DLLLast = NewNode
63
4.3. Danh sách liên kết đôi (tt)
4.3.2.c. Thêm 1 phần tử vào danh sách (Thêm cuối) DLLType DLLAddLast(DLLPType &DList, T NewData) {
DLLType NewNode = DLLCreateNode(NewData); if (NewNode == NULL)
return (NULL);
if (DList.DLLLast == NULL)
DList.DLLFirst = DList.DLLLast = NewNode; else
{
DList.DLLLast ->NextNode = NewNode; NewNode ->PreNode = DList.DLLLast; DList.DLLLast = NewNode;
}
return (NewNode); }
4.3. Danh sách liên kết đôi (tt)
4.3.2.c. Thêm 1 phần tử vào danh sách (Thêm giữa) B1: IF (InsNode ->NextNode == NULL)
B1.1: DLLAddLast(DLLList, NewData) B1.2: Thực hiện BKT
B2: NewNode = DLLCreateNode(NewData) B3: IF (NewNode == NULL)
Thực hiện BKT
B4: NewNode ->NextNode = InsNode ->NextNode B5: InsNode ->NextNode ->PreNode = NewNode
B6: InsNode ->NextNode = NewNode B7: NewNode ->PreNode = InsNode BKT: Kết thúc
65
4.3. Danh sách liên kết đôi (tt)
4.3.2.c. Thêm 1 phần tử vào danh sách (Thêm giữa)
DLLType DLLAddMid(DLLPType &DList, T NewData, DLLType &InsNode)
{ DLLType NewNode = DLLCreateNode(NewData); if (NewNode == NULL)
return (NULL);
if (InsNode ->NextNode == NULL)
{ InsNode ->NextNode = NewNode; NewNode ->PreNode = InsNode; DList.DLLLast = NewNode;
} else
{ NewNode ->NextNode = InsNode ->NextNode; InsNode ->NextNode ->PreNode = NewNode; InsNode ->NextNode = NewNode;
NewNode ->PreNode = InsNode; }
return (NewNode); }
4.3. Danh sách liên kết đôi (tt)
4.3.2.d. Duyệt qua các nút trong 1 danh sách Thuật toán
B1: CurrNode = DLLList.First B2: IF (CurrNode == NULL)
Thực hiện BKT
B3: OutputData(CurrNode->Key)
B4: CurrNode = CurrNode ->NextNode B5: Lặp lại B2
BKT: Kết thúc
Cài đặt thuật toán
void DLLTravelling (DLLPType DList)
{ DLLType CurrNode = DList.DLLFirst; while (CurrNode != NULL)
{ OutputData(CurrNode->Key);
CurrNode = CurrNode ->NextNode ; }
return; }
67
4.3. Danh sách liên kết đôi (tt)
4.3.2.e. Tìm kiếm 1 phần tử trong danh sách Thuật toán
B1: CurrNode = DLLList.First
B2: IF (CurrNode == NULL OR CurrNode->Key = SearchData) Thực hiện BKT
B3: CurrNode = CurrNode ->NextNode B4: Lặp lại B2
BKT: Kết thúc
Cài đặt thuật toán
DLLType DLLSearching(DLLPType Dlist, T SearchData) { DLLType CurrNode = DList.DLLFirst;
while (CurrNode != NULL)
{ if (CurrNode->Key == SearchData) break;
CurrNode = CurrNode ->NextNode }
return (CurrNode); }
68
4.3. Danh sách liên kết đôi (tt)
4.3.2.f. Loại bỏ 1 phần tử trong danh sách Thuật toán
B1: DelNode = DLLSearching(DLLList. DelData) // Tìm kiếm nút DelData B2: IF(DelNode == NULL)
Thực hiện BKT
B3: IF(DelNode->PreNode=NULL AND DelNode->NextNode=NULL) B3.1: DLLList.DLLFirst = DLLList.DLLLast = NULL
B3.2: Thực hiện B8
B4: IF (DelNode ->PreNode = NULL) // Loại nút đầu tiên trong DS B4.1: DLLList.DLLFirst = DLLList.DLLFirst ->NextNode
B4.2: DLLList.DLLFirst ->PreNode = NULL B4.3: Thực hiện B8
B5: IF (DelNode ->NextNode = NULL) // Loại nút cuối trong DS B4.1: DLLList.DLLLast = DLLList.DLLLast ->PreNode B4.2: DLLList.DLLLast ->NextNode = NULL
B4.3: Thực hiện B8
// Liên kết giữa nút trước và sau nút bị xóa
B6: DelNode ->PreNode ->NextNode = DelNode ->NextNode B7: DelNode ->NextNode ->PreNode = DelNode ->PreNode // Bỏ mối liên kết giữa DelNode giữa 2 nút trước & sau
B8: DelNode ->NextNode = DelNode ->PreNode = NULL B9: delete DelNode
69
4.3. Danh sách liên kết đôi (tt)
4.3.2.f. Loại bỏ 1 phần tử trong danh sách Cài đặt thuật toán
Int DLLDeleteNode (DLLPType &DList, T DelData)
{ DLLType DelNode = DLLSearching(DList, DelData) if (DelNode == NULL)
return (-1);
if (DelNode ->NextNode == NULL && DelNode ->PreNode == NULL) DList.DLLFirst = DList.DLLLast = NULL;
else
if (DelNode ->PreNode ==NULL)
{ DList.DLLFirst = Dist.DLLFirst ->NextNode ; Dist.DLLFirst ->PreNode = NULL;
}else else
if (DelNode ->NextNode ==NULL)
{ DList.DLLLast = Dist.DLLLast ->PreNode ; Dist.DLLLast ->NextNode = NULL;
}else else
{ DelNode ->PreNode ->NextNode = DelNode ->NextNode; DelNode ->NextNode ->PreNode = DelNode ->PreNode ; }
4.3. Danh sách liên kết đôi (tt)
4.3.2.g. Hủy toàn bộ danh sách
Thực hiện nhiều lần thao tác hủy một nút Thuật toán
B1: IF (DLLList.DLLFirst == NULL) Thực hiện BKT
B2: TempNode = DLLList.DLLFirst
B3: DLLList.DLLFirst = DLLList.DLLFirst ->NextNode B4: IF (DLLList.DLLFirst == NULL)
B4.1: DLLList.DLLLast = NULL B4.2: Thực hiện B7
B5: DLLList.DLLFirst ->PreNode = NULL B6: TempNode ->NextNode = NULL
B7: delete TempNode B8: Lặp lại B1
71
4.3. Danh sách liên kết đôi (tt)
4.3.2.g. Hủy toàn bộ danh sách (tt) Cài đặt thuật toán
void DLLDelete (DLLPType &DList) {
DLLType TempNode = DList.DLLFirst; while (TempNode != NULL)
{
DList.DLLFirst = DList.DLLFirst ->NextNode; TempNode ->NextNode = NULL;
if (DList.DLLFirst != NULL)
DList.DLLFirst ->PreNode = NULL; delete TempNode;
TempNode = DList.DLLFirst; }
return; }
4.3. Danh sách liên kết đôi (tt)
4.3.2.h. Tạo 1 danh sách mới/Nhập danh sách
Thuật toán B1: DLLInitialize(DLLList) B2: I = 1 B3: IF (I >N) Thực hiện BKT B4: NewData = InputNewData(); B5: DLLAddLast(DLLList, NewData) B6: I++ B7: Lặp lại B3 BKT: Kết thúc
73
4.3. Danh sách liên kết đôi (tt)
4.3.2.h. Tạo 1 danh sách mới/Nhập danh sách
Cài đặt thuật toán
DLLPType DLLCreate (DLLPType &DList, int N) {
DLLInitialize(DList); T NewData;
for (int i=0; i <N; i++) {
NewData = InputNewData();
if (DLLAddLast(DList, NewData) == NULL) { DLLDelete(DList); break; } } return (DList); }
4.3. Danh sách liên kết đôi (tt)
75
4.3. Danh sách liên kết đôi (tt)
4.3. Danh sách liên kết đôi (tt)
4.3.2.k. Sắp xếp thứ tự thành phần dữ liệu trong danh sách B1: Inode = DLLList.DLLFirst B2: IF(Inode == NULL) Thực hiện BKT B3: IF (Inode == DLLList.DLLLast) Thực hiện BKT B4: Jnode = DLLList.DLLLast B5: IF (Jnode = Inode) Thực hiện B7 B6: ELSE
B6.1: If (Jnode->Key < Jnode ->PreNode ->Key) Swap (Jnode ->Key, Jnode ->PreNode ->Key) B6.2: Jnode = Jnode ->NextNode
B6.3: Lặp lại B5
B7: Inode = Inode ->NextNode B8: Lặp lại B3
77
4.3. Danh sách liên kết đôi (tt)
4.3.2.k. Sắp xếp thứ tự thành phần dữ liệu trong danh sách (tt) Cài đặt thuật toán
void DLLBubbleSort (DLLPType &DList) { DLLType Inode = DList.DLLFirst;
if (Inode == NULL) return;
while (Inode != DList.DLLLast)
{ DLLType Jnode = DList.DLLLast; while (Jnode != Inode)
{ if (Jnode->Key < Jnode ->PreNode ->Key)
Swap(Jnode->Key,Jnode->PreNode->Key) Jnode = Jnode ->PreNode ;
}
Inode = Inode ->NextNode ; }
return; }
4.3. Danh sách liên kết đôi (tt)
4.3.2.l. Sao chép 1 danh sách thành 1 danh sách mới
Thuật toán B1: DLLInitialize(NewList) B2: CurrNode = DLLList.DLLFirst B3: IF (CurrNode == NULL) Thực hiện BKT B4: DLLAddLast(NewList, CurrNode->Key) B5: CurrNode = CurrNode ->NextNode
B6: Lặp lại B3 BKT: Kết thúc
79
4.3. Danh sách liên kết đôi (tt)
4.3.2.l. Sao chép 1 danh sách thành 1 danh sách mới
Cài đặt thuật toán
DLLPType DLLCopy(DLLPType &DList, DLLPType &NewList) {
DLLInitialize(NewList);
DLLType CurrNode = DList.DLLFirst; while (CurrNode != NULL)
{
if (DLLAddLast(NewList, CurrNode->Key) == NULL) { DLLDelete(NewList);
break; }
CurrNode = CurrNode ->NextNode ; }
return (NewList); }