1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng môn Cấu trúc dữ liệu - Chương 4: Danh sách (list)

112 4 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 112
Dung lượng 281,76 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng môn Cấu trúc dữ liệu - Chương 4: Danh sách (list) có cấu trúc gồm 5 phần cung cấp cho người học các kiến thức: Khái niệm danh sách, các phép tính toán trên danh sách, danh sách đặc, danh sách liên kết, danh sách hạn chế. Mời các bạn cùng tham khảo nội dung chi tiết.

Trang 1

DANH SÁCH (LIST)

Trang 2

NỘI DUNG CHƯƠNG 4

1. Khái niệm danh sách

2. Các phép toán trên danh sách

3. Danh sách đặc

• Định nghĩa

• Biểu diễn danh sách đặc

• Các thao tác trên danh sách đặc

• Ưu nhược điểm và ứng dụng

Trang 3

1 Khái niệm danh sách

• Danh sách a1, a2, ….aN là tập hợp các phần tử có kiểu

dữ liệu xác định và giữa chúng có 1 mối quan hệ nào đó.Nếu biết phần tử ai  vị trí của phần tử ai+1

• Số phần tử trong một danh sách là chiều dài của 1 danh

sách Danh sách rỗng là danh sách có chiều dài = 0

• Cho T là một kiểu được định nghĩa trước, kiểu danh

sách TX gồm các phần tử thuộc kiểu T được định nghĩalà:

TX = < VX , OX >

Trong đó :

• VX = { tập hợp các thứ tự gồm một số biến động các phần tử kiểu

T }.

• OX = { tạo danh sách; tìm 1 phần tử trong danh sách; chèn 1

phần tử vào danh sách; huỷ 1 phần tử khỏi danh sách; liệt kê danh sách, sắp xếp danh sách.}.

Trang 4

2 Các phép toán trên danh sách

Tùy theo loại của từng danh sách sẽ có các phép toán khác

nhau, các phép toán thông thường như sau:

2.1 Tạo mới 1 danh sách

• Đưa vào danh sách nội dung các phần tử

• Chiều dài của danh sách là xác định

2.2 Thêm 1 phần tử vào danh sách

• Khi thêm 1 phần tử chiều dài danh sách tăng lên

• Có thao tác thêm vào đầu, cuối hay tại 1 vị trí xác định của

danh sách

2.3 Tìm kiếm 1 phần tử trong danh sách

• Tìm 1 phần tử trong danh sách thỏa mãn điều kiện nào đó

• Dùng các thuật toán tìm kiếm trong chương “Tìm kiếm”

Trang 5

2 Các phép toán trên danh sách

2.4 Loại bớt 1 phần tử trong danh sách

• Chiều dài danh sách giảm xuống 1 phần tử

• Công việc loại bớt cũng bao gồm thao tác tìm kiếm ra

phần tử cần hủy trong danh sách

2.5 Sửa đổi giá trị 1 phần tử trong danh sách

• Thay đổi thông tin của 1 phần tử trong danh sách

• Công việc cập nhật phần tử cũng bao gồm thao tác tìm

kiếm ra phần tử cần hủy trong danh sách

2.6 Sắp xếp danh sách

• Dùng các thuật toán trong chương sắp xếp

Trang 6

2 Các phép toán trên danh sách

2.7 Tách danh sách thành nhiều danh sách con

• Tách danh sách thành các DS con theo 1 quy luật chia

nào đó

• Tổng chiều dài các danh sách được chia bằng chiều dài

danh sách ban đầu

2.8 Nhập nhiều danh sách thành 1 danh sách

2.9 Sao chép 1 danh sách: Sao chép toàn bộ nội dung

của danh sách thành 1 danh sách khác

2.10 Hủy danh sách: Huỷ nội dung hay cả vùng nhớ chứa

DS

Trang 7

3 Danh sách đặc (Condensed List)

3.1 Định nghĩa

• Danh sách đặc là danh sách mà không gian bộ nhớ lưu

trữ các phần tử nằm kề cận nhau trong bộ nhớ

3.2 Biểu diễn danh sách đặc

Biểu diễn danh sách đặc dùng 1mảng các phần tử có

