Chương 3: Danh sách
 Danh sách và các phép toán trên danh sách  Danh sách đặc  Danh sách liên kết
Bạn đang xem trước 20 trang tài liệu Chương 3: Danh sách, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
Chương 3: 
Danh sách 
Giảng viên: Ths. Nguyễn Thị Khiêm Hòa 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
2 
Nội dung 
 Danh sách và các phép toán trên danh sách 
 Danh sách đặc 
 Danh sách liên kết 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
3 
Mục tiêu 
 Hiểu rõ về CTDL danh sách 
 Phương pháp xây dựng lớp đối tượng danh sách đặc, 
danh sách liên kết và các kiểu dữ liệu đặc biệt trên C# 
 Đánh giá ưu khuyết điểm của giải thuật trên từng loại 
danh sách để chọn kiểu dữ liệu phù hợp 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
4 
Danh sách 
 Định nghĩa 
Danh sách là dãy hữu hạn có thứ tự của các phần tử 
thuộc một lớp đối tượng. 
 Ký hiệu: L(a1, a2, …, an) 
 Danh sách tuyến tính là danh sách mà quan hệ lân cận 
giữa các phần tử được hiển thị 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
5 
Danh sách 
 Tổ chức lưu trữ danh sách trong bộ nhớ 
 Mảng - Danh sách đặc 
 Danh sách liên kết – Danh sách động 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
6 
Mảng 
 Tập hợp các phần tử cùng kiểu dữ liệu, nằm liên tiếp 
trong bộ nhớ 
 Có chỉ số bắt đầu từ 0 
 Giá trị mặc định của từng phần tử trong mảng quy định 
theo từng kiểu đối tượng 
 Mảng là đối tượng 
 Kích thước: có thể là 1 hoặc nhiều chiều 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
7 
Mảng một chiều 
 Khai báo 
 Khởi tạo 
 Truy xuất: Chỉ mục đối tượng 
 Các thuật toán: 
 Kỹ thuật 
• Tìm kiếm 
• Tính toán 
• Sắp xếp 
• Đếm 
• Lính canh 
• Cờ hiệu 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
8 
Bài tập 
 Xây dựng lớp mảng số nguyên, thực hiện 
việc tính tổng, tổng chẳn, tổng lẻ … trong 
mảng 
 Xây dựng lớp Zoo chứa các động vật có 
trong lớp Animal. 
Thực hiện 
45 min 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
9 
Mảng đa chiều 
 Là mảng một chiều mà mỗi phần tử là một mảng khác 
 Trên C# hỗ trợ hai kiểu mảng đa chiều: 
 Mảng đa chiều cùng kích thước (Rectangle) 
 Mảng đa chiều không cùng kích thước (Jagged Array) 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
10 
Mảng đa chiều cùng kích thước 
 Khai báo 
 [ , ] ; 
 Ví dụ: int [ ] array; 
 Khởi tạo 
 = new [,]; 
 Ví dụ: int [ , ] array = new int [ 3, 5 ]; 
 Duyệt mảng: 
for (int i = 0; i < rows; i++) 
for (int j = 0; j < columns; j++) 
Xử_lý A{i,j]; 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
11 
Mảng đa chiều khác kích thước 
 Khai báo 
 [ ][ ] ; 
 Ví dụ: int [ ][ ] array; 
 Khởi tạo 
 = new [] [ ]; 
 Ví dụ: int [ ][ ] array = new int [ 3 ] [ ]; 
 Khởi tạo từng dòng 
 [] = new []; 
 Ví dụ: array[0] = new int [ 3 ]; 
 Truy xuất: 
Tên_biến_mảng [rows][columns] 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
12 
Giao diện tập hợp 
 .NET cung cấp giao diện chuẩn cho việc liệt kê, so 
sánh, và tạo tập hợp. 
Giao diện Mục đích 
IEnumerable Liệt kê thông qua một tập hợp 
bằng cách sử dụng foreach. 
IComparer So sánh giữa hai đối tượng lưu 
giữ trong tập hợp để sắp xếp 
các đối tượng trong tập hợp 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
13 
IComparer 
 Cung cấp các phương thức thực hiện việc so sánh và 
sắp xếp tập hợp. 
Sort() 
IComparer 
IComparable 
(CompareTo) 
Object 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
14 
IComparer 
 Định nghĩa cách thức so sánh cho đối tượng 
class : Icomparable 
{ 
… 
public int CompareTo(Object o) 
{ 
Tên_class r = (Tên_class) o; 
return this.Tên_Field.CompareTo(r.Tên_Field); 
} 
} 
 Phương thức CompareTo có tham số đối tượng, so sánh với 
