Tải bản đầy đủ (.pdf) (5 trang)

Giáo trình hướng dẫn phân tích hàm Input new data để tách một list thành nhiều danh sách p2 pptx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (132.32 KB, 5 trang )

Giáo trình: Cấu Trúc Dữ Liệu và Giải Thuật
Trang: 108
B9: ELSE
B9.1: MinNode = SLList2
B9.2: SLList2 = SLList2->NextNode
B10: TempNode->NextNode = MinNode
B11: MinNode->NextNode = NULL
B12: TempNode = MinNode
B13: Lặp lại B6
Bkt: Kết thúc
- Cài đặt:
Các hàm nhập danh sách có prototype:
SLL_Type SLL_Concat (SLL_Type &SList1, SLL_Type &SList2);
SLL_Type SLL_Merge(SLL_Type &SList1, SLL_Type &SList2, SLL_Type &SList);
Hàm thực hiện việc nhập các nút trong hai danh sách SList1, SList2 thành một
danh sách theo thứ tự như hai thuật toán vừa trình bày. Hàm trả về đòa chỉ của nút
đầu của danh sách sau khi ghép.
Nội dung của các hàm như sau:
SLL_Type SLL_Concat (SLL_Type &SList1, SLL_Type &SList2)
{ if (SList1 == NULL)
{ SList1 = SList2;
return (SList1);
}
if (SList2 == NULL)
return (SList1);
SLL_Type LastNode = SList1;
while (LastNode->NextNode != NULL)
LastNode = LastNode->NextNode;
LastNode->NextNode = SList2;
return (SList1);
}


//================================================================
SLL_Type SLL_Merge (SLL_Type &SList1, SLL_Type &SList2, SLL_Type &SList)
{ if (SList1 == NULL)
{ SList = SList2;
return (SList);
}
if (SList2 == NULL)
{ SList = SList1;
return (SList);
}
SLL_Type LastNode = NULL;
SLL_Type TempNode;
while (SList1 != NULL && SList2 != NULL)
{ if (SList1->Key <= SList2->Key)
{ TempNode = SList1;
SList1 = SList1->NextNode;
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: 109
TempNode->NextNode = NULL;
if (LastNode == NULL)
SList = LastNode = TempNode;
else
{ LastNode->NextNode = TempNode;
LastNode = TempNode;
}
if (SList1 == NULL)
break;
if (SList1->Key < LastNode->Key)
while (SList2 != NULL)
{ LastNode->Next = SList2;
LastNode = LastNode->NextNode;
SList2 = SList2->NextNode;
LastNode->NextNode = NULL;
if (SList2 == NULL || SList2->Key < LastNode->Key)
break;
}
}
else
{ TempNode = SList2;
SList2 = SList2->NextNode;
TempNode->NextNode = NULL;
if (LastNode == NULL)
SList = LastNode = TempNode;
else
{ LastNode->NextNode = TempNode;

LastNode = TempNode;
}
if (SList2 == NULL)
break;
if (SList2->Key < LastNode->Key)
while (SList1 != NULL)
{ LastNode->Next = SList1;
LastNode = LastNode->NextNode;
SList1 = SList1->NextNode;
LastNode->NextNode = NULL;
if (SList1 == NULL || SList1->Key < LastNode->Key)
break;
}
}
}
if (SList1 == NULL)
LastNode->NextNode = SList2;
else
LastNode->NextNode = SList1;
return (SList);
}
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: 110
k. Sắp xếp thứ tự các phần tử trong danh sách:
Thao tác này chúng ta có thể vận dụng các thuật toán sắp xếp đã trình bày trong
Chương 3 để sắp xếp dữ liệu trong danh sách liên kết đơn. Ở đây chúng ta chỉ trình
bày sự vận dụng thuật toán trộn tự nhiên để sắp xếp.
Cũng cần lưu ý rằng đối với thao tác hoán vò hai phần tử thì chúng ta có thể hoán vò
hoàn toàn hai nút hoặc chỉ hoán vò phần dữ liệu. Tuy nhiên việc hoán vò hoàn toàn
hai nút sẽ phức tạp hơn.
- Thuật toán sắp xếp trộn tự nhiên:
B1: IF (SLL_Split(SLList, TempList) = NULL)
Thực hiện Bkt
B2: SLL_Merge(SLList, TempList, SLList)
B3: Lặp lại B1
Bkt: Kết thúc
- Cài đặt:
Hàm SLL_Natural_Merge_Sort có prototype:
void SLL_Natural_Merge_Sort (SLL_Type &SList);
Hàm thực hiện việc sắp xếp thành phần dữ liệu của các nút trong danh sách SList
theo thứ tự tăng dựa trên thuật toán trộn tự nhiên vừa trình bày.
Nội dung của hàm như sau:
void SLL_Natural_Merge_Sort (SLL_Type &SList)
{ SLL_Type TempList = NULL, List = NULL;
while (SLL_Split(SList, TempList) != NULL)

{ SLL_Merge(SList, TempList, List);
SList = List;
}
return ;
}
h. Sao chép một danh sách:
Thực chất thao tác này là chúng ta tạo mới danh sách NewList bằng cách duyệt qua
các nút của SLList để lấy thành phần dữ liệu rồi tạo thành một nút mới và bổ sung
nút mới này vào cuối danh sách NewList.
- Thuật toán:
B1: NewList = NULL
B2: CurNode = SLList
B3: IF (CurNode = NULL)
Thực hiện Bkt
B4: SLL_Add_Last(NewList, CurNode->Key)
B5: CurNode = CurNode->NextNode
B6: Lặp lại B3
Bkt: Kết thúc
- Cài đặt thuật toán:
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: 111
Hàm SLL_Copy có prototype:
SLL_Type SLL_Copy (SLL_Type SList, SLL_Type &NewList);
Hàm thực hiện việc sao chép nội dung danh sách SList thành danh sách NewList
có cùng nội dung thành phần dữ liệu theo thứ tự của các nút trong SList. Hàm trả
về đòa chỉ nút đầu trong danh sách mới nếu việc sao chép thành công, ngược lại
hàm trả về con trỏ NULL.
Nội dung của hàm như sau:
SLL_Type SLL_Copy (SLL_Type SList, SLL_Type &NewList)
{ NewList = NULL;
SLL_Type CurNode = SList;
while (CurNode != NULL)
{ SLL_Type NewNode = SLL_Add_Last(NewList, CurNode->Key);
if (NewNode == NULL)
{ SLL_Delelte(NewList);
break;
}
CurNode = CurNode->NextNode;
}
return (NewList);
}
4.4.3. Danh sách liên kết kép (Doubly Linked List)
A. Cấu trúc dữ liệu:
Nếu như vùng liên kết của danh sách liên kết đơn có 01 mối liên kết với 01 phần tử
khác trong danh sách thì vùng liên kết trong danh sách liên đôi có 02 mối liên kết

