CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT I. Phần câu hỏi. 1. Xác định độ phức tạp tính toán của đoạn chương trình con sau: Function Tong(n:word): longint; Var i:word; S:longint; Begin I:=1; S:=0; While i<=n do Begin S:=S+sqr(i); i:=2*i; end; Tong:=S; End; 2. Cho cây nhị phân hoàn chỉnh được lưu trữ kế tiếp bởi mảng A gồm 10 phần tử, với giá trị A[1], A[2],…,A[10] lần lượt là: 7, 5, 10, 3, 6, 8, 12, 1, 4, 2. Vẽ cây này và cho biết đây có phải là cây nhị phân tìm kiếm hay không? Tại sao? II. Phần lập trình Câu 1. Tại một công ty, người ta quản lý các thành phố trên toàn quốc có mở đại lý cho công ty bằng cách sử dụng một danh sách liên kết đơn (mà người ta gọi là danh sách thành phố) với nút đầu được trỏ bởi con trỏ First. Mọi nút của danh sách thành phố là một bản ghi gồm 3 trường: trường TenThanhPho để lưu tên thành phố, trường Down lưu địa chỉ nút tiếp theo, và trường DSDaiLy lưu địa chỉ nút đầu của một danh sách khác chứa thông tin các đại lý trong thành phố đó (gọi là danh sách đại lý). Mỗi nút của danh sách đại lý là một bản ghi gồm 4 trường: TenDaiLy (tên đại lý), SDT (số điện thoại), DoanhThu (doanh thu) và con trỏ Tiep trỏ đến đại lý tiếp theo. Lưu ý rằng: - Danh sách thành phố được sắp theo thứ tự tăng dần của TenThanhPho - Cho biết khai báo của cấu trúc dữ liệu nói trên như sau: Type st25 = string[25]; St8 = string[8]; troDL = ^DaiLy; DaiLy = record TenDaiLy: st25; SDT: st8; DoanhThu: longint; Tiep: troDL; End; TroTP = ^ThanhPho; ThanhPho = record TenThanhPho: st25; Down: TroTp; DSDaiLy: troDL; End; Var First: troTP; a. Viết thủ tục Procedure Xoa(Var first: troTP; Bthanhpho,Bdaily: st25); cho phép xóa một nút thuộc danh sách đại lý có tên đại lý bằng Bdaily thuộc thành phố Bthanhpho. Trong trường hợp, sau khi xóa xong, thành phố Bthanhpho không còn đại lý nào thì xóa tiếp thành phố đó khỏi danh sách thành phố. b. Viết hàm Function MaxDoanhThu (first:troTP; Bthanhpho: st25): longint; trả về doanh thu cao nhất trong số các doanh thu của các đại lý thuộc thành phố Bthanhpho. Nếu không tìm thấy thành phố Bthanhpho thì trả về giá trị 0. c. Viết thủ tục Procedure InDSDaiLy(first: troTP); thực hiện việc in tên đại lý và số điện thoại tất cả các đại lý trên toàn quốc, theo mẫu: DANH SACH CAC DAI LY 1. HA NOI: Daily1 (812562), Daily2 (826956), Daily3 (889712) 2. HUE: Duynhat(586956) …………. Câu 2. Cho trước cây nhị phân Top (nút gốc trỏ bởi Top) có khai báo như sau: Type TroNutTrenCay = ^NutTrenCay; NutTrenCay = Record GiaTri: integer; Left, right: TroNutTrenCay; End; Var Top: TroNutTrenCay; a. Viết hàm Function Chieucao(top:TroNutTrenCay): word; trả về giá trị là chiều cao của cây nhị phân Top. b. Để biểu diễn một hàng đợi người ta có thể sử dụng một danh sách liên kết kép với nút đầu (lối trước) và nút cuối (lối sau) lần lượt bởi trỏ First và Last. Ngoài ra mỗi nút trên danh sách này còn có thể lưu thông tin của một nút trên cây nhị phân Top. Cụ thể ta có khai báo bổ sung như sau: Type TroNutTrenDS = ^NutTrenDS; NutTrenDS = record Info: NutTrenCay; Before, next: TroNutTrenDS; End; Var First, last: TroNutTrenDS; Viết hai thủ tục: Procedure ChenQ(var first, last: troNutTrenDS; X: NutTrenCay;); để bổ sung một nút mà trường info có giá trị bằng X tại vị trí lối sau Last Procedure DelQ(var first, last: TroNutTrenDS; var X: nutTrenCay); để loại bỏ một nút tại vị trí lối trước first và gán giá trị trường info của nút này cho tham biến X. c. Viết thủ tục Procedure LietKe(Top: TroNutTrenCay); nhằm liệt kê giá trị của info.giatri tại mỗi nút trên cây nhị phân Top với yêu cầu: - Thứ tự các nút được liệt kê giá trị là theo thứ tự tăng dần của mức các nút trên cây. - Các nút có cùng mức sẽ được liệt kê theo thứ tự từ trái sang phải. CẤU TRÚC DỮ LIỆU & GIẢI THUẬT K25 (Đề lẻ). Phần câu hỏi: 1. Xác định độ phức tạp tính toán của đoạn chương trình sau theo n và p; I:=1; S:=0; While i<=sqrt(n) do Begin For j:=1 to p do S:= s+i*j; I:=i+1; End; 2. Viết biểu thức trung tố và hậu tố tương ứng với biểu thức tiền tố sau: - / A + B C * A D Phần lập trình Câu1. Giả sử một người có thể có nhiều số điện thoại khác nhau, vì vậy việc lưu số điện thoại của một số người có thể tổ chức bởi một danh sách liên kết có nút đầu trỏ bởi con trỏ List kiểu TROTEN; Ngoài trường Next để trỏ sang nút tiếp, mỗi nút trong danh sách còn có trường Ten (được sắp xếp thứ tự tăng dần) là trường khóa để lưu tên của một người, và trường DSSDT có kiểu TroSdt dùng để trỏ đến nút đâu một danh sách liên kết khác lưu số điện thoại của người này. Cụ thể cho sẵn khai báo như sau: Type str10 = string[10]; TroSdt: SDT; SDT = record Sodienthoai: str10; Tiep: TroSdt; End; TROTEN= BANGHI; BANGHI= record Next: troten; Ten: str10; DSSDT: troSdt; End; Var List: TROTEN; a. Viết thủ tục Edit_tel(name, oldnum, newnum: str10); để sửa số điện thoại của người có tên được chỉ ra trong name với số cũ là oldnum thành số mới là newnum. b. Viết thủ tục Del_tel(P:TROTEN); để xóa tất cả các nút của danh sách các số điện thoại được trỏ bởi p^.dssdt, trong đó P là trỏ vào một nút thuộc danh sách List. c. Viết thủ tục Del_Node(name: str10); để xóa nút thuộc danh sách list có tên được chỉ trong biến name. Câu 2. Xét cây nhị phân tìm kiếm, mỗi nút trong cây có dữ liệu kiểu Banghi có khai báo: Type contro: banghi; Banghi= record Left, right: contro; Info: real; End; a. Viết hàm GTLN(T: contro); cho kết quả là giá trị lớn nhất của trường info của tất cả các nút trong cây T (nút gốc trỏ bởi T), biết rằng T khác nil. b. Xét một danh sách nối kép có nút đầu và nút cuối trỏ bởi con trỏ first và last cùng có kiểu CONTRO (trường Left trỏ đến nút trước và trường Right trỏ đến nút sau). Viết thủ tục Bosungdau(X: real; var first, last: contro); để bổ sung vào đầu danh sách này một nút mới sao cho trường Info có giá trị bằng X. c. Từ cây T ở trên, hãy viết thủ tục Tao_DS_Noikep(T: contro; Var first, Last: contro); để tạo mới một danh sách nối kép có nút đầu trỏ bởi con trỏ First, nút cuối trỏ bởi con trỏ Last, và trường Info của các nút trong danh sách này phải được sắp xếp theo thứ từ giảm dần. CẤU TRÚC DỮ LIỆU & GIẢI THUẬT K25 (Đề 1). Câu 1. Tính độ phức tạp tính toán của giải thuật sau: Function NguyenTo(n:word): boolean; Var j,k: word; Begin K:=trunc(sqrt(n)); J:=2; While (j<=k) and(n mod j <>0) do Inc(j); Nguyento:=j; End; Câu 2. Ban tổ chức Sea Games 22 lưu trữ thành tích của các đoàn có huy chương bằng một danh sách liên kết theo từng môn thi đấu (mỗi môn thi có thể gồm nhiều nội dung và vì vậy sẽ có nhiều bộ huy chương cho mỗi môn). Danh sách này được quản lý thông qua con trỏ đầu danh sách là first. Cấu trúc của danh sách này được khai báo như sau: Type st20 = string[20]; TroTTich = ^Thanhtich; Thanhtich = record Tendoan: st20; Vang, bac, dong: byte; Tiep: troTTich; End; troMThi = ^Monthi; Monthi = record Ten: st20; Next: troTTich; Down: troMThi; End; Var first: TroMThi; Chú ý: danh sách các môn thi được sắp theo thứ tự tăng dần của tên môn thi. Viết các hàm và thủ tục sau: a. Function HCVang(first: troMThi; Bdoan:st20): byte; trả về số lượng huy chương vàng trong tất cả các môn thi của đoàn Bđoàn. b. Procedure Thanhtich( first:troMThi; Bmon: st20); in ra màn hình bảng thành tích của các đoàn có huy chương trong môn thi Bmon; c. Procedure Bosung (var first: TroMThi; Bmon, Bdoan: st20; ch: char); thực hiện việc bổ sung một huy chương loại Ch của đoàn Bdoan đối với các môn thi Bmon theo yêu cầu: - Ch là ‘V’,’B’,’D’ tương ứng là huy chương vàng, bạc, đồng. - Nếu môn thi Bmon chưa có trong danh sách thì bổ sung môn thi trước rồi mới bổ sung thành tích của đoàn sau này. CẤU TRÚC DỮ LIỆU TINK26 Câu 1. Ban chủ nhiệm khoa CNTT quản lý các lớp sinh viên bằng một danh sách liên kết có nút đầu được trỏ bởi first. Cấu trúc danh sách khai báo như sau: Type st4 = string[4]; St6 = string[6]; St20 = string[20]; troSV= ^Sinhvien; sinhvien = record hoten: st20; email: string; tiep: troSV; end; troLop=^Lop; lop =record malop: st4; loptruong: st20; sdt: byte; next: troSV; down: troLop; end; Var first: troLop; Chú ý: các lớp sinh viên trong một lớp được sắp theo thứ tự họ tên (giả thiết trong lớp không có hai sinh viên cùng tên) và danh sách này luôn khác rỗng. Viết các thủ tục sau: a. Procedure Loaibo(bma: st4; bhten:st20); thực hiện việc xóa một sinh viên ở lớp có mã là bma với họ tên là bhten ra khỏi danh sách lớp. b. Procedure DSLoptruong; thực hiện in thông tin lớp trưởng của tất cả các lớp trong Khoa (gồm mã lớp, họ tên lớp trưởng, số điện thoại). c. Procedure DSSVien(bma: st4); in ra danh sách các sinh viên của lớp có mã là Bma, kể cả lớp trưởng (họ tên, số điện thoại hoặc email). Câu 2. Tại một bệnh viện người ta lưu thông tin về các bệnh nhân đang điều trị theo các khoa của bệnh viện bằng một cây nhị phân tìm kiếm theo khóa MaKhoa (mã khoa điều trị) và gốc của cây có địa chỉ là Top. Mỗi nút trong cây có cấu trúc như sau: First là địa chỉ đầu của một danh sách khác (luôn khác rỗng), danh sách này lưu thông tin của các bệnh nhân đang điều trị tại khoa đó. Cấu trúc của cây này có thể khai báo như sau: Type st4 = string[4]; St20 = string[20]; troBN= ^BenhNhan; BenhNhan = record hoten: st20; tuoi: byte; next: troBN; end; troKhoa = ^Khoa; Khoa = record Makhoa: st4; First: troBN; Left, right: troKhoa; end; Var Top: troKhoa; Viết các hàm và thủ tục sau: a. Procedure Xuatvien(bma: st4; bhoten: st20); thực hiện việc loại bệnh nhân có tên bhoten ra khỏi danh sách bệnh nhân của khoa có mã bma (khi bệnh nhân này xuất viện). b. Procedure Nhapvien(bma: st4; bhoten: st20; tuoi: byte); thực hiện việc bổ sung một bệnh nhân. c. Function SoBN(bma: st4): word; trả về số lượng bệnh nhân đang điều trị tại khoa có bma. d. Function TongBN: longint; trả về tổng số bệnh nhân đang điều trị tại bệnh viện. Left Makhoa First Right . trỏ Last, và trường Info của các nút trong danh sách này phải được sắp xếp theo thứ từ giảm dần. CẤU TRÚC DỮ LIỆU & GIẢI THUẬT K25 (Đề 1). Câu 1. Tính độ phức tạp tính toán của giải thuật sau: Function. theo thứ tự từ trái sang phải. CẤU TRÚC DỮ LIỆU & GIẢI THUẬT K25 (Đề lẻ). Phần câu hỏi: 1. Xác định độ phức tạp tính toán của đoạn chương trình sau theo n và p; I:=1; S:=0; While i<=sqrt(n). troTTich; End; troMThi = ^Monthi; Monthi = record Ten: st20; Next: troTTich; Down: troMThi; End; Var first: TroMThi; Chú ý: danh sách các môn thi được sắp theo thứ tự tăng dần của tên môn thi. Viết các hàm và