Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 89 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
89
Dung lượng
1,15 MB
Nội dung
Cấu trúc liệu I II III Các thao tác danh sách (tổ chức mảng danh sách liên kết đơn): Duyệt Duyệt Duyệt có điều kiện Thêm Thêm Thêm có điều kiện Xóa Xóa Xóa có điều kiện Các thao tác (cây nhị phân,cây tìm kiếm nhị phân,cây tổng quát): Duyệt Duyệt Duyệt có điều kiện Thêm (chỉ có nhị phân) Thêm Thêm có điều kiện Xóa (chủ yếu xóa nút lá) Xóa Xóa có điều kiện Các thao tác đồ thị (đồ thị có hướng,vơ hướng): Duyệt Duyệt Duyệt có điều kiện (tìm kiếm) I.Danh sách: 1.Danh sách tổ chức mảng: Cách tổ chức liệu gồm có thành phần sau: +một mảng mangpt lưu tất phần tử danh sách,mỗi phần tử có kiểu KieuPT +một nhớ để lưu số phần tử mảng phần tử cuối mảng Chú ý: +mangpt tên mảng,ví dụ danh sách sinh viên ghi sv,danh sách thuê bao điện thoại ghi tb(thuê bao)… +KieuPT kiểu phần tử ,ví dụ danh sách sinh viên ghi SinhVien(kiểu Sinh Viên),danh sách thuê bao điện thoại ghi ThueBao(kiểu Thuê Bao) Khai báo danh sách: Pascal: Type KieuPT=record Thuộc tính 1:kiểu liệu 1; Thuộc tính 2:kiểu liệu 2; Thuộc tính 3:kiểu liệu 3; … Thuộc tính n:kiểu liệu n; End; Type DanhSach=record mangpt:Array[1 Max] of KieuPT; soPT:integer; end; Java: class KieuPT { private kiểu liệu Thuộc tính 1; private kiểu liệu Thuộc tính 2; private kiểu liệu Thuộc tính 3; … private kiểu liệu n Thuộc tính n; … } class DanhSach { private KieuPT mangpt[]; private int soPT; … } Chú ý: + Max số phần tử tối đa danh sách + DanhSach tên danh sách ,ví dụ danh sách sinh viên đặt tên DSSV ,danh sách thuê bao đặt tên DanhBa (hoặc đặt tên DSTB :danh sách thuê bao),danh sách giáo viên đặt tên DSGV… + mangpt tên mảng lưu danh sách,ở ta viết lại tên mảng đặt phần I cách tổ chức liệu + soPT :nếu kiểu danh sách sinh viên soPT đặt tên soSV(số sinh viên),nếu danh sách cần lưu có kiểu phần tử kiểu thuê bao soPT đặt tên soTB(số thuê bao) Chú ý: +KieuPT tên kiểu liệu tự định nghĩa ,đặt tên cho sát với tên đối tượng cần lưu trữ danh sách làm việc,ví dụ danh sách sinh viên đối tượng cần lưu trữ Sinh Viên suy KieuPT SinhVien +các loại kiểu liệu , kiểu liệu 2, kiểu liệu kiểu liệu phù hợp cho thuộc tính ,ví dụ :thuộc tính họ tên kiểu liệu kiểu string (kiểu chuỗi),thuộc tính mã số sinh viên kiểu liệu kiểu string (kiểu chuỗi),thuộc tính dùng để lưu trữ số nguyên kiểu liệu kiểu integer (kiểu số nguyên),nếu thuộc tính dùng để lưu trữ điểm trung bình kiểu liệu kiểu real(kiểu số thực ,vì điểm trung bình thường số có phần lẻ thập phân ví dụ:7.5 ,8.6 …).Tổng quát tùy vào giá trị cần lưu trữ chuỗi kí tự dùng kiểu string ,nếu lưu trữ số nguyên kiểu integer,số thực kiểu real Ví dụ khai báo tổ chức liệu mảng Bài 1:Cho danh sách sinh viên,mỗi sinh viên gồm:tên,mã sinh viên,điểm trung bình.Hãy khai báo tổ chức liệu cho danh sách o Giải đáp Mỗi sinh viên gồm thành phần: +Phần tên thuộc kiểu xâu kí tự +Phần mã sinh viên thuộc kiểu xâu kí tự +Phần điểm trung bình thuộc kiểu số thực Tổ chức liệu danh sách sinh viên mảng gồm thành phần: +Phần mảng lưu tất phần tử danh sách,mà phần tử thuộc kiểu sinh viên +Một ô nhớ lưu số lượng sinh viên danh sách Khai báo: Pascal: const Max_SV=…;{số lượng sinh viên tối đa danh sách} TYPE SinhVien=record ten:string; masv:string; dtb:real; DSSV=record sv:array[1 Max_SV] of SinhVien; soSV:0 Max_SV; END; var ds:DSSV; Java: class SinhVien { private string ten; private string masv; private double dtb; … } class DSSV { private SinhVien sv[]; private int soSV; … } Bài 2:Khai báo tổ chức liệu cho danh sách sách,mỗi sách gồm tên sách,giá tiền,các tác giả(tối đa tác giả) o Giải đáp Mỗi sách gồm thành phần: +Phần tên thuộc kiểu xâu kí tự +Phần giá tiền thuộc kiểu số nguyên +Phần tác giả mảng danh sách tên tác giả,mỗi tên tác giả thuộc kiểu xâu kí tự Tổ chức liệu cho danh sách mảng gồm thành phần: +Phần mảng lưu tất phần tử danh sách,mà phần tử sách +Một ô nhớ lưu số lượng sách danh sách Khai báo: Pascal: const Max_CS=…;{số lượng sách tối đa danh sách} TYPE CuonSach=record ten:string; giaTien:integer; tacGia:array[1 5] of string; soTacGia:0 5; DSCS=record cs:array[1 Max_CS] of CuonSach; soCS:0 Max_CS; END; var ds:DSCS; Java: class CuonSach { private string ten; private int giaTien; private string tacGia[]; private int soTacGia; … } class DSSV { private CuonSach cs[]; private int soCS; … } Bài 3:Một khách sạn A có nhiều phòng cho thuê,mỗi phòng gồm:mã phòng,tên người thuê,thời gian thuê.Hãy khai báo tổ chức liệu để quản lý phòng cho khách sạn o Giải đáp Mỗi phòng gồm thành phần: +Phần mã phòng thuộc kiểu xâu kí tự +Phần tên người th phòng,thuộc kiểu xâu kí tự +Phần thời gian thuê thuộc kiểu số nguyên Tổ chức liệu cho danh sách mảng gồm thành phần: +Phần mảng lưu tất phần tử danh sách,mà phần tử phòng +Một ô nhớ lưu số lượng phòng danh sách Khai báo: Pascal: const Max_Phong=…;{số lượng phòng tối đa danh sách} TYPE Phong=record maPhong:string; tenKH:string; thoiGian:integer; DSPhong=record ph:array[1 Max_Phong] of Phong; soPhong:0 Max_Phong; END; var ds:DSPhong; Java: class Phong { private string maPhong; private string tenKH; private int thoiGian; … } class DSPhong { private Phong ph[]; private int soPhong; … } Bài 4:Một cửa hàng tạp hóa có bảng hóa đơn,mỗi hàng hóa gồm:, tên mặt hàng,số lượng,đơn giá,thành tiền.Bạn khai báo tổ chức liệu cho hóa đơn,biết hóa đơn có tối đa 10 hàng hóa Khai báo tổ chức liệu cho danh sách hóa đơn o Giải đáp Mỗi hàng hóa gồm thành phần: +Phần tên thuộc kiểu xâu +Phần số lượng thuộc kiểu số nguyên +Phần đơn giá thuộc kiểu số nguyên +Phần thành tiền thuộc kiểu số nguyên Tổ chức liệu mảng cho hóa đơn gồm thành phần: +Phần mảng lưu tất phần tử danh sách,mà phần tử hàng hóa +Một nhớ lưu số lượng hàng hóa danh sách Tổ chức liệu mảng cho danh sách hóa đơn gồm thành phần: +Phần mảng lưu tất phần tử danh sách,mà phần tử hóa đơn +Một nhớ lưu số lượng hóa đơn danh sách Khai báo: Pascal: const Max_HH=10; const Max_HD=…; type HangHoa=record tenHH:string; soLuong:integer; donGia:integer; thanhTien:integer; HoaDon=record hh:array[1 Max_HH] of HangHoa; soHH:0 Max_HH; DSHD=record hd:array[1 Max_HD] of HoaDon soHD:0 Max_HD; end; var ds:DSHD; Java: class HangHoa { private string tenHH; private int soLuong; private int donGia; private int thanhTien; … } class HoaDon { private HangHoa hh[]; private int soHH; … } class DSHD { private HoaDon hd[]; private int soHD; … } Bài 5:Một người có nhiều bạn,anh ta liên lạc với người bạn số điện thoại,nhưng máy điện thoại anh khơng thể lưu nhiều 10 số điện thoại.Cho nên Anh ta định viết phần mềm máy tính để quản lý số điện thoại tất bạn bè.Nhưng anh lại chưa biết để khai báo tổ chức liệu.Bạn giúp anh khai tổ chức liệu cho phần mềm o Giải đáp Mỗi thuê bao gồm thành phần: +Phần tên thuê bao thuộc kiểu xâu kí tự +Phần số điện thoại,thuộc kiểu xâu kí tự Tổ chức liệu cho danh sách thuê bao mảng gồm thành phần: +Phần mảng lưu tất phần tử danh bạ,mà phần tử thuê bao +Một ô nhớ lưu số lượng thuê bao danh bạ Khai báo: Pascal: const Max_ThueBao=…;{số lượng thuê bao tối đa danh sách} TYPE ThueBao=record tenTB:string; soDT:string; DSTB=record tb:array[1 Max_ThueBao] of ThueBao; soTB:0 Max_ThueBao; END; var ds:DSTB; Java: class ThueBao { private string tenTB; private string soDT; … } class DSTB { private ThueBao tb[]; private int soTB; … } Bài 6:Một sinh viên học ngành cơng nghệ thơng tin có tập liên quan đến môn cấu trúc liệu.Ơng thầy mơn đưa câu hỏi sau: Chủ nhà sách đau đầu việc tính tốn doanh thu thống kê số sách bán tháng mình,nhưng ơng khơng muốn th nhân viên kế tốn phải trả thêm lương.Cho nên ơng định nhờ người biết lập trình viết cho ông phần mềm để giải vấn đề này.Bạn có cách giải giúp ơng chủ Bài 7:Một anh chàng sinh viên đau đầu với mơn tư tưởng hồ chí minh,khi đường học nhà anh gặp gái mà anh quen biết,cô gái suy tư điều đó,anh hỏi biết gặp khó khăn việc quản lý sản phẩm bán online.Vì kinh doanh nhỏ nên khơng có website riêng nên cô gái bán hàng facebook.Anh sinh viên định giúp cô chưa nghĩ cách tổ chức liệu sao.Bạn học qua mơn cấu trúc liệu giúp đỡ anh a.Duyệt bản(duyệt khơng có điều kiện): Giải thích duyệt: Để hiểu duyệt ta xem qua ví dụ sau:cho danh sách tên sinh viên lớp,vậy việc bạn nhìn qua tất tên sinh viên danh sách việc bạn nhìn thao tác duyệt.Nói chung mặt duyệt giống việc bạn phải xem xét tất tên sinh viên có danh sách.Duyệt khơng có điều kiện tức xem qua tất phần tử khơng có thao tác với thơng tin phần tử mảng Chú thích: - Thao tác: so sánh,kiểm tra - Thông tin phần tử:ví dụ tên sinh viên,mã sinh viên,điểm… Thuật tốn: - Duyệt phần tử danh sách từ đầu đến cuối danh sách + Thao tác với phần tử xét(thăm) Giải thích thuật tốn:Lần lượt xem qua tất phần tử danh sách,với phần tử xét ta dùng để làm điều kiện cho việc tính tốn khác đếm phần tử,liệt kê,tìm kiếm… Cài đặt: Pascal: procedure duyet(); var n:integer; begin for i:=1 to n { ds.mangpt[i] phần tử xét } end; Java: void duyet() { int i; for(i=0;i=7.0 Lưu ý:Nếu vận dụng linh hoạt việc sử dụng thông tin phần tử làm điều kiện duyệt tất tốn ta giải Thuật toán: - Duyệt phần tử danh sách từ đầu đến cuối danh sách + Kiểm tra thông tin phần tử xét thỏa mãn điều kiện thực cơng việc đếm,liệt kê,tìm kiếm,… Giải thích thuật tốn:Với phần tử danh sách ta kiểm tra thông tin phần tử thông tin thỏa mãn điều kiện yêu cầu từ đề thực việc đếm,liệt kê,hoặc tìm kiếm,… Cài đặt: Pascal: function duyetDK(dk:KieuDK):kiểu trả về;{KieuDK kiểu liệu điều kiện} III.Đồ thị 1.Biểu diễn đồ thị ma trận kề Giả sử G đồ thị gồm n đỉnh,giả sử đỉnh đánh số 1,2,3,…,n.Để biểu diễn đồ thị ta dùng mảng hai chiều chứa giá trị số thực Gọi mtk(ma trận kề) mảng hai chiều biểu diễn đồ thị khơng có trọng số phần tử mảng xác định sau: cạnh(cung) (i,j) thuộc đồ thị mtk[i][j]= cạnh (i,j) không thuộc đồ thị Đối với đồ thị có trọng số phần tử mảng xác định sau: C[i][j] cạnh(cung) (i,j) thuộc đồ thị mtk[i][j]= cạnh (i,j) không thuộc đồ thị Với C[i][j] trọng số cạnh (i,j) Khai báo: Pascal: Const MaxVerti=…;{số đỉnh tối đa đồ thị} TYPE KieuPT=…;{kiểu phần tử ma trận kề integer double} DoThi=RECORD soDinh:1 MaxVerti; mtk:array[1 MaxVerti,1 MaxVerti] of KieuPT; END; var G:DoThi; Java: class DoThi { private int soDinh; private KieuPT mtk[][]; … } Chú ý: +KieuPT thường kiểu int kiểu double Duyệt đồ thị theo chiều sâu đồ thị biểu diễn ma trận kề Bổ sung vào khai báo DoThi mảng daTham[] kiểu boolean.đây mảng đánh dấu đỉnh thăm,trước thực duyệt đặt daTham[i]=false (với i=1 đến soDinh) Thuật toán:Duyệt đồ thị theo chiều sâu xuất phát từ đỉnh v với điều kiện dk - Gán daTham[v] true(tức thăm nút v) Với đỉnh w kề với đỉnh v +Nếu chưa thăm w *Thao tác với thơng tin cặp cạnh (v,w) (thao tác:kiểm tra,đếm,liệt kê) *Duyệt đồ thị theo chiều sâu xuất phát từ đỉnh w với điều kiện dk Giải thích thuật tốn:khi đến thăm nút v đặt daTham[v]=true,duyệt đỉnh đồ thị ,Nếu đỉnh xét chưa thăm kề với v thực duyệt đồ thị theo chiều sâu xuất phát từ đỉnh xét Cài đặt: Pascal: procedure duyet(v:integer;KieuDK dk); var w:integer; begin daTham[v]:=true; for w=1 to G.soDinh begin if(daTham[w]=false and G.mtk[v][w]0) then begin if(thông tin cặp cạnh (v,w) thỏa mãn điều kiện dk) then begin {thao tác:đếm ,liệt kê,…} end; duyet(w,dk); end; end; end; Java: void duyet(int v,KieuDK dk) { int w; daTham[v]=true; for(w=0;w