chính nó. Trả về {-1, 0, 1} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
15 
IComparerable 
public class Employee: IComparable 
{ 
 private int empID; 
 public Employee(int empID) 
 { this.empID = empID;} 
 public int EmpID 
 { 
 get { return empID;} 
 set { empID = value;} 
 } 
 public override string ToString() 
 { return empID.ToString();} 
 public int CompareTo(object o) 
 { 
 Employee r = (Employee) o; 
 return this.empID.CompareTo(r.empID); 
 } 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
16 
IComparerable 
public class Tester 
{ 
 static void Main() 
 { 
 ArrayList empArray = new ArrayList(); 
 Random r = new Random(); 
 // đưa vào mảng 
 for( int i = 0; i < 5; i++) 
 { 
 empArray.Add( new Employee(r.Next(10)+100)); 
 } 
 // in tất cả nội dung 
 PrintValue(empArray); 
 // sắp xếp lại mảng Employee 
 empArray.Sort(); 
 // hiển thị tất cả nội dung của mảng Employee 
 PrintValue(empArray); 
 } 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
17 
IComparer 
 Định nghĩa nhiều cách thức so sánh cho đối tượng 
class : Icomparer 
{ 
private ..ComparisionType CmpType; 
public enum ComparisionType 
{ 
field1, 
field2, 
… 
}; 
public ..ComparisionType CType 
{ 
get {return CmpType;} 
set {CmpType = value;} 
} 
//Xem tiếp trang sau 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
18 
IComparer 
public int Compare( lhs, rhs) 
{ 
return lhs.CompareTo(rhs.CmpType); 
} 
}//end class con 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
19 
IComparer 
//Định nghĩa class chính 
class : Icomparable 
{ … 
public static GetComparer() 
{ 
return new .; 
} 
public int CompareTo( rhs) 
{ 
Tên_class r = (Tên_class) rhs; 
return this.Tên_Field.CompareTo(rhs.Tên_Field); 
}//Phương thức so sánh mặc định 
//Xem tiếp trang sau 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
20 
IComparer 
//Định nghĩa class chính 
public int CompareTo( rhs, 
..ComparisionType w) 
{ 
switch(w) 
{ 
case ..ComparisionType.field1: 
return this.field1.CompareTo(rhs.field1); 
case … 
} 
return 0; 
} 
//Định nghĩa class con tại đây 
… 
}//end class chính 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
21 
Danh sách liên kết 
 Đặt vấn đề: 
 Thêm phần tử vào mảng, chi phí O(n) 
 Xóa một phần tử trong mảng, chi phí O(n) 
 Khó cấp phát 
Tách các phần tử riêng rẽ, tìm 
cách liên kết chúng 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
22 
Danh sách liên kết 
Data  
Thành 
phần dữ 
liệu 
Địa chỉ liên kết 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
23 
Danh sách liên kết 
 Một dãy tuần tự các nút (Node) liên kết với nhau bằng địa chỉ 
 Các nút không cần phải lưu trữ liên tiếp nhau trong bộ nhớ 
 Có thể mở rộng tuỳ ý (chỉ giới hạn bởi dung lượng bộ nhớ) 
 Thao tác Chèn/Xóa không cần phải dịch chuyển phần tử 
 Có thể truy xuất đến các phần tử khác thông qua địa chỉ 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
24 
Danh sách liên kết 
 Thêm một phần tử 
 Xóa một phần tử 
 Liệt kê 
 Tính toán 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
25 
Danh sách liên kết 
public class Node: IComparable > 
 where T: IComparable 
{ 
 private T data; 
 private Node next; 
 public Node(T data) 
 { 
 this.data = data; 
 this.next = null; 
 } 
 //Đóng gói DL 
 //các phương thức 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
26 
Danh sách liên kết 
//Đóng gói dữ liệu: Properties 
public T Data 
{ 
 get{ return this.data;} 
 set{ this.data = value;} 
} 
public Node Next 
{ 
 get { return this.next; } 
set { this.next = value;} 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
27 
Danh sách liên kết 
//các phương thức dùng để so sánh sắp xếp 
public int CompareTo(Node rhs) 
{ 
 return data.CompareTo(rhs.data); 
} 
public bool Equals(Node rhs) 
{ 
 return this.data.Equals(rhs.data); 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
28 
Danh sách liên kết 
public class LinkList 
 where T: IComparable 
{ 
 private Node head; 
 public LinkList() 
 { 
 this.head = null; 
 } 
 //các phương thức 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
29 
Danh sách liên kết 
public void InsertFirst(T data) 
{ 
 if(head == null) 
 head = new Node(data); 
 else 
 { 
 Node node = new Node(data); 
 node.next = head; 
 head = node; 
 } 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
30 
Danh sách liên kết 
//In danh sách 
public void PrintList() 
{ 
 while(head != null) 
 { 
 Console.Write("{0} ", this.head.Data); 
 head = head.Next; 
 } 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
31 
Danh sách liên kết 
class Program 
{ static void Main(string[] args) 
 { 
 Random r = new Random(); 
 LinkList intList = new LinkList(); 
 for (int i = 0; i < 10; i++) 
 { 
 int nextInt = r.Next(10); 
 Console.Write("{0} ", nextInt); 
 intList.InsertFirst(nextInt); 
 } 
 Console.WriteLine("\nDanh sach cac so:"); 
 intList.PrintList(); 
 Console.Read(); 
 } 
} 
Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM 
32 
Q&A 
            
         
        
    




 
                    