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... 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
Trang 1Chương 3:
Danh sách
Gi ả ng viên: Ths Nguyễn Thị Khiêm Hòa
Trang 2Nộ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
Trang 3Mụ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
Trang 4Danh 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ị
Trang 6Mả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
Trang 8Bà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
Trang 9Mả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)
Trang 10Mảng đa chiều cùng kích thước
Khai báo
<kiểu dữ liệu> [ , ] <tên biến mảng>;
Ví dụ: int [ ] array;
Khởi tạo
<tên biến mảng> = new <kiểu DL> [<số dòng>,<số cột>];
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];
Trang 11Mảng đa chiều khác kích thước
Khai báo
<kiểu dữ liệu> [ ][ ] <tên biến mảng>;
Ví dụ: int [ ][ ] array;
Khởi tạo
<tên biến mảng> = new <kiểu DL> [<số dòng>] [ ];
Ví dụ: int [ ][ ] array = new int [ 3 ] [ ];
Khởi tạo từng dòng
<tên biến mảng> [<vị trí dòng>] = new <kiểu DL> [<số cột>];
Ví dụ: array[0] = new int [ 3 ];
Truy xuất:
Tên_biến_mảng [rows][columns]
Trang 12Giao 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
Trang 14IComparer
Định nghĩa cách thức so sánh cho đối tượng
class <Tên_class>: Icomparable
}
Phương thức CompareTo có tham số đối tượng, so sánh với chính nó Trả về {-1, 0, 1}
Trang 15IComparerable
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);
} }
Trang 16ArrayList 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);
}
Trang 17Khoa Công nghệ Thông tin - Đại học Ngân hàng TP.HCM
IComparer
Định nghĩa nhiều cách thức so sánh cho đối tượng
class <Tên_class_con>: Icomparer
get {return CmpType ;}
set { CmpType = value;}
}
// Xem tiếp trang sau
Trang 21Danh 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
Trang 22Danh sách liên kết
Data
Thành phần dữ liệu
Địa chỉ liên kết
Trang 23Danh 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ỉ
Trang 25private Node<T> next;
public Node(T data)
Trang 26Danh sách liên kết
public T Data
{
get{ return this.data;}
set{ this.data = value;}
}
public Node<T> Next
{
get { return this.next; }
set { this.next = value;}
}
Trang 31Danh sách liên kết
class Program
{ static void Main(string[] args)
{
Random r = new Random();
LinkList<int> intList = new LinkList<int>();
for (int i = 0; i < 10; i++)
Trang 32Q&A