kiểu dử liệu là kiểu dữ liệu của các phần tử trong danhsách

Cần biết chiều dài tối đa của một danh sách đặc thông

Trang 8

3 Danh sách đặc (tt)

3.3 Các thao tác trên danh sách đặc

Một số thao tác trên danh sách đặc được thống kê tóm tắt:

3.3.1 Khởi tạo danh sách

Khởi tạo danh sách cho chiều dài danh sách trở về 0

void CD_Initialize(int &Len)

{

Len = 0;

return;

}

Trang 9

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.2 Tạo danh sách mới & nhập danh sách

Tạo danh sách mới có chiều dài tối đa MaxLen, hàm trả về

giá trị thực của danh sách mới được tạo

int CD_Create_List(T M[], int &Len)

Trang 10

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.3 Thêm 1 phần tử vào danh sách

Thêm 1 phần tử có giá trị NewValue vào trong danh sách có chiều dài

Length tại vị trí InsPos

Trang 11

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.3 Thêm 1 phần tử vào danh sách (tt)

int CD_InsertElement(T M[], int &Len, T NewValue, int

Trang 12

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.4 Tìm kiếm 1 phần tử trong danh sách

Dùng các thuật toán tìm kiếm tìm phần tử thỏa mãn điều

kiện trong danh sách

• Tìm kiếm tuyến tính

• Tìm nhị phân

Trang 13

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.5 Hủy 1 phần tử trong danh sách

• Loại bỏ phần tử có vị trí DelPosition trong danh sách M

có chiều dài Length (có thể có thao tác tìm kiếm xác định vị trí xóa phần tử)

Trang 14

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.5 Hủy 1 phần tử trong danh sách (tt)

int CD_Delete_Element(T M[], int &Len, int DelPos)

Trang 15

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.6 Sửa đổi giá trị cho 1 phần tử trong danh sách

• Giả sử phần tử trong danh sách được thay đổi ở tại vị

trí Position trong danh sách M có chiều dài Length

Thao tác sửa đổi là thao tác tìm kiếm phần tử cần có vị

trí (hay giá trị) và gán giá trị mới

• M[Pos] = NewValue;

Trang 16

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.7 Sắp xếp thứ tự phần tử trong danh sách

Dùng các thuật toán sắp xếp nội

• Giải thuật sắp xếp nổi bọt (Bubble Sort)

Giải thuật sắp xếp dựa trên phân hoạch (Quick Sort)

• Giải thuật sắp xếp chọn trực tiếp (Straight Selection

Sort)

• Giải thuật sắp xếp chèn trực tiếp (Straight Insertion

Sort)

• Giải thuật sắp xếp trộn trực tiếp (Straight Merge Sort)

• Giải thuật sắp xếp trộn tự nhiên (Natural Merge Sort)

Trang 17

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.8 Tách 1 danh sách thành nhiều danh sách

Có nhiều thao tác tách 1 danh sách thành nhiều danh

sách:

• Phân phối luân phiên theo đường chạy (distribute)

• Phân phối từng phần của danh sách thành các danh

sách con

• Tách các phần tử thỏa mãn điều kiện cho trước thành

các danh sách con

Giả sử cần tách danh sách M có chiều dài Length thành

các danh sách con SM1, SM2 có chiều dài tương ứng

là Slen1 và SLen2

Trang 18

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.8 Tách 1 danh sách thành nhiều danh sách (tt)

Trang 19

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.8 Tách 1 danh sách thành nhiều danh sách (tt)

void CS_Split(T M[], int Len, T SM1[], int &SLen1, T SM2[], int &SLen2) { int (Slen1 >=Len)

if (SLen1 + SLen2 != Len) SLen2 = Len - SLen1;

for (int i=0; i<SLen1; i++) SM1[i] = M[i];

for (int j=0; j<SLen1; i++, j++) SM1[j] = M[i];

return;

}

Trang 20

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.9 Nhập nhiều danh sách thành 1 danh sách

Các cách nhập danh sách:

• Ghép nối đuôi các danh sách thành danh sách mới có

chiều dài là tổng chiều dài các danh sách

• Trộn xen kẽ các phần tử trong danh sách con theo 1

quy luật nào đó thành 1 danh sách mới (dùng thuậttoán merge trong merge sort)

Giả sử cần ghép danh sách SM1, SM2 có chiều dài SLen1,

SLen2 thành danh sách M có chiều dài Len =SLen1+SLen2 theo thứ tự từ SM1 đến hết SM2

Trang 21

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.9 Nhập nhiều danh sách thành 1 danh sách(tt)

Trang 22

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.9 Nhập nhiều danh sách thành 1 danh sách(tt)

int CD_Concat(T SM1[], int SLen1, T SM2[], int SLen2, T M

Trang 23

3 Danh sách đặc

3.3 Các thao tác trên danh sách đặc (tt)

3.3.10 Sao chép 1 danh sách: Sao chép nội dung danh sách thành

1 danh sách khác có cùng chiều dài

int CD_Copy(T M[], int Len, T CM[]) // Hàm trả về chiều dài của DS

{ for (int i=0; i< Len; i++)

CM[i] = M[i];

return (Len)

}

Trang 24

• Nếu danh sách được cấp phát tĩnh, việc hủy bỏ chỉ có

tác dụng đưa chiều dài danh sách về 0, việc thu hồi bộ nhớ sẽ do ngôn ngữ lập trình thực hiện

Trang 25

3 Danh sách đặc

3.4 Ưu nhược điểm và ứng dụng

• Do phần tử được lưu trữ kề cập với nhau trong bộ nhớ,

danh sách đặc có các ưu điểm:

• Mật độ sử dụng danh sách là tối ưu tuyệt đối.

• Truy cập, tìm kiếm các phần tử là dễ dàng vì vị trí các phần tử

liền kề với nhau trong bộ nhớ.

• Nhược điểm của danh sách là khi thêm hay hủy 1 phần

tử trong danh sách cần dịch chuyển các phần tử còn lại qua vị trí khác

• Được ứng dụng nhiều trong cấu trúc dữ liệu mảng

(mảng 1 chiều, mảng nhiều chiều, mảng cấp phát tĩnh, mảng cấp phát động)

Trang 26

4 Danh sách liên kết (Linked List)

4.1 Định nghĩa

4.2 Danh sách liên kết đơn (Simply Linked List)

4.3 Danh sách liên kết kép (Doubly Linked List)

4.4 Ưu nhược điểm của danh sách liên kết

Trang 27

4 Danh sách liên kết

4.1 Định nghĩa

• Danh sách liên kết là tập hợp các phần tử mà giữa

chúng có một sự nối kết với nhau thông qua vùng liên kết của chúng

• Tùy cách kết nối ràng buộc giữa những phần tử này và

phần tử khác, danh sách liên kết chia thành các loại khác nhau:

• Danh sách liên kết đơn

• Danh sách liên kết đôi/kép

• Danh sách đa liên kết

• Danh sách liên kết vòng (vòng đơn, vòng đôi)

• Mỗi loại danh sách có cách biểu diễn theo các cấu trúc

dữ liệu và thao tác trên dữ liệu khác nhau

Trang 28

4.2 Danh sách liên kết đơn (SLL)

Trang 29

4.2 Danh sách liên kết đơn

4.2.1 Cấu trúc dữ liệu (tt)

Để quản lý danh sách liên kết có thể dùng nhiều phương

pháp khác nhau, mỗi phương pháp sẽ có cấu trúc dữ liệu

cụ thể

Quản lý địa chỉ phần đầu danh sách

SLLType SLList1;

Quản lý địa chỉ phần đầu và cuối danh sách

typedef struct SLL_PairNode

{ SLLType SLLFirst;

SLLType SLLLase;

} SLLPType;

SLLPType SLLList2;

Trang 30

4.2 Danh sách liên kết đơn

4.2.1 Cấu trúc dữ liệu (tt)

• Quản lý địa chỉ phần đầu, cuối và số phần tử của danh sách

typedef struct SLL_PairNNode

Trang 31

4.2 Danh sách liên kết đơn

4.2.2 Các thao tác trên danh sách liên kết đơn

a Khởi tạo danh sách SLL

b Tạo mới 1 phần tử (nút) trong danh sách SLL

c Thêm 1 phần tử vào danh sách SLL

• Thêm vào đầu | cuối | giữa danh sách liên kết đơn

d Duyệt qua các nút trong danh sách

e Tìm kiếm phần tử trong danh sách

f Hủy bỏ 1 phần tử trong danh sách

g Hủy danh sách

h Tạo mới danh sách/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ự các phần tử trong danh sách

h Sao chép 1 danh sách

Trang 32

4.2 Danh sách liên kết đơn

4.2.2.a Khởi tạo danh sách SLL

• Thao tác khởi tạo danh sách liên kết đơn là cho

giá trị con trỏ quản lý địa chỉ đầu của danh sách

về con trỏ NULL.

• Hàm khởi tạo danh sách liên kết đơn:

void SLLInitialize(SLLType &First)

{

First = NULL;

return;

}

Trang 33

4.2 Danh sách liên kết đơn

4.2.2 b Tạo mới 1 phần tử (nút) trong danh sách SLL

Giả sử tạo mới 1 phần tử có thành phần dữ liệu = NewData

Trang 34

4.2 Danh sách liên kết đơn

4.2.2 b Tạo mới 1 phần tử (nút) trong danh sách SLL (tt)

Cài đặt

Prototype: SLLType SLLCreateNode(T NewData)

SLLType SLLCreateNode(T NewData)

{

SLLType Pnode = New SLLOneNode;

if (Pnode != NULL)

{

Pnode ->NextNode = NULL;

Pnode ->Key = NewData;

}

return Pnode;

}

Trang 35

4.2 Danh sách liên kết đơn

4.2.2.c Thêm 1 phần tử vào danh sách SLL (Thêm đầu

Trang 36

4.2 Danh sách liên kết đơn

4.2.2.c Thêm 1 phần tử vào danh sách SLL (Thêm

Trang 37

4.2 Danh sách liên kết đơn

4.2.2.c Thêm 1 phần tử vào danh sách SLL (tt) (Thêm giữa

Trang 38

4.2 Danh sách liên kết đơn

4.2.2.c Thêm 1 phần tử vào danh sách SLL (Thêm giữa DS) (tt)

SLLType SLLAddLast (SLLType &SList, T NewData)

{ SLLType NewNode = SLLCreateNode(NewData);

SLLType CurrNode = SList;

while (CurrNode->NextNode != NULL)

CurrNode = CurrNode-> NextNode;

CurrNode-> NextNode = NewNode;

return (SList);

}

Trang 39

4.2 Danh sách liên kết đơn

4.2.2.c Thêm 1 phần tử vào danh sách SLL (Thêm cuối DS)

Trang 40

4.2 Danh sách liên kết đơn

4.2.2.c Thêm 1 phần tử vào danh sách SLL (Thêm cuối DS) (tt)

Cài đặt

SLLType SLLAddMid (SLLType &SList, T NewData, SLLType

&InsNode)

{ SLLType NewNode = SLLCreateNode(NewData);

if (NewNode == NULL) return (NULL);

if (InsNode->NextNode == NULL)

{ InsNode->NextNode = NewNode;

return (SList);

}

NewNode-> NextNode = InsNode->NextNode;

InsNode-> NextNode = NewNode;

return (SList);

}

Trang 41

4.2 Danh sách liên kết đơn

4.2.2.d Duyệt qua các nút trong danh sách liên kết đơn

• Là thao tác thường dùng trong các loại danh sách

• Tùy theo từng trường hợp cụ thể để xử lý trong khi

Trang 42

4.2 Danh sách liên kết đơn

4.2.2.d Duyệt qua các nút trong danh sách liên kết đơn (tt)

Cài đặt:

void SLLTravelling(SLLType SList)

{

SLLType CurrNode = SList;

while (CurrNode != NULL)

Trang 43

4.2 Danh sách liên kết đơn

4.2.2.e Tìm kiếm phần tử trong danh sách

• Giả sử cần tìm kiếm trong danh sách liên kết đơn

Trang 44

4.2 Danh sách liên kết đơn

4.2.2.e Tìm kiếm phần tử trong danh sách (tt)

Cài đặt

SLLType SLLSearching (SLLType &SList, T SearchData){

SLLType CurrNode = SList;

while (CurrNode != NULL)

Trang 45

4.2 Danh sách liên kết đơn

4.2.2.f Hủy bỏ 1 phần tử trong danh sách

• Loại bỏ phần tử (nút) có thành phần dữ liệu là DelData trong danh sách liên kết

đơn Gồm 2 thao tác: tìm phần tử có thành phần dữ liệu là DelData và loại bỏ phần

tử này (Trong quá trình tìm kiếm cần lưu trữ thành phần trước đó PreDelData)

B1: DelNode = SLList // Tìm kiếm phần tử có Key = DelData

B2: PreDelNode = NULL

B3: IF (DelNode == NULL) Thực hiện BKT

B4: IF (DelNode->Key == DelData) Thực hiện B8

B10: DelNode->NextNode = NULL // Cắt mối liên kết của DelNode với các nút còn lại

B11: delete DelNode // Hủy DelNode

BKT: Kết thúc

Trang 46

4.2 Danh sách liên kết đơn

4.2.2.f Hủy bỏ 1 phần tử trong danh sách (tt)

Cài đặt thuật toán trong C++ (Hàm trả về giá trị 1 nếu hủy thành công)

int SLLDeleteNode(SLLType &SList, T DelData)

{ SLLType DelNode = SList;

SLLType PreDelNode = NULL;

while (DelNode != NULL)

Trang 47

4.2 Danh sách liên kết đơn

Trang 48

4.2 Danh sách liên kết đơn

4.2.2.g Hủy danh sách (tt)

Cài đặt thuật toán:

void SLLDelete (SLLType &SList)

{

SLLType TempNode = SList;

while (SList != NULL)

{

SList = SList ->NextNode;

TempNode ->NextNode = NULL;

Trang 49

4.2 Danh sách liên kết đơn

4.2.2.h Tạo mới danh sách/Nhập danh sách

• Tạo mới 1 danh sách thực chất là liên tục thêm 1 phần tử

vào danh sách mà danh sách ban đầu là rỗng

Có thể dùng lại các hàm SLLAddFirst, SLLAddMid,

Trang 50

4.2 Danh sách liên kết đơn

4.2.2.h Tạo mới danh sách/Nhập danh sách (tt)

return (SList);

}

Trang 51

4.2 Danh sách liên kết đơn

4.2.2.k Sắp xếp thứ tự các phần tử trong danh sách

Thuật toán sắp xếp trộn tự nhiên:

B1: IF (SLLSplit(SLList, TempList) == NULL) Thực hiện BKT B2: SLLMerge(SLList, TempList, SLList)

B3: Lặp lại B1

BKT: Kết thúc

void SLLNaturalMergeSort(SLLType &SList)

{ SLLType TempList = NULL, List = NULL;

while (SLLSplit(SList,TempList) != NULL)

{ SLLMerge(SList, TempList, List);

SList = List;

}

return;

}

Trang 52

4.2 Danh sách liên kết đơn

4.2.2.h Sao chép 1 danh sách

• Sao chép 1 danh sách thực chất là 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 để tạo thành 1 nút mới & bổ sung nút

mới này vào danh sách NewList

Trang 53

4.2 Danh sách liên kết đơn

4.2.2.h Sao chép 1 danh sách (tt)

Cài đặt thuật toán:

SLLType SLLCopy(SLLType SList, SLLType &NewList)

{ NewList = NULL;

SLLType CurrNode = SList;

while (CurrNode != NULL)

{ SLLType NewNode=SLLAddLast(NewList,CurrNode->Key);

if (NewNode == NULL){ SLLDelete(NewList);

break;

}}

return (NewList);

}

Trang 54

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

• Các phần tử của danh sách liên kết đôi có 2 mối liên kết với

các phần tử khác trong danh sách

• Cấu trúc dữ liệu của danh sách liên kết đôi:

typedef struct DLLNode

Trang 55

4.3 Danh sách liên kết đôi

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

Trang 56

4.3 Danh sách liên kết đôi

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

Ngày đăng: 09/05/2021, 18:24

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w