1 / 120

Môn: CẤU TRÚC DỮ LIỆU

Môn: CẤU TRÚC DỮ LIỆU. Chương 4: DANH SÁCH (LIST). NỘI DUNG CHƯƠNG 4. Khái niệm danh sách Các phép toán trên danh sách 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 Danh sách liên kết Định nghĩa Danh sách liên kết đơn

umed
Download Presentation

Môn: CẤU TRÚC DỮ LIỆU

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Môn: CẤU TRÚC DỮ LIỆU Chương 4: DANH SÁCH (LIST)

  2. NỘI DUNG CHƯƠNG 4 • Khái niệm danh sách • Các phép toán trên danh sách • 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 • 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 của danh sách liên kết • Danh sách hạn chế • Hàng đợi • Ngăn xếp • Ứng dụng của danh sách hạn chế BÀI TẬP

  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

  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” 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.

  5. 2. Các phép toán trên danh sách (tt) 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. 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 • Nhập các danh sách thành 1 danh sách • Tổng chiều dài danh sách bằng tổng chiều dài các danh sách ban đầu • Có thể ghép đuôi các danh sách hay trộn lẫn theo 1 phương pháp nhất định 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

  6. 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 danh sách • Cần biết chiều dài tối đa của một danh sách đặc thông qua 1 biến. • Cần biết chiều dài thực của một danh sách đặc thông qua 1 biến. VD: #define MaxLength 1000 int RealLength; T CD_List[MaxLength] Hay: T * CD_List = new T[MaxLength]

  7. 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 Khoitao(int &Len) { Len = 0; return; }

  8. 3. Danh sách đặc (tt) 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 TaoDanhSach(int M[], int &Len) { if (Len > MaxLen) Len = MaxLen; for (int I = 0; i< Len;I++) M[I] = Nhapphantu(); return (Len); } Int Nhapphantu() { …}

  9. 3. Danh sách đặc (tt) 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 B1: IF (Length = MaxLen) Thực hiện BKT B2: Pos = Length+1 B3: IF(Pos = InsPos) Thực hiện 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

  10. 3. Danh sách đặc (tt) 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 Themphantu(int M[], int &Len, int x, int InsPos) { if (Len == MaxLen) return (-1); for (int I = Len; I >InsPos; I++) M[I] = M[I-1]; M[InsPos] = x; Len++; return (Len); }

  11. 3. Danh sách đặc (tt) 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

  12. 3. Danh sách đặc (tt) 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í DelPos 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ử) Thuật toán: B1: IF(Length =0 OR DelPos > Len) Thực hiện BKT B2: Pos = DelPos B3: IF(Pos = Length) Thực hiện B7 B4: M[Pos] = M[Pos+1] B5: Pos++ B6: Lặp lại B3 B7: Length-- BKT: Kết thúc

  13. 3. Danh sách đặc (tt) 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 Xoaphantu(int M[], int &Len, int DelPos) { int (Len ==0 || DelPos >=Len) return (-1); for (int I =DelPos; i<Len; i++) M[i] = M[i+1]; Len --; return (Len); }

  14. 3. Danh sách đặc (tt) 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;

  15. 3. Danh sách đặc (tt) 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)

  16. 3. Danh sách đặc (tt) 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

  17. 3. Danh sách đặc (tt) 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) B1: IF(SLen1 >= Len) SLen1 = Len SLen2 = 0 B2:IF(SLen2 >= Len) SLen2 = Len SLen1 = 0 B3: IF(SLen1 + SLen2 <> Len) SLen2 = Len – SLen1 B4: IF (SLen1 < 0) SLen1 = 0 B5: IF (SLen2 < 0) SLen2 = 0 B6: I =1, SI = 1 B7: IF (I > SLen1) Thực hiện B11 B8: SM[SI] = M[I] B9: I++, SI++ B10: Lặp lại B7 B11: SI = 1 B12: IF(I > Len) Thực hiện BKT B13: SM2[SI] = M[I] B14: I++, SI++ B15: Lặp lại B12 BKT: Kết thúc

  18. 3. Danh sách đặc (tt) 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) { if (Slen1 >=Len) { SLen1 = Len; Slen2 = 0; } if (Slen2 >=Len) { SLen2 = Len; SLen1 = 0; } if (SLen1 < 0) SLen1 = 0; if (SLen2 < 0) SLen2 = 0; if (SLen1 + SLen2 != Len) SLen2 = Len - SLen1; for (int i=0; i<SLen1; i++) SM1[i] = M[i]; for (int j=0; j<SLen2; i++, j++) SM2[j] = M[i]; return; }

  19. 3. Danh sách đặc (tt) 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ật toá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

  20. 3. Danh sách đặc (tt) 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) Thuật toán: B1: IF (Slen1+SLen2 > MaxLen) // M không đủ khả năng chứa Thực hiện BKT B2: I = 1 // Chép từ SM1[] vào M[] B3: IF (I > SLen1) Thực hiện B7 B4: M[I] = SM[I] B5: I++ B6: Lặp lại B3 B7: SI = 1 // Chép từ SM2[] vào M[] B8: IF (SI > SLen2) Thực hiện BKT B9: M[I] = SM[SI] B10: I++; SI++ B11: Lặp lại B8 BKT: Kết thúc

  21. 3. Danh sách đặc (tt) 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 [], int &Len) { if (SLen1+SLen2 > MaxLen) return (-1); for (int I = 0; I < SLen1; I++) M[I] = SM1[I]; for (int J = 0; J < SLen2; I++, J++) M[I] = SM1[J]; Len = SLen1+ SLen2; return (Len); }

  22. 3. Danh sách đặc (tt) 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 Thuật toán B1: I = 1 B2: IF (I > Length) // Length là chiều dài của dãy B3: CM[I] = M[I] B4: I++ B5: Lặp lại B2 BKT: Kết thúc 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) }

  23. 3. Danh sách đặc (tt) 3.3. Các thao tác trên danh sách đặc (tt) 3.3.11. Hủy danh sách • Nếu danh sách được cấp phát động  dùng toán tử delete để hủy. • 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

  24. 3. Danh sách đặc (tt) 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).

  25. 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

  26. 4. Danh sách liên kết (tt) 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.

  27. 4.2. Danh sách liên kết đơn (SLL) 4.2.1. Cấu trúc dữ liệu • Nội dung mỗi phần tử (nút) trong danh sách liên kết gồm 2 vùng Vùng dữ liệu và Vùng liên kết struct Node { int info; Node *pNext; // liên kết đến vùng của phần tử kế tiếp };

  28. 4.2. Danh sách liên kết đơn (tt) 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 và cuối danh sách struct List { Node *pHead; Node *pTail; }; pHead info pNext pTail

  29. 4.2. Danh sách liên kết đơn (tt) 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

  30. 4.2. Danh sách liên kết đơn (tt) 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 Khoitao(Node *pHead) { pHead = NULL; return; }

  31. 4.2. Danh sách liên kết đơn (tt) 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 =x Thuật toán B1: p = new Node //cấp phát bộ nhớ cho con trỏ p B2: IF(p == NULL) // cấp phát không thành công Thực hiện BKT B3: p->info=x; B4: p->pNext=NULL BKT: Kết thúc

  32. 4.2. Danh sách liên kết đơn (tt) 4.2.2. b. Tạo mới 1 phần tử (nút) trong danh sách SLL (tt) Cài đặt Node* TaoPT(int x) { Node *p; p=new Node; if (p==NULL) { cout<<"Khong du bo nho"; exit(1); } cout<<"\nMoi nhap vao so x = "; cin>>x; p->Info=x; p->pNext=NULL; return p; }

  33. 4.2. Danh sách liên kết đơn (tt) 4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm đầu DS) Thuật toán Gỉa sử ta muốn thêm phần tử p vào đầu DS: Nếu DS rỗng thì: pHead=p; pTail=pHead; // pTail=new_element Ngược lại: p->pNext=pHead; pHead=p;

  34. 4.2. Danh sách liên kết đơn (tt) 4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm đầu DS) (tt) Cài đặt void Themdau(List &l, Node *p) { if (l.pHead==NULL) { l.pHead=p; l.pTail=p; } else { p->pNext=l.pHead; l.pHead=p; } }

  35. 4.2. Danh sách liên kết đơn (tt) x 4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm đầu DS) (tt) pHead 2 1 p pTail

  36. 4.2. Danh sách liên kết đơn (tt) 4.2.2.c. Thêm 1 phần tử vào danh sách SLL (tt) (Thêm giữa DS) • Thêm phần tử mới vào ngay sau phần tử q Thuật toán Nếu q!=NULL; B1: p->pNext=q->pNext; B2: q->pNext=p Ngược lại: thêm vào đầu DS

  37. 4.2. Danh sách liên kết đơn (tt) 4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm giữa DS) (tt) Cài đặt: void Themgiua(List &l, Node *q, int x) { Node *p=GetNode(x); if (p==NULL) exit(1); if (q!=NULL) { p->pNext=q->pNext; q->pNext=p; if (q==l.pTail) l.pTail=p; } else Themdau(l, p); }

  38. 4.2. Danh sách liên kết đơn (tt) 4.2.2.c. Thêm 1 phần tử vào danh sách SLL (Thêm cuối DS) Thuật toán: Nếu DS rỗng thì: B1: pHead=p; B2: pTail=pHead; Ngược lại: pTail->pNext=p; pTail=p;

  39. 4.2. Danh sách liên kết đơn (tt) 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 void InsertTail(List &l, Node *p) { if (l.pHead==NULL) { l.pHead=p; l.pTail=p; } else { l.pTail->pNext=p; l.pTail=p; } }

  40. 4.2. Danh sách liên kết đơn (tt) 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 duyệt DS. Thuật toán: B1: p = pHead B2: IF (p == NULL) Thực hiện BKT B3: OutputData(p->info) B4: p = p->pNext B5: Lặp lại B2 BKT: Kết thúc

  41. 4.2. Danh sách liên kết đơn (tt) 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 DuyetDS(List l) { Node *p; p = l.pHead; while (p!=NULL) { cout<<p->Info<<" "; p=p->pNext; } }

  42. 4.2. Danh sách liên kết đơn (tt) 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 phần tử có phần dữ liệu X. • Dùng thuật toán tìm tuyến tính. Thuật toán B1: p=pHead B2: IF(p== NULL OR p->info == X) Thực hiện BKT B3: p = p->pNext B4: Lặp lại B2 BKT: Kết thúc

  43. 4.2. Danh sách liên kết đơn (tt) 4.2.2.e. Tìm kiếm phần tử trong danh sách (tt) Cài đặt Node* Timkiem(List l, int x) { Node *p; p=l.pHead; while ((p!=NULL) && (p->Info!=x)) p=p->pNext; return p; }

  44. 4.2. Danh sách liên kết đơn (tt) 4.2.2.f. Xoá 1 phần tử trong danh sách Xoá đầu DS • Thuật toán: Nếu (PHead !=NULL) thì: B1: p=pHead; B2: pHead=pHead->pNext free(p); B3: Nếu pHead=NULL thì pTail= NULL

  45. 4.2. Danh sách liên kết đơn (tt) 4.2.2.f. Xoá1 phần tử trong danh sách Xoá đầu DS • Cài đặt: void Xoadau(List &l) // xoa phan tu { p=new Node; p=l.pHead; if (p!=NULL) { l.pHead=l.pHead->pNext; delete(p); } if (l.pHead==NULL) l.pTail=NULL; }

  46. 4.2. Danh sách liên kết đơn (tt) 4.2.2.f. Xoá1 phần tử trong danh sách Xoá phần tử ngay sau phần tử q: Thuật toán: nếu q!=NULL thì B1: p=q->pNext; //p là phần tử cần huỷ B2: nếu (p!=NULL) thì //q không phải cuối DS B21: q->pNext=p->pNext; B22: free(p); //xoá biến

  47. 4.2. Danh sách liên kết đơn (tt) 4.2.2.f. Xoá1 phần tử trong danh sách Xoá phần tử ngay sau phần tử q: void XoaPT(List &l, Node *q) { if (q!=NULL) { p=q->pNext;// p la phan tu can xoa if (p!=NULL) if(p==l.pTail) { l.pTail=q; free(p); } else { q->pNext=p->pNext; free(p); } } }

  48. 4.2. Danh sách liên kết đơn (tt) 4.2.2.f. Xoá1 phần tử trong danh sách Xoá phần tử có khoá k: Thuật toán: B1: Tìm phần tử p có khoá k và phần tử q đứng trước nó B2: Nếu (p!=NULL) thì //tìm thấy k Xoá p ra khỏi DS Ngược lại: Báo không có k;

  49. 4.2. Danh sách liên kết đơn (tt) 4.2.2.f. Xoá1 phần tử trong danh sách Xoá phần tử có khoá k: Cài đặt: int XoaptK(List &l,int k) // xoa phan tu { Node *p=l.pHead; Node *q=NULL; while (p!=NULL) { if(p->info==k) break; q=p; p=p->pNext; } If(p==NULL) Return (0); //không tìm thấy if(q!=NULL) { if(p==l.pTail) l.pTail=q; q->pNext=p->pNext; delete p; }

  50. 4.2. Danh sách liên kết đơn (tt) 4.2.2.f. Xoá1 phần tử trong danh sách Xoá phần tử có khoá k: Cài đặt: (tt) else { l.pHead=p->pNext; if(l.pHead==NULL) l.pTail=NULL; } Return (1); }

More Related