1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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 p1 potx

5 228 0
Tài liệu đã được kiểm tra trùng lặp

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 5
Dung lượng 156,68 KB

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

Nội dung

Tạo mới danh sách/ Nhập danh sách: Việc tạo mới một danh sách liên kết đơn thực chất là chúng ta liên tục thực hiện thao tác thêm một phần tử vào danh sách mà ban đầu danh sách này là m

Trang 1

delete TempNode;

TempNode = SList;

} return ; }

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

Việc tạo mới một danh sách liên kết đơn thực chất là chúng ta liên tục thực hiện thao tác thêm một phần tử vào danh sách mà ban đầu danh sách này là một danh sách rỗng Có thể sử dụng một trong ba hàm thêm phần tử để thêm phần tử, ở đây chúng

ta sử dụng hàm SLL_Add_First

Giả sử chúng ta cần tạo danh sách liên kết đơn có N phần tử

- Thuật toán:

B1: SLL_Initialize(SLList) B2: i = 1

B3: IF (i > N) Thực hiện Bkt B4: NewData = InputNewData() // Nhập giá trị cho biến NewData B5: SLL_Add_First(SLList, NewData)

B6: i++

B7: Lặp lại B3 Bkt: Kết thúc

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

Hàm SLL_Create có prototype:

SLL_Type SLL_Create(SLL_Type &SList, int N);

Hàm tạo danh sách liên kết đơn có N nút quản lý bởi địa chỉ nút đầu tiên thông qua SList Hàm trả về địa chỉ của nút đầu tiên trong danh sách nếu việc tạo 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_Create(SLL_Type &SList, int N) { SLL_Initialize(SList);

T NewData;

for (int i = 0; i < N; i++) { NewData = InputNewData();

if (SLL_Add_First(SList, NewData) == NULL) { SLL_Delete (SList);

break;

} } return (SList);

}



 Lưu ý:

w

Trang 2

Hàm InputNewData thực hiện việc nhập vào nội dung của một biến có kiểu dữ liệu

T và trả về giá trị mới nhập vào Tùy vào từng trường hợp cụ thể mà chúng ta viết hàm InputNewData cho phù hợp

i Tách một danh sách thành nhiều danh sách:

Tương tự như danh sách đặc, việc tách một danh sách liên kết đơn thành nhiều danh sách liên kết đơn khác nhau cũng có nhiều tiêu thức khác nhau mà chúng ta sẽ thực hiện theo các cách khác nhau Ngoài ra việc tách cũng sẽ khác nhau trong trường hợp có hay không giữ lại danh sách ban đầu Ở đây chúng ta thực hiện việc tách các nút trong danh sách liên kết đơn SLList thành hai danh sách liên kết đơn con SLList và SLList1 luân phiên theo các đường chạy tự nhiên và không giữ lại danh sách liên kết ban đầu Các trường hợp khác sinh viên tự vận dụng để thao tác

- Thuật toán:

B1: CurNode = SLList B2: SLList1 = SLList B3: LastNode1 = NULL, LastNode2 = NULL // Cắt các nút từ sau đường chạy tự nhiên thứ nhất về SLList1 B4: IF (CurNode = NULL OR CurNode->NextNode = NULL) Thực hiện Bkt

B5: IF (CurNode->Key > CurNode->NextNode->Key) B5.1: LastNode1 = CurNode

B5.2: SLList1 = SLList1->NextNode B5.3: CurNode = CurNode->NextNode B5.4: LastNode1->NextNode = NULL B5.5: Thực hiện B8

B6: CurNode = CurNode->NextNode, SLList1 = SLList1->NextNode B7: Lặp lại B4

// Cắt các nút từ sau đường chạy tự nhiên thứ hai về SLList B8: IF (CurNode = NULL OR CurNode->NextNode = NULL) Thực hiện Bkt

B9: IF (CurNode->Key > CurNode->NextNode->Key) B9.1: LastNode2 = CurNode

B9.2: CurNode = CurNode->NextNode B9.3: LastNode2->NextNode = NULL B9.4: Thực hiện B12

B10: CurNode = CurNode->NextNode B11: Lặp lại B8

// Phân phối (giữ lại) đường chạy kế tiếp trong SLList B12: LastNode1->NextNode = CurNode

B13: IF (CurNode = NULL OR CurNode->NextNode = NULL) Thực hiện Bkt

B14: IF (CurNode->Key > CurNode->NextNode->Key) B14.1: LastNode1 = CurNode

B14.2: CurNode = CurNode->NextNode

w

Trang 3

B14.3: LastNode1->NextNode = NULL B14.4: Thực hiện B17

B15: CurNode = CurNode->NextNode B16: Lặp lại B13

// Phân phối (giữ lại) đường chạy kế tiếp trong SLList1 B17: LastNode2->NextNode = CurNode

B18: IF (CurNode = NULL OR CurNode->NextNode = NULL) Thực hiện Bkt

B19: IF (CurNode->Key > CurNode->NextNode->Key) B19.1: LastNode2 = CurNode

B19.2: CurNode = CurNode->NextNode B19.3: LastNode2->NextNode = NULL B19.4: Lặp lại B12

