Chương DANH SÁCH, NGĂN XẾP, HÀNG ĐỢI © nuinvtnu-2017 Data structures and Algorithms Chapter - 1/66 DANH SÁCH 1.1 Khái niệm danh sách 1.2 Danh sách cài đặt mảng 1.3 Danh sách cài đặt trỏ 1.4 Cài đặt phép toán danh sách 1.5 Một số tập © nuinvtnu-2017 Data structures and Algorithms Chapter - 2/66 1.1 Khái niệm danh sách Dữ liệu có cấu trúc ● ● ● Tập đối tượng có số thuộc tính có kiểu liệu khác struct ngaysinh { int ngay, thang, nam; Mỗi đối tượng - cấu trúc } Mỗi thuộc tính - thành phần typedef struct SinhVien{ Khai báo kiểu cấu trúc: struct { Khai báo thành phần; }; Truy nhập: ● ● . cấu trúc char MSV[20]; // ma sinh vien char hoten[30]; // ho ten sinh vien double toan, tin, anh; struct ngaysinh ns; }SinhVien; …… SinhVien sv1, sv2; double dt=sv1.toan; int ngay=sv1.ns.ngay; Định nghĩa kiểu liệu mới: Kiểu cấu trúc typedef struct { Khai báo thành phần; } ; © nuinvtnu-2017 Data structures and Algorithms Chapter - 3/66 1.1 Khái niệm danh sách Danh sách: Tập hợp hữu hạn, biến động phần tử có kiểu liệu Các phần tử có thứ tự “trước-sau” Lưu ý: Một phần tử xuất nhiều lần danh sách Danh sách L (A1, A2, , An) với n ≥ thì: Nếu n = 0: ta nói danh sách rỗng (empty list) Nếu n > 0: A1 phần tử An phần tử cuối danh sách Số phần tử danh sách ta gọi độ dài danh sách Ai đứng trước Ai+1, với i =1 … n-1; Ak đứng sau ak-1, với k = 2…n Ai phần tử vị trí thứ i, hay phần tử thứ i danh sách Danh sách L: Lij= (Ai, Ai+1, , Aj) Đoạn gồm phần tử liên tiếp từ Ai đến Aj L Danh sách rỗng xem danh sách danh sách i=1 Lij gọi phần đầu; j=n Lij gọi phần cuối Dãy L: Danh sách tạo cách trích sốphần tử L Ví dụ: L=(a,b,c,d,e,f): © nuinvtnu-2017 (c,d,e) DS DS (a, b) phần đầu DS (c,d,e,f) phần cuối DS (a,c,f) dãy DS Data structures and Algorithms Chapter - 4/66 1.2 Các phép toán danh sách Một số ký hiệu: L: Tên biến danh sách Item : Là kiểu liệu phần tử L p: Là ví trí danh sách x: Là phần tử có kiểu Item © nuinvtnu-2017 Data structures and Algorithms Chapter - 5/66 1.2 Các phép toán danh sách INSERT_LIST(x,p,L) Chèn x vào vị trí p L LOCATE ( x , L): Xác định vị trí giá trị x L RETRIEVE(p,L) : Lấy nội dung phần tử vị trí p L DELETE_LIST(p,L) Xóa phần tử vị trí p L LENGTH(L) Trả chiều dài danh sách L LINK(p,L) Trả lại vị trí phần tử đứng sau p L PREVIOUS(p,L) Lấy vị trí đứng trước p L FIRST(L) / LAST(L) Trả vị trí phần tử đầu tiên/cuối L EMPTY_LIST(L) Kiểm tra L rỗng 10 MAKENULL_LIST(L) Khởi tạo L rỗng © nuinvtnu-2017 Data structures and Algorithms Chapter - 6/66 1.2 Các phép toán danh sách Lưu ý: Các phép toán xem phép toán nguyên thủy (cơ bản) Từ phép toán nguyên thuỷ ta tự hình thành lên phép toán phức tạp khác như: Tạo danh sách chứa liêu, Sắp xếp danh sách, Duyệt danh sách, Tách, gộp, tính tốn, tổng hợp, ….phụ thuộc vào u cầu cụ thể tốn © nuinvtnu-2017 Data structures and Algorithms Chapter - 7/66 1.3 Biểu diễn danh sách máy tính 1.3.1 Danh sách cài đặt mảng Cài đặt danh sách mảng hay gọi CTDL danh sách đặc CTDL danh sách kế tiếp, gọi tắt là: Danh sách đặc danh sách kế tiếp, thuộc loại cấu trúc liệu tĩnh 1.3.2 Danh sách cài đặt trỏ Danh sách cài đặt trỏ ta gọi CTDL danh sách liên kết hay CTDL danh sách móc nối, gọi tắt danh sách liên kết/danh sách móc nối Chúng thuộc loại cấu trúc liệu động Các hình thức tổ chức liên kết phần tử danh sách: 1) Liên kết đơn: Tương ứng ta có CTDL danh sách liên kết đơn – gọi tắt danh sách liên kết đơn 2) Liên kết vịng: Tương ứng ta có CTDL danh sách liên kết vòng – gọi tắt danh sách liên kết vịng 3) Liên kết đơi: Tương ứng ta có CTDL danh sách liên kết đơi – gọi tắt danh sách liên kết đôi/kép 4) Đa liên kết: Tương ứng ta có danh sách đa liên kết/ đa móc nối © nuinvtnu-2017 Data structures and Algorithms Chapter - 8/66 1.3.1 Danh sách cài đặt mảng Mô tả cài đặt: N số phần tử tối đa; Item: kiểu DL phần tử d.Sách => Biểu diễn: Dùng mảng để lưu giữ phần tử danh sách (Elements) Size biến đếm đếm số lượng phần tử có danh sách => Như ta định nghĩa danh sách cấu trúc gồm trường: Elements: Chứa phần tử danh sách Size: Đếm số phần tử có danh sách (chiều dài danh sách) Mảng chứa phần tử danh sách có dạng: b) Dạng biểu diễn #define N 100 typedef int item; typedef struct List{ item elems[N]; int size; } List; List L; © nuinvtnu-2017 Data structures and Algorithms Chapter - 9/66 1.3.1 Danh sách cài đặt mảng Cài đặt phép toán danh sách: Khởi tạo danh sách rỗng void Init(List *L){ //ham khoi tao danh sach rong /*Danh sach L duoc khai bao kieu tro de khoi ham no co the thay doi duoc*/ L->size=0; } Kiểm tra danh sách rỗng int IsEmpty(struct List L) { if(L.size==0) return 1; else return 0; } © nuinvtnu-2017 Kiểm tra danh sách đầy Data structures and Algorithms int IsFull(struct List L) { if(L.size==N) return 1; else return 0; } Chapter - 10/66 ... i=L->size-1;i>=p;i ) L->elems[i]=L->elems[i-1]; // p chèn x L->elems[p-1]=x; } } © nuinvtnu-2017 Data structures and Algorithms Chapter - 11/66 1.3.1 Danh sách cài đặt mảng Cài đặt phép toán danh. .. for (int i=p-1;isize-1;i++) L->elems[i]=L->elems[i+1]; L->size ; } } © nuinvtnu-2017 Data structures and Algorithms Chapter - 12/66 1.3.1 Danh sách cài đặt mảng Cài đặt phép toán danh sách:... nuinvtnu-2017 Data structures and Algorithms Chapter - 9/66 1.3.1 Danh sách cài đặt mảng Cài đặt phép toán danh sách: Khởi tạo danh sách rỗng void Init(List *L){ //ham khoi tao danh sach rong /*Danh