Danh sách liên kết đôi (tt)

Một phần của tài liệu Danh sách list trong cấu trúc dữ liệu (Trang 56 - 80)

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) (adsbygoogle = window.adsbygoogle || []).push({});

{ 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

{ (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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) { (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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); }

Một phần của tài liệu Danh sách list trong cấu trúc dữ liệu (Trang 56 - 80)