B20: CurNode = CurNode->NextNode B21: Lặp lại B18

Bkt: Kết thúc

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

Hàm SLL_Split có prototype:

SLL_Type SLL_Split(SLL_Type &SList, SLL_Type &SList1);

Hàm thực hiện việc phân phối bớt các đường chạy tự nhiên trong SList sang SList1 Hàm trả về con trỏ trỏ tới địa chỉ phần tử đầu tiên trong SList1

Nội dung của hàm như sau:

SLL_Type SLL_Split(SLL_Type &SList, SLL_Type &SList1) { SList1 = SList;

if (SList1 == NULL) return (NULL);

SLL_Type Last1;

SLL_Type Last2;

while (SList1->NextNode != NULL) { if (SList1->Key > SList1->NextNode->Key) break;

SList1 = SList1->NextNode;

}

if (SList1->NextNode != NULL) Last1 = SList1;

SList1 = SList1->NextNode;

Last1->NextNode = NULL;

SLL_Type CurNode = SList1;

if (CurNode == NULL) return (NULL);

while (CurNode->NextNode != NULL) { if (CurNode->Key > CurNode->NextNode->Key) break;

CurNode = CurNode->NextNode;

w

Trang 4

}

if (CurNode->NextNode == NULL) return (SList1);

Last2 = CurNode;

CurNode = CurNode->NextNode;

Last2->NextNode = NULL;

while (CurNode != NULL) { Last1->NextNode = CurNode;

if (CurNode->NextNode == NULL) break;

while (CurNode->NextNode != NULL) { if (CurNode->Key > CurNode->NextNode->Key) break;

Cur Node = CurNode->NextNode;

}

if (CurNode->NextNode == NULL) break;

Last1 = CurNode;

CurNode = CurNode->NextNode;

Last1->NextNode = NULL;

Last2->NextNode = CurNode;

if (CurNode->NextNode == NULL) break;

while (CurNode->NextNode != NULL) { if (CurNode->Key > CurNode->NextNode->Key) break;

Cur Node = CurNode->NextNode;

}

if (CurNode->NextNode == NULL) break;

Last2 = CurNode;

CurNode = CurNode->NextNode;

Last2->NextNode = NULL;

} return (SList1);

}

j Nhập nhiều danh sách thành một danh sách:

Tương tự, việc nhập nhiều danh sách thành một danh sách chúng ta thực hiện theo hai trường hợp khác nhau:

+ Ghép nối đuôi các danh sách lại với nhau;

+ Trộn xen lẫn các phần tử trong danh sách con vào thành một danh sách lớn theo một trật tự nhất định

Ngoài ra việc nhập có thể giữ lại các danh sách con ban đầu hoặc không giữ lại các danh sách con ban đầu Ở đây chúng ta trình bày theo cách không giữ lại các danh sách con ban đầu và trình bày theo hai trường hợp:

+ Ghép nối đuôi hai danh sách lại với nhau;

w

Trang 5

+ Trộn hai danh sách lại với nhau theo các đường chạy tự nhiên thành một danh sách có chiều dài lớn hơn

Giả sử chúng ta cần nhập hai danh sách SLList1, SLList2 lại với nhau

- Thuật toán ghép danh sách SLList2 vào sau SLList1:

B1: IF (SLList1 = NULL) B1.1: SLList1 = SLList2 B1.2: Thực hiện Bkt B2: IF (SLList2 = NULL) Thực hiện Bkt // Lấy địa chỉ nút cuối cùng trong SLList1 B3: LastNode = SLList1

B4: IF (LastNode->NextNode = NULL) Thực hiện B7

B5: LastNode = LastNode->NextNode B6: Lặp lại B4

// Ghép SLList2 vào sau LastNode B7: LastNode->NextNode = SLList2 Bkt: Kết thúc

- Thuật toán trộn danh sách SLList2 và SLList1 thành SLList theo các đường chạy tự nhiên:

B1: IF (SLList1 = NULL) B1.1: SLList = SLList2 B1.2: Thực hiện Bkt B2: IF (SLList2 = NULL) B2.1: SLList = SLList1 B2.2: Thực hiện Bkt // Lấy nút có dữ liệu nhỏ hơn trong 2 nút đầu của 2 danh sách đưa về SLList B3: IF (SLList1->Key ≤ SLList2->Key)

B3.1: TempNode = SLList1 B3.2: SLList1 = SLList1->NextNode B4: ELSE

B4.1: TempNode = SLList2 B4.2: SLList2 = SLList2->NextNode B5: TempNode->NextNode = NULL B6: IF (SLList1 = NULL)

B6.1: TempNode->NextNode = SLList2 B6.2: Thực hiện Bkt

B7: IF (SLList2 = NULL) B7.1: TempNode->NextNode = SLList1 B7.2: Thực hiện Bkt

B8: IF (SLList1->Key ≤ SLList2->Key) AND (TempNode->Key ≤ SLList1->Key) B8.1: MinNode = SLList1

B8.2: SLList1 = SLList1->NextNode

w

Ngày đăng: 24/07/2014, 12:21

TỪ KHÓA LIÊN QUAN

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