Trong lĩnh vực Công Nghệ Thông Tin nói riêng, yêu cầu quan trọng nhất của người học đó chính là thực hành. Có thực hành thì người học mới có thể tự mình lĩnh hội và hiểu biết sâu sắc với lý thuyết. Với ngành mạng máy tính, nhu cầu thực hành được đặt lên hàng đầu. Tuy nhiên, trong điều kiện còn thiếu thốn về trang bị như hiện nay, người học đặc biệt là sinh viên ít có điều kiện thực hành. Đặc biệt là với các thiết bị đắt tiền như Router, Switch chuyên dụng
Danh sách liên kết (List) a Danh sách kề : Các phần tử danh sách gọi node, lưu trữ kề liền nhớ Mỗi node giá trị kiểu int, float, char, … struct với nhiều vùng tin Mảng hay chuỗi dạng danh sách kề Địa node danh sách xác định số (index) Chỉ số danh sách số nguyên đánh từ đến giá trị tối đa Danh sách kề cấu trúc liệu tĩnh, số node tối đa danh sách kề cố định sau cấp phát nên số node cần dùng có thừa hay thiếu Ngồi danh sách kề khơng phù hợp với thao tác thường xuyên thêm hay xóa phần tử danh sách, Danh sách liên kết (List) b Danh sách liên kết : Các phần tử danh sách gọi node, nằm rải rác nhớ Mỗi node, vùng liệu thơng thường, cịn có vùng liên kết chứa địc node hay node trước Danh sách liên kết cấu trúc liệu động, thêm hay hủy node danh sách chay chương trình Với cách cài đặt thao tác thêm hay hủy node ta cần thay đổi lại vùng liên kết cho phù hợp Tuy nhiên, việc lưu trữ danh sách liên kết tốn nhớ anh sách kề node danh sách phải chứa thêm vùng liên kết Ngoài việc truy xuất node thứ I danh sách liên kết chậm phải duyệt từ đầu danh sách Danh sách liên kết (List) Có nhiều kiểu tổ chức liên kết phần tử danh sách : Danh sách liên kết đơn Danh sách liên kết kép Danh sách liên kết vòng … Danh sách liên kết (List) Danh sách liên kết đơn: phần tử liên kết với phần tử đứng sau danh sách: A B X Z Y Danh sách liên kết kép: phần tử liên kết với phần tử đứng trước sau danh sách: A B C D Danh sách liên kết (List) Danh sách liên kết vòng : phần tử cuối danh sách liên kết với phần tử đầu danh sách: A B A X B Z C Y D Sắp xếp danh sách liên kết đơn Sắp xếp danh sách Cách tiếp cận: Phương án 1: Hoán vị nội dung phần tử danh sách (thao tác vùng data) Phương án : Thay đổi mối liên kết (thao tác vùng link) Sắp xếp danh sách Hoán vị nội dung phần tử danh sách Cài đặt lại danh sách liên kết thuật toán xếp biết mảng Điểm khác biệt cách thức truy xuất đến phần tử danh sách liên kết thơng qua liên kết thay số mảng Do thực hoán vị nội dung phần tử nên đòi hỏi sử dụng thêm vùng nhớ trung gian thích hợp với xâu có phần tử có thành phần data kích thước nhỏ Khi kích thước trường data lớn, việc hoán vị giá trị hai phân tử chiếm chi phí đáng kể Sắp xếp phương pháp đổi chổ trực tiếp ( Interchange Sort ) void SLL_InterChangeSort ( List &l ) { for ( Node* p=l.first ; p!=l.last ; p=p->link ) for ( Node* q=p->link ; q!=NULL ; q=q->link ) if ( p->data > q->data ) Swap( p->data , q->data ); } Sắp xếp đổi chổ trực tiếp ( Interchange Sort ) l.last q l.first 12 p 10 Biểu diễn Queue dùng mảng Tạo hàng đợi rỗng void Init(queue &q) { q.front = q.rear = 0; } Kiểm tra queue rỗng int Empty(queue q) { if(q.front == q.rear == 0) return 1; return 0; } 74 Biểu diễn Queue dùng mảng Kiểm tra hàng đợi đầy hay không int Full(queue q) { if( q.front== && q.rear== N-1) return 1; if( q.front == q.rear+1) return 1; return 0; } 75 Biểu diễn Queue dùng mảng Thêm phần tử x vào cuối hàng đợi Q void EnQueue(queue &q, node x) { if(!Full(q)) //Queue chưa đầy { if( q.rear==N-1) q.rear=0; else q.rear++; q.list[q.rear]=x; } } 76 Biểu diễn Queue dùng mảng Trích, huỷ phần tử đầu hàng đợi Q node DeQueue(queue &q) { if(!Empty(q)) { node t=q.list[q.front]; if(q.fornt == N -1) q.front = 0; else q.front++; return t; } } 77 Biểu diễn hàng đợi dùng danh sách liên kết Có thể tạo hàng đợi sử dụng DSLK đơn Phần tử đầu DSKL (head) phần tử đầu hàng đợi, phần tử cuối DSKL (tail) phần tử cuối hàng đợi Cuối hàng Đầu hàng a0 a1 a2 aN-2 an-1 78 Biểu diễn hàng đợi dùng danh sách liên kết typedef struct node { int data; node *link; }; typedef struct queue { node *front, *rear; }; 79 Tạo hàng đợi rỗng: void Init(queue &q) { q.front=q.rear= NULL; } Kiểm tra hàng đợi rỗng : int Empty(queue &q) { if (q.front == NULL) return 1; // hàng đợi rỗng else return 0; } 80 Thêm phần tử p vào cuối hàng đợi void EnQueue(queue &q, node *new_ele) { if(q.front == NULL) { q.front=new_ele; q.rear=new_ele; } else { q.rear->link=new_ele; q.rear=new_ele; } } 81 Biểu diễn hàng đợi dùng danh sách liên kết Trích phần tử đầu hàng đợi node* DeQueue(queue &q) { if (!Empty(q)) { node *p=q.front; q.front=p->link; return p } } 82 Biểu diễn hàng đợi dùng danh sách liên kết Nhận xét: thao tác hàng đợi biểu diễn danh sách liên kết làm việc với chi phí O(1) Nếu khơng quản lý phần tử cuối xâu, thao tác Dequeue có độ phức tạp O(n) Các 83 Ứng dụng hàng đợi Hàng đợi sử dụng số toán: Bài toán ‘sản xuất tiêu thụ’ (ứng dụng hệ điều hành song song) Bộ đệm (ví dụ: Nhấn phím Bộ đệm CPU xử lý) Xử lý lệnh máy tính (ứng dụng HĐH, trình biên dịch), hàng đợi tiến trình chờ xử lý, … 84 Ứng dụng STACK để khử đệ quy cho tốn tháp Hà Nội Bài toán Tháp Hà nội Luật: Di chuyển lần đĩa Không đặt đĩa lớn lên đĩa nhỏ 86 Bài toán Tháp Hà nội – Thiết kế hàm Hàm đệ qui: Chuyển (count-1) đĩa đỉnh cột start sang cột temp Chuyển đĩa (cuối cùng) cột start sang cột finish Chuyển count-1 đĩa từ cột temp sang cột finish magic 87 Bài toán Tháp Hà nội – Mã C++ void move(int n, char start, char finish, char temp) { if (n > 0) { move(n − 1, start, temp, finish); cout