Cơ sở dữ liệu - Chương 4: Danh sách tuyến tính
Bạn đang xem 20 trang mẫu của tài liệu "Cơ sở dữ liệu - Chương 4: Danh sách tuyến tính", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- co_so_du_lieu_chuong_4_danh_sach_tuyen_tinh.ppt
Nội dung text: Cơ sở dữ liệu - Chương 4: Danh sách tuyến tính
- CHƯƠNG 4 DANH SÁCH TUYẾN TÍNH
- MỤC TIÊU ◼ Khái niệm danh sách tuyến tính ◼ Các phép toán với danh sách ◼ Lưu trữ kế tiếp của danh sách tuyến tính ◼ Danh sách móc nối đơn ◼ Danh sách nối đôi ◼ Danh sách móc nối vòng ◼ Ngăn xếp ◼ Hàng đợi
- KHÁI NIỆM DSTT ◼ Danh sách là một tập các phần tử thuộc cùng một lớp đối tượng nào đó Dãy số nguyên, danh sách sinh viên, ◼ Giả sử L là một danh sách có n phần tử L = { a1, a2, , an } n gọi là độ dài của danh sách L n>0 thì a1 là phần tử đầu tiên, an là phần tử cuối cùng Với L, ta nói ai đứng trước ai+1 và đứng sau ai-1 (i=1 n). Danh sách mà các phần tử có thứ tự “trước-sau” gọi là “DSTT”
- CÁC PHÉP TOÁN TRÊN DSTT ◼ Khởi tạo danh sách rỗng (creat) ◼ Kiểm tra danh sách rỗng (empty) ◼ Kiểm tra danh sách đầy (full) ◼ Bổ sung một phần tử vào danh sách (add) ◼ Loại bỏ một phần tử khỏi danh sách (remove) ◼ Sắp xếp danh sách (sort) ◼ Tìm kiếm trên danh sách (search) ◼
- LƯU TRỮ KẾ TIẾP CỦA DSTT ◼ DSTT được lưu trữ trong bộ nhớ bởi một mảng một chiều gọi là lưu trữ kế tiếp. ◼ Mỗi phần tử của mảng lưu trữ một phần tử của danh sách ◼ Ưu điểm Truy cập nhanh và đồng đều đối với mọi phần tử Các thao tác được thực hiện khá đơn giản ◼ Nhược điểm Do kích thước mảng cố định khi khai báo nên có thể dẫn đến sự lãng phí hoặc thiếu bộ nhớ.
- BIỂU DIỄN CẤU TRÚC DỮ LIỆU ◼ Giả sử các phần tử của danh sách có kiểu dữ liệu là “Item” ◼ Độ dài của danh sách là một số nguyên dương N ◼ Danh sách được biểu diễn bởi một cấu trúc gồm hai thành phần Thành phần thứ nhất: biến “count” lưu chỉ số phần tử mảng, lưu trữ phần tử cuối cùng của danh sách. Thành phần thứ hai: mảng một chiều “E” lưu các phần tử của danh sách L, E[i-1] lưu ai
- LƯU TRỮ KẾ TIẾP CỦA DSTT ◼ Biểu diễn danh sách Danh sách cần lưu trữ: L = { a1, a2, , an } 0 1 n-1 Max-1 Mảng E a1 a2 an count = n-1
- LƯU TRỮ KẾ TIẾP CỦA DSTT ◼ Cấu trúc dữ liệu được khai báo như sau #define Max N L.count = -1 -> ds L rỗng struct Item { L.count = Max-1 -> ds L đầy Các thành phần dữ liệu; }; struct List { int count; Item E[Max]; }; List L; //Khai báo ds L
- LƯU TRỮ KẾ TIẾP CỦA DSTT ◼ Ví dụ #define Max 7 struct List { struct Sinhvien { int count; char hoten[30]; Sinhvien E[Max]; char gioitinh[4]; }; int tuoi; List L; //Khai báo ds L };
- LƯU TRỮ KẾ TIẾP CỦA DSTT ◼ Ví dụ 0 1 2 3 4 5 6 L.E E S1 S2 S3 S4 S5 L.count count = 4 Danh sách L chứa 5 sinh viên
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Khởi tạo danh sách rỗng ◼ Kiểm tra danh sách rỗng ◼ Kiểm tra danh sách đầy ◼ Phép loại bỏ một phần tử khỏi danh sách ◼ Bổ sung một phần tử vào danh sách ◼ Thống kê danh sách ◼ Tính toán trên danh sách ◼ Tìm kiếm trên danh sách ◼ Sắp xếp danh sách
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Khởi tạo danh sách rỗng void creat(List &L) { L.count = -1; } Max = 7 0 1 2 3 4 5 6 Mảng E count = -1 Danh sách rỗng
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Kiểm tra danh sách rỗng int empty(List L) { return (L.count == -1); } Hàm empty trả về giá trị 1 nếu danh sách rỗng, ngược lại trả về 0
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Kiểm tra danh sách đầy int full(List L) { return (L.count == Max-1); } Max = 7 0 1 2 3 4 5 6 Mảng E 14 23 11 25 37 19 29 count = 6 Danh sách đầy
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Thêm một phần tử vào cuối danh sách Điều kiện: Danh sách chưa đầy Max = 7 0 1 2 3 4 5 6 Mảng E 14 23 11 25 37 29 count =count 4 = 5 Danh sách chưa đầy X 29
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Thêm một phần tử vào cuối danh sách int Add(List &L, Item X) { if (full(L)) return 0; else{ L.count++; L.E[L.count] = X; return 1; } }
- LƯU TRỮ KẾ TIẾP CỦA DSTT CHƯƠNG TRÌNH TẠO VÀ HiỂN THỊ DANH SÁCH SINH VIÊN
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép loại bỏ phần tử thứ k khỏi danh sách L Loại bỏ phần tử tại vị trí thứ k=3 for (i=k;i<=L.count; i++) L.E[i-1] = L.E[i]; Max = 7 0 1 2 3 4 5 6 Mảng E 14 23 4211 1125 25 count = 3 count = 4 L.count = L.count-1;
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép loại bỏ một phần tử khỏi danh sách L int Remove(int k, List &L) { if (k 0) { for (int i = k; i <= L.count; i++) L.E[i-1] = L.E[i] ; L.count = L.count - 1; return 1; } else return 0; }
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép loại bỏ một phần tử khỏi danh sách L Hàm Remove loại bỏ phần tử thứ k trong danh sách L Phép loại bỏ thành công khi L không rỗng và k là một vị trí nằm trong ds L Hàm trả về 1 nếu loại bỏ thành công, ngược lại trả về 0
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép bổ sung một phần tử vào vị trí k trong danh sách L Bổ sung X=24 tại vị trí k=3 for (i=L.count;i>=k-1;i ) L.E[i+1]=L.E[i]; Max = 7 0 1 2 3 4 5 6 Mảng E 14 23 4224 1142 1125 25 count =count 4 = 5 X 24 L.E[k-1]=X; L.count++;
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép bổ sung một phần tử vào vị trí k trong danh sách L int Insert(List &L, int k, Item X) { if (k 0 && !full(L)) { for (int i = L.count; i >=k-1; i ) L.E[i+1] = L.E[i] ; L.E[k-1] = X; L.count ++; return 1; } else return 0; }
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép bổ sung một phần tử vào danh sách L Hàm Insert bổ sung X vào vị trí k trong ds L Phép bổ sung thành công khi L không đầy và k là một vị trí nằm trong ds L Hàm trả về giá trị 1 nếu bổ sung thành công, ngược lại trả về 0.
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép bổ sung một phần tử vào cuối danh sách L Bổ sung X=24 vào cuối danh sách L 1 2 3 4 5 6 Max = 7 Mảng E 14 23 42 11 25 X = 24 count = 5 1 2 3 4 5 6 Max = 7 Mảng E 14 23 42 11 25 count = 6
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép bổ sung một phần tử vào cuối danh sách L Bổ sung X=24 vào cuối danh sách L 1 2 3 4 5 6 Max = 7 Mảng E 14 23 42 11 25 24 count = 6
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép bổ sung một phần tử vào cuối danh sách L Procedure Insert_End (X:Item; Var L:List; Var OK:Boolean); Var i : integer; Begin OK := FALSE; if ( L.count < Max) then begin L.count := L.count + 1; L.E[L.count] := X; OK := TRUE; end; END;
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Phép bổ sung một phần tử vào cuối danh sách L Thủ tục Insert_End bổ sung X vào cuối ds L Phép bổ sung thành công khi L không đầy Biến OK cho biết phép toán có thành công hay không ◼ OK = True -> Thành công ◼ OK = False -> Không thành công
- BÀI TẬP ◼ Cho L={A1, A2, A3, A4, A5} ◼ Yêu cầu: Vẽ hình mô tả trạng thái của danh sách qua các bước trong quá trình tạo mới danh sách từ một danh sách rỗng. Vẽ hình mô tả trạng thái của danh sách trong thao tác loại bỏ phần tử đầu tiên (A1) và phần tử thứ 3 (A3) trong danh sách (cần chú thích rõ ràng) Vẽ hình mô tả quá trình bổ sung phần tử A6 vào đầu danh sách, vào sau phần tử thứ 3 (A3) trong danh sách. Giả sử danh sách lưu trữ thông tin về các sinh viên, mỗi sinh viên gồm: Mã sinh viên, họ và tên, năm sinh, điểm tổng kết. Hãy cài đặt chương trình thực hiện các yêu cầu sau:
- CÁC PHÉP TOÁN TRÊN DS KẾ TIẾP ◼ Khai báo cấu trúc dữ liệu của danh sách ◼ Nhập mới 5 phần tử cho danh sách ◼ Hiển thị danh sách lên màn hình ◼ Xóa phần tử đầu tiên trong danh sách, hiển thị lại danh sách ◼ Xóa phần tử thứ 4 trong danh sách, hiển thị lại danh sách ◼ Thêm một phần tử vào đầu danh sách, hiển thị lại danh sách ◼ Thêm một phần tử vào sau phần tử thứ 3 trong danh sách, hiển thị danh sách ◼ Tìm sinh viên có tên “Doanh” trong danh sách, hiển thị kết quả tìm kiếm. ◼ Sắp xếp danh sách theo chiều giảm dần của điểm tổng kết, hiển thị lại DS.