31 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM Data RemoveHead(LIST &l) { NODE *p; Data x = NULLDATA; if ( l.pHead != NULL) { p = l.pHead; x = p->Info; l.pHead = l.pHead->pNext; delete p; if(l.pHead == NULL) l.pTail = NULL; } return x; } This is trial version www.adultpdf.com 32 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM Hủy một phần tử ñứng sau phần tử q Thut toán : Bắt ñầu: Nếu (q!= NULL) thì B1: p = q->Next; // p là phần tử cần hủy B2: Nếu (p != NULL) thì // q không phải là cuối xâu B21 : q->Next = p->Next; // tách p ra khỏi xâu B22 : free(p); // Hủy biến ñộng do p trỏ ñến This is trial version www.adultpdf.com 33 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM void RemoveAfter (LIST &l, NODE *q) { NODE *p; if ( q != NULL) { p = q ->pNext ; if ( p != NULL) { if(p == l.pTail) l.pTail = q; q->pNext = p->pNext; delete p; } } else RemoveHead(l); } This is trial version www.adultpdf.com 34 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM Hủy một phần tử có khóa k Thut toán : Bước 1: Tìm phần tử p có khóa k và phần tử q ñứng trước nó Bước 2: Nếu (p!= NULL) thì // tìm thấy k Hủy p ra khỏi xâu tương tự hủy phần tử sau q; Ngược lại Báo không có k; This is trial version www.adultpdf.com 35 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM int RemoveNode(LIST &l, Data k) { 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 k if(q != NULL) { if(p == l.pTail) l.pTail = q; q->pNext = p->pNext; delete p; }else{ l.pHead = p->pNext; if(l.pHead == NULL) l.pTail = NULL; } return 1; } This is trial version www.adultpdf.com 36 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM Duyệt danh sách Duyệt danh sách là thao tác thường ñược thực hiện khi có nhu cầu xử lý các phần tử của danh sách như: - Ðếm các phần tử của danh sách, - Tìm tất cả các phần tử thoả ñiều kiện, - Huỷ toàn bộ danh sách (và giải phóng bộ nhớ) Thut toán : Bước 1: p = Head; //Cho p trỏ ñến phần tử ñầu DS Bước 2: Trong khi (Danh sách chưa hết) thực hiện B21 : Xử lý phần tử p; B22 : p:=p->pNext; // Cho p trỏ tới phần tử kế This is trial version www.adultpdf.com 37 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM void ProcessList (LIST &l) { NODE *p; p = l.pHead; while (p!= NULL) { ProcessNode(p); // xử lý cụ thể tùy ứng dụng p = p->pNext; } } This is trial version www.adultpdf.com 38 3.4. Sắp Xếp Danh Sách © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM 3.4.1. Các cách tiếp cận 3.4.2. Một số phương pháp sắp xếp trên danh sách This is trial version www.adultpdf.com 39 3.4.1. Các cách tiếp cận © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM DS có thứ tự là DS mà các phần tử ñược sắp xếp theo một thứ tự nào ñó dựa trên trường khoá. Ðể sắp xếp một danh sách, có 2 phương án: Phương án 1: Hoán vị nội dung các phần tử trong danh sách Sử dụng các thuật toán sắp xếp như trên mảng, dựa trên việc hoán vị nội dung của các phần tử Phương pháp này ñòi hỏi sử dụng vùng nhớ trung gian, số lần hoán vị có thể lên ñến bậc n 2 . Làm cho thao tác sắp xếp chậm không tận dụng ñược các ưu ñiểm của DSLK . This is trial version www.adultpdf.com 40 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM voidListSelectionSort (LIST &l) { NODE *min; // chỉ ñến phần tử có giá trị nhỏ nhất NODE *p,*q; p = l.pHead; while(p != l.pTail) { q = p->pNext; min = p; while(q != NULL) { if(q->Info< min->Info ) min = q; // ghi nhận vị trí phần tử min hiện hành q q= q->pNext; } // Hoán vị nội dung 2 phần tử Hoanvi(min->Info, p->Info]); p = p->pNext; } } Ví dụ : Cài ñặt thuật toán sắp xếp Chọn trực tiếp This is trial version www.adultpdf.com . Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM DS có thứ tự là DS mà các phần tử ñược sắp xếp theo một thứ tự nào ñó dựa trên trường khoá. Ðể sắp xếp một danh sách, có 2. return x; } This is trial version www.adultpdf.com 32 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM Hủy một phần tử ñứng sau phần tử q Thut toán : Bắt ñầu: Nếu (q!= NULL). trỏ ñến This is trial version www.adultpdf.com 33 © Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM void RemoveAfter (LIST &l, NODE *q) { NODE *p; if ( q != NULL) { p