với 02 phần tử khác trong danh sách, cấu trúc dữ liệu của mỗi nút trong danh sách
liên kết đôi như sau:
typedef struct DLL_Node
{ T Key;
InfoType Info;
DLL_Node * NextNode; // Vùng liên kết quản lý đòa chỉ phần tử kế tiếp nó
DLL_Node * PreNode; // Vùng liên kết quản lý đòa chỉ phần tử trước nó
} DLL_OneNode;
Ở đây chúng ta cũng giả thiết rằng vùng dữ liệu của mỗi phần tử trong danh sách
liên kết đôi chỉ bao gồm một thành phần khóa nhận diện (Key) cho phần tử đó. Do
vậy, cấu trúc dữ liệu trên có thể viết lại đơn giản như sau:
typedef struct DLL_Node
{ T Key;
DLL_Node * NextNode; // Vùng liên kết quản lý đòa chỉ phần tử kế tiếp nó
DLL_Node * PreNode; // Vùng liên kết quản lý đòa chỉ phần tử trước nó
} DLL_OneNode;
typedef DLL_OneNode * DLL_Type;
Có nhiều phương pháp khác nhau để quản lý các danh sách liên kết đôi và tương
ứng với các phương pháp này sẽ có các cấu trúc dữ liệu khác nhau, cụ thể:
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: 112
- Quản lý đòa chỉ phần tử đầu danh sách:
Cách này hoàn toàn tương tự như đối với danh sách liên kết đơn.
DLL_Type DLL_List1;
Hình ảnh minh họa:
DLL_List1 NULL
15 10 20 18 40 30
NULL
- Quản lý đòa chỉ phần tử đầu và cuối danh sách:
typedef struct DLL_PairNode
{ DLL_Type DLL_First;
DLL_Type DLL_Last;
} DLLP_Type;
DLLP_Type DLL_List2;
Hình ảnh minh họa:
DLL_List2
DLL_First DLL_Last
NULL
15 10 20 18 40 30
NULL
- 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 DLL_PairNNode
{ DLL_Type DLL_First;
DLL_Type DLL_Last;
unsigned NumNode;

} DLLPN_Type;
DLLPN_Type DLL_List3;
Hình ảnh minh họa:
DLL_List3
DLL_First NumNode=6 DLL_Last
NULL
15 10 20 18 40 30
NULL
B. Các thao tác trên danh sách liên kết đôi:
Cũng như trong phần danh sách liên kết đơn, các thao tác tương ứng với mỗi cách
quản lý khác nhau của danh sách liên kết đôi 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ứ hai (quản lý các đòa chỉ của hai nút đầu và cuối danh sách
liên kết đôi), các thao tác này trê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.
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
.

×