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.
Chương 4: DANH SÁCH (LIST) 77 78 NỘI DUNG CHƯƠNG Khái niệm danh sách Các phép toán danh sách Danh sách đặc • • • • Định nghĩa Biểu diễn danh sách đặc Các thao tác danh sách đặc Ưu nhược điểm ứng dụng Danh sách liên kết • • • • Định nghĩa Danh sách liên kết đơn Danh sách liên kết kép Ưu nhược điểm danh sách liên kết Danh sách hạn chế • • • Hàng đợi Ngăn xếp Ứng dụng danh sách hạn chế 79 Khái niệm danh sách Danh sách a1, a2, ….aN tập hợp phần tử có kiểu liệu xác định chúng có mối quan hệ Nếu biết phần tử vị trí phần tử ai+1 • Số phần tử danh sách chiều dài danh sách Danh sách rỗng danh sách có chiều dài = • Cho T kiểu định nghĩa trước, kiểu danh sách TX gồm phần tử thuộc kiểu T định nghĩa là: TX = < VX , OX > Trong : • • • VX = { tập hợp thứ tự gồm số biến động phần tử kiểu T } OX = { tạo danh sách; tìm phần tử danh sách; chèn phần tử vào danh sách; huỷ phần tử khỏi danh sách; liệt kê danh sách, xếp danh sách.} 80 Các phép toán danh sách Tùy theo loại danh sách có phép tốn khác nhau, phép tốn thơng thường sau: 2.1 Tạo danh sách • Đưa vào danh sách nội dung phần tử Chiều dài danh sách xác định • 2.2 Thêm phần tử vào danh sách • Khi thêm 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 vị trí xác định • danh sách 2.3 Tìm kiếm phần tử danh sách • Tìm phần tử danh sách thỏa mãn điều kiện Dùng thuật tốn tìm kiếm chương “Tìm kiếm” • 81 Các phép toán danh sách 2.4 Loại bớt phần tử danh sách • Chiều dài danh sách giảm xuống phần tử • Cơng việc loại bớt bao gồm thao tác tìm kiếm phần tử cần hủy danh sách 2.5 Sửa đổi giá trị phần tử danh sách Thay đổi thông tin phần tử danh sách • • Công việc cập nhật phần tử bao gồm thao tác tìm kiếm phần tử cần hủy danh sách 2.6 Sắp xếp danh sách Dùng thuật toán chương xếp • 82 Các phép tốn danh sách 2.7 Tách danh sách thành nhiều danh sách Tách danh sách thành DS theo quy luật chia • Tổng chiều dài danh sách chia chiều dài • danh sách ban đầu 2.8 Nhập nhiều danh sách thành danh sách • Nhập danh sách thành danh sách Tổng chiều dài danh sách tổng chiều dài danh • sách ban đầu • Có thể ghép đuôi danh sách hay trộn lẫn theo phương pháp định 2.9 Sao chép danh sách: Sao chép toàn nội dung danh sách thành danh sách khác 2.10 Hủy danh sách: Huỷ nội dung hay vùng nhớ chứa DS 83 Danh sách đặc (Condensed List) 3.1 Định nghĩa • Danh sách đặc danh sách mà không gian nhớ lưu trữ phần tử nằm kề cận nhớ 3.2 Biểu diễn danh sách đặc • Biểu diễn danh sách đặc dùng 1mảng phần tử có kiểu dử liệu kiểu liệu phần tử danh sách • Cần biết chiều dài tối đa danh sách đặc thơng qua biến • Cần biết chiều dài thực danh sách đặc thông qua biến VD:#define MaxLength 1000 int RealLength; T CD_List[MaxLength] Hay: T * CD_List = new T[MaxLength] 84 Danh sách đặc (tt) 3.3 Các thao tác danh sách đặc Một số thao tác danh sách đặ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ở void CD_Initialize(int &Len) { Len = 0; return; } 85 Danh sách đặc 3.3 Các thao tác danh sách đặc (tt) 3.3.2 Tạo danh sách & nhập danh sách Tạo danh sách có chiều dài tối đa MaxLen, hàm trả giá trị thực danh sách tạo int CD_Create_List(T M[], int &Len) { if (Len > MaxLen) Len = MaxLen; for (int I = 0; i< Len;I++) M[I] = InputOneElement(); return (Len); } T InputOneElement() { …} 86 Danh sách đặc 3.3 Các thao tác danh sách đặc (tt) 3.3.3 Thêm phần tử vào danh sách Thêm phần tử có giá trị NewValue vào danh sách có chiều dài Length vị trí InsPos B1: IF (Length = MaxLen) Thực BKT B2: Pos = Length+1 B3: IF(Pos = InsPos) Thực B7 B4: M[Pos] = M[Pos -1] B5: Pos-B6: Lặp lại B3 B7:M[InsPos] = NewValue B8: Length++ BKT: Kết thúc 174 5.2 Ngăn xếp 5.2.1 Cấu trúc liệu Biểu diễn tổ chức danh sách đặc typedef struct SC { int Size; int SP; T * List; } CSTACK; CSTACK CSList; Biểu diễn tổ chức danh sách liên kết typedef struct SElement { T Key; SElement *Next; } SOneElement; typedef struct SOneElement *SSTACK; SSTACK SSP; 175 5.2 Ngăn xếp 5.2.2 Các thao tác ngăn xếp tổ chức danh sách đặc 5.2.2.a Khởi tạo ngăn xếp (Initialize) 5.2.2.b Thêm phần tử vào ngăn xếp (Push) 5.2.2.c Lấy nội dung phần tử ngăn xếp xử lý (Pop) 5.2.2.d Hủy ngăn xếp 176 5.2 Ngăn xếp 5.2.2.a Khởi tạo ngăn xếp (dùng danh sách đặc) B1: CSList.Size = MaxSize B2: CSList.List = new T[MaxSize] B3: IF (CSList.List == NULL) Thực BKT B4: CSList.SP = CSList.Size +1 BKT: Kết thúc T * CSInitialize(CSTACK &SList, int MaxSize) { SList.Size = MaxSize; SList.List = new T[MaxSize]; if (SList.List == NULL) return (NULL); SList.SP = SList.Size ; return (SList.List); } 177 5.2 Ngăn xếp 5.2.2.b Thêm phần tử vào ngăn xếp (dùng danh sách đặc) B1: IF (CSList.SP == 1) Thực BKT B2: CSList.SP -B3: CSList.List[CSList.SP] = NewData BKT: Kết thúc int CSPush(CSTACK &SList, T NewData) { if (SList.SP == 0) return (-1); SList.SP -= 1; SList.List[SList.SP] = NewData; return (SList.SP); } 178 5.2 Ngăn xếp 5.2.2.c Lấy nội dung phần tử ngăn xếp xử lý (dùng danh sách đặc) B1: IF (CSList.SP == CSList.Size +!) Thực BKT B2: Data = CSList.List[CSList.SP] B3: CSList.SP++ BKT: Kết thúc int CSPop(CSTACK &SList, T &Data) { if (SList.SP == SList.Size) return (-1); Data = SList.List[SList.SP]; SList.SP += 1; return (1); } 179 5.2 Ngăn xếp 5.2.2.d Hủy ngăn xếp (dùng danh sách đặc) int CSDelete(CSTACK &SList) { delete SList.SList; return; } 180 5.2 Ngăn xếp 5.2.2 Các thao tác ngăn xếp tổ chức danh sách liên kết 5.2.3.a Khởi tạo ngăn xếp (Initialize) 5.2.3.b Thêm phần tử vào ngăn xếp (Push) 5.2.3.c Lấy nội dung phần tử ngăn xếp xử lý (Pop) 5.2.3.d Hủy ngăn xếp 181 5.2 Ngăn xếp 5.2.3.a Khởi tạo ngăn xếp (dùng danh sách liên kết) SSTACK SSInitialize (SSTACK &SList) { SList = NULL; return (SList); } 182 5.2 Ngăn xếp 5.2.3.b Thêm phần tử vào ngăn xếp (dùng danh sách liên kết) B1: NewElement = SLLCreateNode(NewData) B2: if (NewElement == NULL) Thực BKT B3: if (SSP == NULL) B3.1: SSP = NewElement B3.2: Thực BKT B4: NewElement ->Next = SSP B5: SSP = NewElement BKT: Kết thúc 183 5.2 Ngăn xếp 5.2.3.b Thêm phần tử vào ngăn xếp (dùng danh sách liên kết) SSTACK SSPush (SSTACK &SList, T NewData) { SSTACK NewElement = SLLCreateNode(NewData); if (NewElement == NULL) return (NULL); NewElement ->Next = SList; SList = NewElement; return (NewElement); } 184 5.2 Ngăn xếp 5.2.3.c Lấy nội dung phần tử ngăn xếp xử lý (dùng danh sách liên kết) B1: if (SSP == NULL) Thực BKT B2: TempElement = SSP B3: SSP = SSP ->Next B4: TempElement ->Next = NULL B5: Data = TempElement->Key B6: delete TempElementBKT: Kết thúc 185 5.2 Ngăn xếp 5.2.3.c Lấy nội dung phần tử ngăn xếp xử lý (dùng danh sách liên kết) int SSPop (SSTACK &SList, T &Data) { if (SList == NULL) return (-1); SSTACK TempElement = SList; SList = SList ->Next; TempElement ->Next = NULL; Data = TempElement->Key; delete TempElement; return (1); } 186 5.2 Ngăn xếp 5.2.3.d Hủy ngăn xếp (dùng danh sách liên kết) void SSDelete (SSTACK &SList) { while (SList != NULL) { SSTACK TempElement = SList; SList = SList ->Next; TempElement ->Next = NULL; delete TempElement; } } 187 5.2 Ngăn xếp 5.3 Ứng dụng danh sách hạn chế Hàng đợi dùng nhiều trường hợp lưu trữ liệu • cần xử lý • Ngăn xếp dùng việc xử lý liệu truy hồi, đặc biệt việc xử lý đệ quy thuật giải 188 BÀI TẬP CHƯƠNG • Bài tập chương 4, giáo trình Cấu trúc liệu giải thuật (Trang 156 -157) ... tử danh sách g Hủy danh sách h Tạo danh sách/ Nhập danh sách i Tách danh sách thành nhiều danh sách j Nhập nhiều danh sách thành danh sách k Sắp xếp thứ tự phần tử danh sách h Sao chép danh sách. .. danh sách chia chiều dài • danh sách ban đầu 2.8 Nhập nhiều danh sách thành danh sách • Nhập danh sách thành danh sách Tổng chiều dài danh sách tổng chiều dài danh • sách ban đầu • Có thể ghép danh. .. hủy danh sách 2.6 Sắp xếp danh sách Dùng thuật tốn chương xếp • 82 Các phép toán danh sách 2.7 Tách danh sách thành nhiều danh sách Tách danh sách thành DS theo quy luật chia • Tổng chiều dài danh