Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 81

Đề thi

Cấu trúc dữ liệu và giải thuật


(Có đáp án)
Đại Học Công Nghệ Thông Tin.
Đại Học Thái Nguyên.
Đề 1
Câu 1(2 điểm)
Thế nào là giải thuật; cấu trúc dữ liệu, mối quan hệ giữa chúng? Hãy nêu một vài cấu trúc dữ
liệu tiền định của ngôn ngữ lập trình mà anh (chị) biết?
Câu 2(5 điểm)
Giả sử cần quản lý một lớp học bao gồm các sinh viên. Mỗi sinh viên gồm các thông tin sau:
Họ Tên, Lớp, Số báo danh, Điểm trung bình. Anh (chị) hãy:
1) Viết dạng cài đặt danh sách này bằng cấu trúc danh sách liên kết đơn,
2) Với cấu trúc danh sách đã cài đặt, viết các chương trình con thực hiện các yêu cầu như sau:
a) Nhập vào danh sách gồm n sinh viên
b) Loại bỏ khỏi danh sách những sinh viên có điểm trung bình < 5
c) Sắp xếp danh sách theo trường lớp tăng dần
d) In ra màn hình danh sách sinh viên theo từng lớp
(n là một số nguyên dương tự nhập từ bàn phím)

Câu 3(1 điểm)

Anh (Chị) hãy nêu ưu nhược điểm của cách cài đặt danh sách bởi danh sách liên kết đơn?
Câu 1

+ Giải thuật là một dãy các câu lệnh chặt chẽ và rõ ràng, xác định một dãy các thao tác trên một
số đối tượng nào(dữ liệu) đó sao cho sau một số hữu hạn bước thực hiện ta đạt được kết quả mong
muốn (0.5 đ)

+ Cách thức tổ chức biểu diễn dữ liệu mà theo đó dữ liệu được lưu trữ và được xử lý trong
MTĐT, được gọi là cấu trúc dữ liệu (0.5 đ)

+ Mối quan hệ giữa cấu trúc dữ liệu và giải thuật: Giải thuật tác động trên dữ liệu lưu trữ trong
các cấu trúc để cho ra kết quả mong muốn. Trong lập trình, chúng quan hệ với nhau theo ràng buộc
sau:

Giải thuật + cấu trúc dữ liệu = chương trình (0.5 đ)


+ Một vài cấu trúc dữ liệu của ngôn ngữ lập trình: Mảng, bản ghi, xâu ký tự, tệp tin …..
(0.5 đ)

Câu 2
*) Dạng cài đặt danh sách (1 đ)
Type Sinhvien = record
Hoten: String;
Lớp : String;
SoBD: String;
ĐTB: real;
` Next: ^ Sinhvien;
end;
List = ^Sinhvien;
Var L: List;
*) Viết giải thuật
1) Nhập danh sách gồm n sinh viên (1 đ)
+ Nhập số lượng sinh viên hiện có n: readln(n);
+ Sử dụng vòng lăp i chạy từ 1 -> n, mỗi lần lặp nhập 1 sinh viên và gắn vào danh sách:
for i:=1 to n do
begin
- new(M); {yêu cầu MT cấp phát ô nhớ chứa dữ liệu của sinh viên cần
nhập }
- Nhập các thông tin về sinh viên, lưu vào ô nhớ được trỏ bởi M
- Gắn kết ô nhớ được trỏ bởi M vào danh sách
end;
2) Loại bỏ những SV có điểm trung bình <5 (1 đ)

Kiểm tra xem danh sách L có rỗng hay không? Nếu rỗng trở về chương trình chính, nếu không
rỗng thực hiện loại bỏ như sau:
-
Sử dụng con trỏ phụ q duyệt tử đầu đến cuối danh sách, nếu q^.dtb <5 thì gọi thủ
tục loại bỏ phần tử được trỏ bởi q trong danh sách
-
Viết thủ tục loại bỏ phần tử được trỏ bởi con trỏ q trong danh sách L:

a) Giả sử đã biết vị trí con trỏ q

b) Sử dụng con trỏ phụ p di chuyển đến vị trí trước q:

P:= L;

While p^.next<> q do p:= p^.next;


c) Loại bỏ phần tử ở vị trí q:

p^.next := q^.next;
dispose(q);
q:= p^.next;// lưu vị trí tiếp theo vị trí loại bỏ để còn loại bỏ tiếp
3) Sắp xếp danh sách theo trường lớp tăng dần (1 đ)

Có thể sử dụng một trong các thuật toán sắp xếp để sắp xếp dữ liệu trên danh sách liên
kết, ở đây ta sử dụng giải thuật sắp xếp chọn trực tiếp (selection sort) và sử dụng cách tiếp
cận:giữ nguyên mối liên kết của các nút trong danh sách và hoán vị nội dung của các nút:
Giải thuật:
Procedure ListSelection_Sort(var L: List)
Var p, q, min: List;
Begin
p:=L;
While (p<>nil) do
Begin
q:=p^.next;
min:=p;
While (q<>nil) do
Begin
If (q^.infor<min^.infor) then min:=q;
q:=q^.next;
End;
Hoanvi(min^.infor,p^.infor);
P:=P^.next;
End;
End;
4) Hiển thị danh sách sinh viên theo từng lớp: Sử dụng con trỏ M duyệt tử đầu đến cuối danh
sách đã được sắp theo lớp ở câu 3, duyệt đến sinh viên nào thì hiển thị các thông tin về sinh viên đó:
(1 đ)
M: = L; p:=M;
writeln(‘Các sinh vien lop M^.lop la:’);
While (M<> nil) do
Begin
Write(M^. hoten);
Write(M^. Lop);
Write(M^. sbd);
P:=M;
M := M^.next;
If (M^.lop<>p^.lop) then writeln(‘Các sinh vien lop M^.lop la:’);
End;
Câu 3
Ưu điểm: (0.5 đ)
-
Không gây hiện tượng lãng phí bộ nhớ (Hiện tượng giữ chỗ để đấy mà không
dùng đến như danh sách cài đặt bởi mảng)
-
Cấu trúc dữ liệu danh sách cài đặt bởi con trỏ còn gọi là cấu trúc dũ liệu động,
không gian bộ nhớ được cấp phát trong heap, do đó nó không bị giới hạn bởi kích
thước 64kb như đối với cấu trúc dữ liệu tĩnh
-
Các phần tử trong danh sách nằm ở những vị trí dải dác, do đó tận dụng được
những không gian trống này, mà không cần một vùng nhớ kế tiếp như cài đặt bởi
mảng
Nhược điểm: (0.5 đ)
-
Tốc độ truy cập đến các phần tử trong danh sách là chậm, không đồng đều đối với
mọi phần tử (truy cập tuần tự một chiều)
-
Từ phần tử sau không truy cập ngược đến các phần tử đứng trước nó được
-
mỗi phần tử trong danh sách tốn thêm một ô nhớ có kích cỡ là 4byte để lưu địa chỉ
của phần tử đứng sau nó trong danh sách
Đề 2
Câu 1(3 điểm)
1) Thế nào là cấu trúc dữ liệu tiền định (định sẵn) của ngôn ngữ lập trình bậc cao?
2) Hãy nêu một vài cấu trúc dữ liệu tiền định của ngôn ngữ lập trình mà anh (chị) biết?
3) Tại sao chỉ sử dụng các cấu trúc dữ liệu tiền định không đủ đáp ứng yêu cầu về việc tổ
chức, lưu trữ dữ liệu của mọi bài toán ứng dụng thực tế?. Một số bài toán ứng dụng
phải cần sử dụng đến các cấu trúc dữ liệu do người lập trình tự định nghĩa? Hãy nêu
một bài toán ứng dụng như vậy, phân tích bài toán để thể hiện điều đó?
Câu 2(3 điểm)
Giả sử ta cần quản lý một ngăn xếp chứa các số nguyên. Viết dạng cài đặt của cấu trúc ngăn
xếp này bằng mảng. Với cấu trúc ngăn xếp vừa cài đặt, hãy viết thủ tục thêm phần tử x vào
vị trí thứ k kể tử đỉnh ngăn xếp sao cho các phần tử khác không thay đổi thứ tự (k là số
nguyên nhập từ bàn phím).
Câu 3(2 điểm)
Anh (Chị) hãy nêu một lớp bài toán mà sử dụng cấu trúc ngăn xếp rất thích hợp cho việc giải
quyết các yêu cầu của bài toán? phân tích bài toán đã nêu để thể hiện rõ điều đó?
Câu 1
1) Cấu trúc dữ liệu tiền định của ngôn ngữ lập trình bậc cao là các cấu trúc dữ liệu đã được định nghĩa
sẵn trong ngôn ngữ lập trình đó, người lập trình chỉ việc sử dụng mà không cần định nghĩa lại (1 đ)
3) Một vài cấu trúc dữ liệu tiền định như: mảng, bản ghi, tệp tin, ...... (1 đ)
2) Các cấu trúc dữ liệu tiền định có sẵn trong ngôn ngữ lập trình không đáp ứng đầy đủ được nhu cầu
lưu trữ dữ liệu lớn của mọi chương trình, không phản ánh đầy đủ bản chất của các đối tượng dữ liệu có
trong thực tế = > người ta cần đến các cấu trúc dữ liệu do người lập trình tự định nghĩa. (0.5
đ)
Ví dụ: Xét bài toán quản lý hồ sơ sinh viên trong một khoa, các yêu cầu quản lý hồ sơ là: Thêm, sửa,
xóa, tìm kiếm, …..hồ sơ.=> Sử dụng cấu trúc dữ liệu mảng (cấu trúc tiền định)để lưu các thông tin về
hồ sơ là không phù hợp vì: cấu trúc mảng không cho phép thực hiện phép toán thêm, xóa, không gian
không đủ để lưu trữ tất cả hồ sơ nếu số lượng hồ sơ thực tế lớn,….. (0.5 đ)

Câu 2
+ Dạng cài đặt ngăn xếp sử dụng mảng: (1 đ)
const n = <số phần tử tối đa trong ngăn xếp>;
type Stack = Record
Top: 0..n ;
Element : array [1.. n] of integer;
End;
+ Thêm phần tử x vào ngăn xếp S ở vị trí thứ k tính từ đỉnh ngăn xếp: (2 đ)

Kiểm tra xem ngăn xếp có rỗng không, nểu rỗng thì thêm vào đỉnh ngăn xếp, Nếu ngăn xếp
không rỗng: Kiểm tra xem số k nhập vào có > top hay không? Nếu lớn hơn thì thêm x vào đỉnh ngăn
xếp, nếu không: Lấy (top-k+1) phần tử kể từ đầu ngăn xếp ra một ngăn xếp phụ, thêm phần tử phần tử
x vào ngăn xếp, đổ (top – k+1) phần tử từ ngăn xếp phụ vào ngăn xếp ban đầu do đó đảm bảo không
thay đổi trật tự các phần tử trong ngăn xếp ban đầu sau khi loại bỏ phần tử ở vị trí k.(thủ tục tương
ứng tự viết)

Câu 3

(1 đ)

- Cấu trúc ngăn xếp thường được áp dụng cho những bài toán có trình tự truy xuất ngược với trình tự
lưu trữ. Ví dụ:

+ Bài toán chuyển đổi cơ số, tìm ước số chung của hai số nguyên, bài toán tính giá
trị biểu thức, ....

+ Thường áp dụng trong một số bài toán tìm đường đi trong lý thuyết đồ thị (lưu vết
đường đi)

+ làm môi trường lưu trữ các biến toàn cục và cục bộ của các thủ tục trong chương
trình dịch của ngôn ngữ lập trình.

(1 đ)

- Phân tích cách giải các bài toán trên để thể hiện rõ điều đã nêu
Đề 3
Câu 1(2 điểm)
Có người nói: “Phép đệ quy phản ánh chiến thuật “chia để trị” trong cách giải bài toán ”. Điều
đó có đúng không? anh (chị) hãy giải thích và cho ví dụ minh họa cho điều đó?
Câu 2(3 điểm)
Giả sử cần quản lý một cây chứa các số nguyên, các đỉnh trên cây được đánh số theo một thứ
tự nào đó. Hãy viết dạng cài đặt cây bằng cha của mỗi đỉnh sử dụng mảng. Với cách cài đặt
này, viết các giải thuật tìm con cả, tìm cha của đỉnh k cho trước (k là số nguyên nhập từ bàn
phím)
Câu 3(3 điểm)
Cho một cây thư mục T và kích cỡ của từng thư mục con trong máy tính như sau:
1 KB
\users \BT\

2 KB 1KB
Tin\ Toan\

8 KB 10 kB 6 KB 9KB 10 kB
BT1 Bt2 Bt3 BT1 BT2

Anh(chị) hãy:
1) Viết dạng cài đặt cây bằng con trưởng và em liền kề của mỗi đỉnh, sử dụng con trỏ
2) Để tính tổng kích thước của toàn bộ cây thư mục trên thì ta duyệt cây theo thứ tự nào?
3) Mô tả cách tính tổng kích thước cây thư mục?

Câu 1

+ “Phép đệ quy phản ánh chiến thuật “chia để trị” trong cách giải bài toán ” điều đó là đúng, nó thể
hiện ở chỗ: Để giải bài toán với số lượng dữ liệu đầu vào lớn, ta giải bài toán với số lượng dữ liệu đầu
vào nhỏ hơn, và nhỏ hơn nữa, cứ thế gọi đệ quy cho đến gọi đến trường hợp bài toán xảy ra suy biến
(trường hợp này bài toán được xử lý). Đây chính là tư tưởng của chiến thuật chia để trị (1 đ)

+ Ví dụ: (1 đ)

Chạy chậm một giải thuật đệ quy, ví dụ tính n ! :

Để tính n! Ta tính (n-1)!, .......(n-n+1) = 1! = 1.(vẽ hình minh họa)


Câu 2

+ Dạng cài đặt cây bằng cha của mỗi đỉnh: (1 đ)

Const n = <số các đỉnh tối đa trên cây>;


Type Node = Record
Info: Integer;
parent: 0..n;
End;
Tree = Array [1..n ] of Node;
Var T: Tree;

+ Tìm cha của đỉnh thứ k: (1 đ)

parent (T, k) := T[k].parent;

+ Tìm con cả của đỉnh thứ k trên cây T (1 đ)

Duyệt các đỉnh trên cây T, xuất phát từ đỉnh gốc(i:=1), kiểm tra xem cha của đỉnh i có = k
không, nếu = k, kết luận i là con cả, dừng giải thuật, nếu cha của i <>k thì duyệt đỉnh tiếp theo trên cây
T bằng cách cho i:= i+1. Lặp đi lặp lại phép duyệt các đỉnh trên T cho đến khi tìm thấy thì dừng (found
= true), hoặc duyệt hết các đỉnh trên T (i>n với n là số đỉnh trên cây) thì cũng dừng và kết luận không
tim thấy

Câu 3

+ Dạng cài đặt cây bằng con trưởng và em liền kề của mỗi đỉnh: (1 đ)

Type Tree = ^Nut;


Nut = record
Tenthumuc: string;
Kichco:integer;
EldestChild, Nextsibling:Tree;
End;
Var T: Tree;
+ Duyệt cây theo thứ tự sau để xác định tổng kích thước của cây thư mục (1 đ)

+ Mô tả cách tính tổng kích thước cây thư mục T trên: (1 đ)


-
Biến: tong:= 0; {tong lưu tổng kích thước toàn bộ cây thư mục}
-
Procedure postOder(T : tree, var tong:integer);
Var C: tree;
Begin
if (T=nil) then exit;
else
begin
C:=t^.eldestChild;
postOrder(C);
C:=C^.nextsibling;
While (C<>nil) do
Begin
postOrder(C);
C:= C^.nextsibling;
End;
Tong:=tong+T^.kichco;
end;
End;
Đề 4
Câu 1(2 điểm)
Trình bày các đặc điểm của giải thuật đệ quy. Hàm đệ quy (viết bằng ngôn ngữ pascal) dưới
đây cho kết quả là gì? Giải thích tại sao?
Function Tinh(n,x: byte): Longint;
Begin
If n = 1 then Tinh := x
Else Tinh := n* Tinh(n-1,x);
End;
Câu 2(4 điểm)
Giả sử một đơn vị cần quản lý các cán bộ, mỗi cán bộ cần quản lý các thuộc tính sau: Họ tên,
năm sinh, giới tính, địa chỉ, trình độ, chức danh . Anh(chị) hãy lựa chọn một cấu trúc dữ liệu để
quản lý các thông tin của các cán bộ trong đơn vị đó, sao cho:
- Dữ liệu được lưu trong bộ nhớ trong
- Thuận lợi cho các phép toán: thêm, xóa cán bộ
- Tiết kiệm không gian bộ nhớ nhất.
Với cấu trúc dữ liệu mà anh(chị) đã lựa chọn. Anh(chị) hãy:
1) Viết dạng cài đặt của cấu trúc dữ liệu đó
2) Viết giải thuật đếm số lượng cán bộ trong đơn vị
3) Hiển thị thông tin của các cán bộ trong đơn vị
4) Loại bỏ những người đến tuổi về hưu (biết rằng nam: 60 tuối; nữ: 55 tuổi thì về hưu)
Câu 3(2 điểm)
Nêu khái niệm danh sách? các cách cài đặt danh sách bởi mảng, bởi danh sách liên kết đơn?
ưu nhược điểm của từng dạng cài đặt?

Câu 1

+ Ba đặc điểm của giải thuật đệ quy: (1 đ)


-
Trong giải thuật đệ quy bao giờ cũng có lời gọi đến chính nó
-
Sau mỗi lời gọi đệ quy, kích thước của bài toán được thu nhỏ hơn trước
-
Có một trường hợp suy biến: bài toán được giải quyết theo một cách khác hẳn và
giải thuật cũng kết thúc

+ Kết quả của hàm đệ quy là: x*n!, vì: (1 đ)


n = 1 cho kết quả là: 1*x

n = 2 cho kết quả là: 1*2*x

n = 3 cho kết quả là: 1*2*3*x

..........

n = n cho kết quả là: 1*2*3*.......*n*x = n! * x

Câu 2

1) Cấu trúc dữ liệu lựa chọn là danh sách liên kết đơn (1 đ)

Dạng cài đặt


Type Canbo = record
Hoten: String;
Năm sinh : integer;
Giớitinh: boolean;
Diachi, trinhdo, chucdang: string;
` Next: ^ Canbo;
end;
List = ^Canbo;
Var L: List;

2) Đếm số lượng cán bộ trong trong danh sách (1 đ)

- Sử dụng biến đếm lưu số lượng cán bộ trong đơn vị, ban đầu dem:= 0 ,

- Sử dụng con trỏ phụ M duyệt từ đầu đến cuối danh sách, duyệt đến cán bộ nào thì tăng
biến đếm lên 1:

- In biến đếm ra màn hình

3) Hiển thị các cán bộ trong đơn vị: (1 đ)

Sử dụng con trỏ phụ M duyệt từ đầu đến cuối danh sách, duyệt đến cán bộ nào thì hiển
thị các thông tin của cán bộ đó lên màn hình:

4) Loại bỏ các cán bộ đến tuổi về hưu trong đơn vị: (1 đ)

Cách làm:

b1) Tìm cán bộ đầu tiên trong danh sách đến tuổi về hưu, giả sử vị trí được trỏ bởi p

b2) Loại bỏ cán bộ ở vị trí p


b3) Lặp đi lặp lại b1); b2) cho đến khi hết vị trí tìm thấy

Chú ý: - để tìm cán bộ thỏa mãn điều kiện ta duyệt từ đầu danh sách p:=L đến khi tìm thấy thì
dừng
-
để loại bỏ học sinh ở vị trí p:

a) Di chuyển con trỏ phụ M đến vị trí trước p:

 M:=L;

 While M^.next <>p do M:=M^.next;

b) Bứt liên kết, gắn liên kết, giải phóng p:

 M^.next:=p^.next;

 Dispose(p);

Câu 3

+ Danh sách là một cấu trúc dùng để lưu trữ một tập hợp hữu hạn biến động các phần tử thuộc
cùng một lớp đối tượng nào đó (0.5 đ)

+ Có thể cài đặt danh sách bởi mảng và bởi con trỏ, tương ứng ta có danh sách kế tiếp và danh
sách móc nối (danh sách liên kết). Các dạng cài đặt tương ứng:

Cài đặt bởi mảng: ( 0.5 đ)

Const n=maxlist;
Type list = record
Eles: array[1..n]of integer;
Count: 0..n;
end;
Var L: list;
Cài đặt bởi con trỏ: (0.5 đ)

type list=^nut;
nut = record
infor: item;
next:list;
end;
var l,f:pqueue;
+ Ví dụ để quản lý sinh viên, cán bộ ta có danh sách sinh viên, danh sách cán bộ….

Ưu nhược điểm của từng các cài đặt danh sách: (0.5 đ)
a) Danh sách cài bởi mảng
Ưu điểm
i. truy cấp đến các phần tử là trực tiếp do đó nhanh và đồng đều đối với mọi phần
tử
ii. Các thao tác thực hiện tương đối dễ dàng

Nhược điểm

iii. Có hiện tượng dư thừa bộ nhớ: Hiện tượng giữ chỗ để đấy mà không dùng tới
iv. Bị hạn chế bởi không gian kế tiếp trong bộ nhớ
v. Là cấu trúc dữ liệu tĩnh, bị giới hạn không gian bộ nhớ trong thanh ghi dữ liệu và
thanh ghi stack
vi. có hiện tượng co giãn, dịch chuyển các phần tử khi thực hiện thao tác bổ sung
phần tử, hoặc loại bỏ phần tử, do đó là số lượng phép tính trong giải thuật tăng=
> độ phức tạp tính toán cũnh tăng theo
b) Danh sách cài đặt bởi con trỏ
Ưu điểm:
-
Không gây hiện tượng lãng phí bộ nhớ (Hiện tượng giữ chỗ để đấy mà không
dùng đến như danh sách cài đặt bởi mảng)
-
Cấu trúc dữ liệu danh sách cài đặt bởi con trỏ còn gọi là cấu trúc dũ liệu động,
không gian bộ nhớ được cấp phát trong heap, do đó nó không bị giới hạn bởi kích
thước 64kb như đối với cấu trúc dữ liệu tĩnh
-
Các phần tử trong danh sách nằm ở những vị trí dải dác, do đó tận dụng được
những không gian trống này, mà không cần một vùng nhớ kế tiếp như cài đặt bởi
mảng
Nhược điểm:
-
Tốc độ truy cập đến các phần tử trong danh sách là chậm, không đồng đều đối với
mọi phần tử (truy cập tuần tự một chiều)
-
Từ phần tử trước không truy cập ngược lại phần tử đứng trước
-
mỗi phần tử trong danh sách tốn thêm một không gian là 4byte để lưu địa chỉ của
phàn tử đứng sau nó trong danh sách
Đề 5
Câu 1(2 điểm)
Trình bày các đặc điểm của giải thuật đệ quy. Giả sử a và b là những số nguyên dương, Q là
hàm số của a và b, được định nghĩa như sau:
0 nếu a<b
Q(a,b) = {
Q(a-b, b)+1 nếu a>=b
Hãy tính Q(2,3) và Q(14,3)
Câu 2(3 điểm)
Giả sử cần quản lý một danh sách các số nguyên. Hãy viết dạng cài đặt danh sách này bằng
mảng, với cấu trúc danh sách đã cài đặt, viết các chương trình con thực hiện các yêu cầu như
sau:
1) Tính trung bình cộng của các số lưu trong danh sách
2) Loại bỏ ra khỏi danh sách số 3 đầu tiên tìm thấy trong danh sách
3) Hiển thị danh sách lên màn hình
Câu 3(3 điểm)
Hãy vẽ cây nhị phân biểu diễn biểu thức toán học sau:
3*4+(12+b)/6
Từ cây biểu thức vừa dựng, anh (chị) hãy:
1) Viết dạng cài đặt cây bằng con trỏ,
2) Viết thủ tục duyệt cây theo thứ tự trước, sau
3) Viết biểu thức toán học trên dưới dạng tiền tố, hậu tố? nhận xét với kết quả duyệt cây theo
thứ tự trước, sau?

Câu 1

+ Ba đặc điểm của giải thuật đệ quy: (1 đ)


-
Trong giải thuật đệ quy bao giờ cũng có lời gọi đến chính nó
-
Sau mỗi lời gọi đệ quy, kích thước của bài toán được thu nhỏ hơn trước
-
Bao giờ cũng có một trường hợp suy biến (trường hợp đặc biệt để đãm bảo tính
dừng của giải thuật): bài toán được giải quyết theo một cách khác hẳn và giải
thuật cũng kết thúc

+ Tính : Q(2,3) =0; Q(14, 5) = 2 (1 đ)


Câu 2

+ Dạng cài đặt danh sách bởi mảng: (0.5 đ)

Const n=maxlist;
Type list = record
Ele: array[1..n]of integer;
Count: 0..n;
end;
Var L: list;
+ Các thủ tục tương ứng với các yêu cầu:

1) Tính trung bình cộng của các số lưu trong danh sách (0.5 đ)

function Trungbinh(l:list): integer;

var i, tam: integer;

Begin

for i:=1 to n do tam:= tam+L.Ele[i];

Trungbinh:=tam;

End;

2) Loại bỏ số 3 đầu tiên tìm thấy trong danh sách (1 đ)

procedure Loaibo(var L: list);


var k,i:integer; found: boolean;
Begin
found:= false;
k:=1;
while (not found)and(k<=L.count) do
if(L.Ele[k]=3) then
begin
for i:=k to L.count-1 do L.Ele[i]:=L.Ele[i+1];
L.count:= L.count -1;
end;
if (not found) then writeln(‘So 3 khong co trong danh sách để loại bỏ’);
End;

3) Hiển thị danh sách lên màn hình (1 đ)

procedure Hienthi(l:list);
var i: integer;

begin

writeln(‘Danh sách cac so nguyen la:’);

for i:=1 to l.count do write(l.Ele[i]:6);

end;
+
Câu 3

Dựng cây: (0.5 đ) * /

3 4 + 6

1) Dạng cài đặt: (0.5 đ) 12 b

Type Tree=^nut;
Nut= record
Info: string;
Left, right: Tree;
End;
Var T: Tree;
2) Các thủ tục duyệt cây theo thứ tự trước, sau:

Giả sử xét cây gốc T, các thủ tục duyệt cây T

 Thủ tục duyệt cây theo thứ tự trước: (0.5 đ)

Procedure Preorder(T: Tree);


Begin
Write(T^.info);
Preorder(T^.left);
Preorder(T^.right);
End;
 Thủ tục duyệt cây T theo thứ tự sau: (0.5 đ)

Procedure postorder(T: Tree);


Begin
Postorder(T^.left);
Postorder(T^.right);
Write(T^.info);
End;
2) Biểu thức tiền tố , hậu tố và nhận xét:

c) + Biểu thức tiền tố: (0.5 đ)


+*34/+12b6 => Biểu thức trùng với kết quả duyệt cây theo thứ tự trước

+ Biểu thức hậu tố: (0.5 đ)

34*+12b+6/ => Biểu thức trùng với kết quả duyệt cây theo thứ tự sau

Đề 6
Câu 1(2điểm)
Nêu khái niệm hàng đợi? các cách cài đặt hàng đợi bởi mảng, con trỏ? ưu nhược điểm của từng
dạng cài đặt?
Câu 2(5 điểm)
Giả sử ta cần quản lý một danh sách học sinh, mỗi học sinh gồm những thông tin sau: Họ tên,
Lớp, Điểm tổng kết, xếp loại học lực . Anh(chị) hãy:
1) Viết dạng cài đặt danh sách trên bằng danh sách liên kết kép.
2) Với cách cài đặt này, viết các chương trình con tương ứng với các yêu cầu sau:
a) Tạo danh sách có n học sinh, (n là số nguyên dương nhập từ bàn phím)
b) Đếm xem trong danh sách có bao nhiêu sinh viên học lớp “CĐ2C”.
c) Hãy xếp loại học lực cho các sinh viên trong danh sách theo các tiêu chí sau:
+ Nếu: Điểm tổng kết< 5: Xếp loại yếu
+ Nếu : 5 ≤ Điểm tổng kết ≤6: Xếp loại trung bình
+ Nếu : 6< Điểm tổng kết <8 : Xếp loại khá
+ Nếu : Điểm tổng kết ≥8: Xếp loại giỏi
d) Sắp sếp danh sách theo trường lớp tăng dần
e) In ra màn hình danh sách sinh viên theo từng lớp,
Câu 3(1 điểm)
Anh (Chị) hãy nêu một lớp bài toán ứng dụng mà sử dụng cấu trúc dữ liệu hàng đợi giúp việc
giải quyết yêu cầu bài toán được thuận lợi hơn? phân tích bài toán đã nêu để thể hiện rõ điều
đó?

Câu 1
-
Hàng đợi là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào hàng đợi được
thực hiện ở một đầu (đầu này được gọi là lối sau - Real), còn phép lấy một phần tử ra khỏi hàng
đợi được thực hiện ở đầu kia (lối trước - Front) (0.5 đ)
-
Hai phương pháp cài đặt hàng đợi:

Cài đặt bởi mảng: (0.5 đ)

const n=maxqueue;
type queue= record
ele:array[1..n]of item;
L,F,count:0..n;
end;
Ưu điểm:

- truy cập nhanh, trực tiếp đến mọi phần tử

- Các thao tác dễ thực hiện

Nhược điểm:
-
Gây hiện tượng lãng phí bộ nhớ, hiện tượng này còn được gọi là giữ chỗ để đấy
mà không dùng đến
-
Bị giới hạn bởi không gian trống kế tiếp trong bộ nhớ
-
Cấu trúc là cấu trúc tĩnh, không gian nhớ được cấp phát trong thanh ghi data, hoặc
thanh ghi stack

Cài đặt bởi con trỏ: (0.5 đ)

type pqueue=^nut;
nut= record
infor: item;
next:pqueue;
end;
var l,f:pqueue;
Ưu điểm:
-
không có hiện tựợng giữ chỗ để đấy nên không gây lãng phí bộ nhớ
-
Cấu trúc mang tính động, không gian nhớ cấp phát cho hàng đợi là không gian
động, được cấp phát trong heap
-
Không bị hạn chế bởi không gian trống kế tiép trong bộ nhớ, các phần tử trong
hàng đợi có thể nằm ở những vị trí khác nhau tong bộ nhớ, không nhất thiết phải
là những vị trí kế tiếp

Nhược điểm:
-
Mỗi nút trong hàng đợi tốn thêm một vùng nhớ chứa con trỏ

Ưu nhược điểm của từng dạng cài đặt: (0.5 đ)

:Câu 2

+ Dạng cài đặt: (0.5 đ)


Type Hocsinh = record
Hoten: String;
Lớp : String;
DiemTK: float;
xeploai: string;
` Lptr, Rptr: ^ Hocsinh;
end;
DoubleList = ^Hocsinh;
Var L, R: DoubleList;
+ Tạo danh sách gồm n học sinh: (1 đ)

procedure taoDS(var L,R:doublelist);

var M: doublelist;

begin

L:=R:=nil; {khoi tao danh sach rong}

write(’nhap so hoc sinh trong danh sách n= ’); readln(n);

for i:=1 to n do

begin

writeln(‘Nhap hoc sinh thu i : ’);

write(‘Nhạp ho ten: ’); readln(M^.Hoten);

write(‘Nhạp Lớp: ’); readln(M^.lop);

write(‘Nhạp Điem tong kết: ’); readln(M^.DiemTK);

insert(M,,L, R);

end;

end;

trong đó thủ tục insert(M,L,R): chèn học sinh được trỏ bởi M vào cuối danh sách:

procedure Insert(M: doublelist, Var L, R: DoubleList);

Var

Begin

if (L=nil)and(R=nil) then
begin

M^.Lptr:=nil; M^.Rptr:=nil;

L:=M; R:=M;

end

else

begin

R^.Rptr:=M; M^.Lptr:=R; M^.Rptr:=nil; R:=M;

end;

End;

+ Đếm xem có bao nhiêu học sinh học lớp “CD2C”: (1 đ)

- Sử dụng biến đếm, ban đầu = 0 , đếm số người học lớp “CD2C”

- Sử dụng con trỏ phụ M duyệt từ đầu đến cuối danh sách, sinh nào có: M^.lop =
“CD2C” thì tăng biến đếm lên 1:

- In biến đếm ra màn hình

+ Xếp loại học lực: (1 đ)


-
Sử dụng con trỏ p duyệt từ học sinh đầu tiên đến học sinh cuối cùng trong danh
sách. Duyệt đến học sinh nào thì xếp loại học lực cho học sinh đó theo tiêu chí đã
cho của đề bài sử dụngc câu lệnh if hoặc câu lệnh case .....of

+ Sắp xếp danh sách theo trường lớp tăng dần (1 đ)

Có thể sử dụng một trong các thuật toán sắp xếp để sắp xếp dữ liệu trên danh sách liên
kết, ở đây ta sử dụng giải thuật sắp xếp chọn trực tiếp (selection sort) và sử dụng cách tiếp
cận:giữ nguyên mối liên kết của các nút trong danh sách và hoán vị nội dung của các nút:
Giải thuật:
Procedure ListSelection_Sort(var L: List)
Var p, q, min: List;
Begin
p:=L;
While (p<>nil) do
Begin
q:=p^.next;
min:=p;
While (q<>nil) do
Begin
If (q^.infor<min^.infor) then min:=q;
q:=q^.next;
End;
Hoanvi(min^.infor,p^.infor);
P:=P^.next;
End;
End;

+ Hiển thị danh sách sinh viên theo từng lớp: Sử dụng con trỏ M duyệt tử đầu đến cuối danh
sách đã được sắp theo lớp ở câu 3, duyệt đến sinh viên nào thì hiển thị các thông tin về sinh viên đó:
(0.5 đ)
M: = L; p:=M;
writeln(‘Các sinh vien lop M^.lop la:’);
While (M<> nil) do
Begin
Write(M^. hoten);
Write(M^. Lop);
Write(M^. sbd);
P:=M;
M := M^.next;
If (M^.lop<>p^.lop) then writeln(‘Các sinh vien lop M^.lop la:’);
End;
Câu 3

- Bài toán tính biểu thức tiền tố, lưu vết đường đi trên đồ thị, khử đệ quy, ......
(0.5 đ)
- Phân tích bài toán : (0.5 đ)
Đề 7
Câu 1(1 điểm)
Nêu khái niệm đệ quy, giải thuật đệ quy, Cho ví dụ về một giải thuật đệ quy?
Câu 2(3 điểm)
Hàm Ackermann là hàm hai đối số với giá trị của đối số là số nguyên không âm. Nó được định
nghĩa như sau:
n+1 nếu m=0

Acker(m,n) = {
Acker(m-1,1) nếu m ≠ 0, n=0
Acker(m-1, Acker(m, n-1)) nếu m ≠ 0 và n ≠ 0
a) Hãy xác định xem ở đây “tiêu chuẩn gốc” (ứng với trường hợp suy biến) là gì?
b) Hãy tính Acker(1, 3), giải thích tại sao? .
c) Viết giải thuật để tính giá trị Acker(n,m), với m, n là các số nguyên được nhập từ bàn phím
Câu 3(4 điểm)
Học sinh khối 12 dự thi hết học kỳ các môn: toán, lý, hóa, ngoại ngữ. Mỗi thí sinh cần quản lý các
thông tin Số báo danh, họ tên, lớp
1. Hãy sử dụng cấu trúc dữ liệu danh sách liên kết đơn để lưu trữ các thông tin của các thí sinh
dự thi. Viết dạng cài đặt tương ứng của cấu trúc trên
2. Xây dựng các chương trình con thực hiện các nhiệm vụ sau:
- Nhập thông tin về các thí sinh dự thi (điều kiện dừng là nhập SBD = rỗng)
- Hiển thị các thí sinh dự thi theo lớp
- Loại bỏ các thí sinh có điểm trung bình < 5 ra khỏi danh sách (điểm trung bình =
(toan+ly+hoa+ngoaingu)/4)
- Tìm kiếm thí sinh theo số báo danh nhập vào

Câu 1

+ Đệ quy: Một đối tượng được gọi là đệ quy nếu nó bao gồm chính nó như là một bộ phận hoặc
nó được định nghĩa dưới dạng của chính nó (0.5 đ)

+ Giải thuật đệ quy: là giải thuật có chứa lời giải đệ quy. Lời giải đệ quy là lời giải của bài toán
T được thực hiện bởi lời giải của bài toán T’ có dạng như T (cỡ của T’< T). Ví dụ: Tính n!
(0.5 đ)

Câu 2

a) Tiêu chuẩn gốc ứng với trường hợp suy biến ở đây là m = 0, nếu m = 0 thì Acker(m,n) = n+1
(1 đ)
b) Ta có:

Acker (1,3) = Acker (0, Acker(1,2));

Acker (1,2) = Acker (0, Acker(1,1));

Acker (1,1) = Acker (0, Acker(1,0));

Acker (1,0) = Acker (0,1)=2;

Vậy => Acker (1,3) = 5 (1 đ)

c) Viết giải thuật để tính giá trị hàm Acker(m,n) (1 đ)

Function Acker(m,n: integer):integer;

Begin

If(m=0)then Acker:= n+1

Else

If(n=0)then Acker:=Acker(m-1,1)

Else Acker:= Acker(m-1, Acker(m,n-1));

End;

Câu 3

1) Dạng cài đặt danh sách: (0.5 đ)

Type Thisinh = Record


SDB, Hoten, Lop: String;
Toan, ly, hoa, ngoaingu: real;
End;
List = ^ node;
Node = Record
Info: Sinhvien;
Next: list;
End;
Var L: list

2) Các chương trình con

a) Nhập danh sách thí sinh (1 đ)

procedure taoDS(var l:list);


var M: hocsinh, SBD: string, i: integer;;
begin
write(’nhap so bao danh của hoc sinh dau tiên, SBD = ’); readln(SBD);
while SDB<>’’ do
begin
i:=1;
writeln(‘Nhap hoc sinh thu i : ’);
M^.info.SBD:=SBD;
write(‘Nhạp ho ten: ’); readln(M^.info.Hoten);
write(‘Nhạp Lớp: ’); readln(M^.info.lop);
write(‘Nhạp Điem toan: ’); readln(M^.info.toan);
write(‘Nhạp Điemly: ’); readln(M^.infor.ly);
write(‘Nhạp Điem hoa: ’); readln(M^.infor.hoa);
write(‘Nhạp Điem NgoaiNgu: ’); readln(M^.info.ngoaingu);
M^.next := L;
L:= M;
i:= i+1;
end;
end;
b) Sắp xếp thí sinh theo từng lớp, in danh sách sinh viên theo từng lớp: Tương tự ý c), d) câu 2 mã đề
01 (1 đ)

c) Loại bỏ tất cả các học sinh có điểm trung bình <5 ra khỏi danh sách, biết rằng điểm trung bình =
(toan + ly+ hoa+ ngoaingu)/4: (1 đ)

Cách làm: b1) Tìm học sinh đầu tiên trong danh sách có điểm trung bình <5, giả sử vị trí k

b2) Loại bỏ học sinh ở vị trí k

b3) Lặp đi lặp lại b1); b2) cho đến khi hết vị trí tìm thấy

Chú ý: - để tìm học sinh thỏa mãn điều kiện ta duyệt từ đầu danh sách k:=1 đến khi tìm thấy
thì dừng
-
để loại bỏ học sinh ở vị trí k, ta di chuyển con trỏ p đến vị trí k, q đến vị trí trước
K, thực hiện loại bỏ: q^.next:=p^.next; dispose(p);

d) tìm thí sinh theo số báo danh nhập vào: (0.5 đ)

- Nhập số báo danh cần tìm

- Duyệt từ đầu đến cuối danh sách mà vẫn không tìm thấy, hoặc duyệt đến khi tìm thấy thì
dừng. Duyệt đến thí sinh nào thì so sánh số báo danh của thí sinh đó với số báo danh cần tìm,
nếu bằng nhau thì kết luận tìm thấy, nếu không bằng nhau thì duyệt thí sinh tiếp theo trong danh
sách
Đề 8
Câu 1(2 điểm)
Cho biết số Fibinacci F11 = 89 và F12 = 144
a) Hãy tính F16 =?. Viết công thức dãy số Fibonacci
b) Viết một thủ tục không đệ quy (dùng phép lặp) để tính và in ra n số Fibonacci đầu tiêu?
Câu 2(5 điểm)
Giả sử ta cần quản lý một danh sách học sinh, mỗi học sinh gồm những thông tin sau: Họ tên,
Lớp, Điểm tổng kết . Hãy viết dạng cài đặt danh sách trên bằng mảng. Với cách cài đặt này, viết
chương trình con tương ứng với các yêu cầu sau:
1) Nhập danh sách gồm n sinh viên
2) Thêm vào danh sách một sinh viên mới có thông tin như sau vào vị trí thứ k:
Họ tên: Nguyen Van An
Lớp: TH2B
DiêmTK: 7.4
3) Sắp xếp học sinh theo từng lớp (trường lớp tăng dần)
4) In ra danh sách các học sinh theo từng lớp
5) Loại bỏ khỏi danh sách tất cả các sinh viên có điểm tổng kết <5
(n, k là một số nguyên dương nhập từ bàn phím)
Câu 3(1 điểm)
Với các yêu cầu cụ thể của bài toán quản lý danh sách ở câu 2.; Anh (Chị) hãy nêu ưu và nhược
điểm của cách cài đặt danh sách đã trình bày, đề xuất cách cài đặt khác hiệu quả hơn.

Câu 1

a) F 16 = 987, công thức dãy số Fiboncci là: (1 đ)

{
1 nếu n = 1 hoặc n = 2
F (n) = F(n-1)+F(n-2) nếu n>2

b) Procedure Fibonacci(n,F) (1 đ)

 {Tạo lập 2 số fibonacci đầu tiên}


F[1]: = 1; F[2] := 1;
 {tính lần lượt các số fibonacci tiếp theo}
for i :=3 to n do F[i] := F[i-1] + F[i-2];
 {In lần lượt n số fibonacci}
for i :=1 to n do write(F[i]);
Câu 2
+ Dạng cài đặt (0.5 đ)
const n=50;
type hocsinh = record
Hoten: string[27];
lớp: string;
DiemTk: real;
end;
list = record
Eles: array[1..n]of hocsinh;
count: 0..n;
end;
var L: list;
+ Tạo danh sách có n học sinh: (1 đ)

procedure taoDS(var l:list);


var M: hocsinh;
begin
write(’nhap so hoc sinh trong danh sách n= ’); readln(n);
for i:=1 to n do
begin
writeln(‘Nhap hoc sinh thu i : ’);
write(‘Nhạp ho ten: ’); readln(M.Hoten);
write(‘Nhạp Lớp: ’); readln(M.lop);
write(‘Nhạp Điem tong kết: ’); readln(M.DiemTK);
insert(M,i,L);
end;
end;
+ Thêm học sinh có : Họ tên:Nguyen Van An; Lớp:TH2B ; DiêmTK:7.4 vào sau vị trí k kể từ đầu
danh sách: (1 đ)

procedure insert (M: hocsinh, k: integer, var L: list);


var i: integer;
begin
i:=L.count;
while i>k do
begin
L.Eles[i]:=L.Eles[i-1];
i:=i-1;
end;
L.Eles[k]:= M;
L.count:=L.count +1;
end;
Chú ý: Trước khi gọi thủ tục có kiểm tra tính hợp lệ của k, đổ các thông tin của học sinh cần thêm vào
ô nhớ M
+ Sắp xếp sinh viên theo từng lớp, in danh sách sinh viên theo từng lớp: Tương tự ý c), d) câu 2 mã đề
01 (1,5 đ)

+ Loại bỏ tất cả các học sinh có điểm tổng kết <5 ra khỏi danh sách: (1 đ)

Cách làm: b1) Tìm học sinh đầu tiên trong danh sách có điểm tổng kết <5, giả sử vị trí k

b2) Loại bỏ học sinh ở vị trí k

b3) Lặp đi lặp lại b1); b2) cho đến khi hết vị trí tìm thấy

Chú ý: - để tìm học sinh thỏa mãn điều kiện ta duyệt từ đầu danh sách k:=1 đến khi tìm thấy thì
dừng

- để loại bỏ học sinh ở vị trí k, ta dồn các học sinh từ k+1 đến L.count lại 1 ô nhớ, giảm
count đi 1 đơn vị

Câu 3 (1 đ)

Ưu điểm: - Tốc độ truy cập đến các phần tử là nhanh (truy cập trực tiếp)

- Các thao tác thực hiện dễ dàng

Nhược điểm: - Lãng phí bộ nhớ (hiện tượng giữ chỗ để đấy mà không dùng đến)

- Có hiện tượng co giãn các phần tử khác khi thực hiện phép laọi bỏ là cho số lượng
phép tính trong giải thuật tăng lên => độ phức tạp tính toán cũng tăng theo,
-
Bị giới hạn bởi không gian trống kế tiếp trong bộ nhớ, là cấu trúc tĩnh

Đề xuất cấu trúc thích hợp hơn: Cấu trúc danh sách liên kết vì: khắc phục các hạn chế của danh sách
cài đặt như trên

Đề 9
Câu 1(2 điểm)
Thế nào là cấu trúc dữ liệu và giải thuật? Cấu trúc dữ liệu và giải thuật đóng vai trò như thế nào
trong quá trình giải quyết một bài toán tin học? Anh (Chị) hãy lấy một ví dụ minh họa cho điều
đó?
Câu 2(4 điểm)
Giải thuật tính ước số chung lớn nhất của hai số p, q (p>q) được mô tả như sau:
Gọi r là số dư trong phép chia p cho q:
- Nếu r = 0 thì q là ước số chung lớn nhất
- Nếu r ≠ 0 thì gán cho p giá trị của q, gán cho q giá trị của r rồi lặp lại quy trình trên.
a) Hãy lập bảng ghi nhận các giá trị của p, q, r trong quá trình thực hiện tính ước số chung lớn
nhất của hai số: 1260 và 198.
b) Hãy nêu lên tính đệ quy trong cách tính này từ đó xây dựng một cách tính đệ quy cho hàm
tính ước số chung lớn nhất: USCLN(p,q).
c) Viết một giải thuật đệ quy và một giải thuật không đệ quy (dùng phép lặp) để tính ước số
chung lớn nhất của p, q.
15 1
Câu 3 (2 điểm)
Cho một cây chứa các số nguyên như hình vẽ:
2 10 3 21 12 31 5
0 4

6 45 9 7
Anh (chị) hãy:
1) Cài đặt cây trên bằng phương pháp danh sách các con của mỗi đỉnh (viết dạng cài đặt, hình
ảnh cây trong bộ nhớ)
2) Dựng 1 cây nhị phân tìm kiếm có các khóa là các các số nguyên lưu tại các đỉnh của cây
trên, các đỉnh được nhập vào cây theo thứ tự được đánh số như trên
Câu 1

+ Giải thuật là một dãy các câu lệnh chặt chẽ và rõ ràng, xác định một dãy các thao tác trên một số đối
tượng nào(dữ liệu) đó sao cho sau một số hữu hạn bước thực hiện ta đạt được kết quả mong muốn
(0.5 đ)

+ Cách thức tổ chức biểu diễn dữ liệu mà theo đó dữ liệu được lưu trữ và được xử lý trong MTĐT,
được gọi là cấu trúc dữ liệu (0.5 đ)

+ CTDL & GT đóng vai trò quan trọng trong việc giải quyết một bài toán, ta thấy:

CTDL+GT= chương trình

=> muốn viết được chương trình tốt ta phải có cấu trúc dữ liệu tốt và giải thuật tốt, không có CTDL,
GT thì không có chương trình để giải quyết bài toán (0.5 đ)

+ Ví dụ: (0.5 đ)

Câu 2

a) Các giá trị của p, q, r được ghi nhận trong bảng sau: (1 đ)

p q r
1260 198 72
198 72 54
72 54 18
54 18 0
= > Vậy USCLN (1260, 198) = 18
b) (1 đ)
Ta thấy việc tính USCLN của p, q sẽ dẫn tới việc tính USCLN của q và r khi r ≠ 0 (q và r rõ
ràng là nhỏ hơn p và q), thể hiện tính đệ quy trong cách tính. Công thức đệ quy là

{
USCLN(p.q) = q , nếu p mod q = 0

UCLN(p, q mod p), nếu ngược lại


c) Giải thuật đệ quy (1 đ)

Function USCLN1(p,q)
1. if ((p mod q)=0) then USCLN1 := q
else USCLN1 := USCLN1(q, p mod q);

d) Giải thuật lặp (1 đ)

Function USCLN2(p,q)
{x,y,z ở đây là các biến cục bộ}
1. x :=p; y:= q;
2. repeat
z := x mod y;
x := y;
y := z;
until z = 0;
3. USCLN1 := x;
Câu 3
1) Cài đặt cây bằng danh sách các con của mỗi đỉnh (1 đ)

* Dạng cài đặt


Const n= 50;
Type Member = Record
Id: 0..n;
Next:^Member;
End;
Node = Record
Infor: Item;
Child: ^Member;
End;
Tree=Array[1..n] of Node;
Var T: Tree;
Trong đó:
Id: Lưu chỉ danh của đỉnh;
Item: kiểu dữ liệu của thông tin lưu tại đỉnh
10 21 12 31
* Hình ảnh cây trên trong MT với cách cài đặt trên:

infor Child 45
15
10
21
12
31
45
9
..
..
15

2) Dựng cây NPTK từ cây trên: (1 đ) 10 21

9 12 31
0
Đề 10
45
Câu 1(2điểm)
Nêu khái niệm danh sách, các cách cài đặt danh sách bởi mảng, bởi danh sách liên kết đơn, ưu
nhược điểm của từng dạng cài đặt?
Câu 2(4 điểm)
Học sinh khối 12 dự thi hết học kỳ các môn: toán, lý, hóa, ngoại ngữ. Mỗi thí sinh cần quản lý các
thông tin Số báo danh, họ tên, lớp
3. Hãy sử dụng cấu trúc dữ liệu danh sách liên kết đơn để lưu trữ các thông tin của các thí sinh
dự thi. Viết dạng cài đặt tương ứng của cấu trúc trên
4. Xây dựng các chương trình con thực hiện các nhiệm vụ sau:
- Nhập thông tin về các thí sinh dự thi (điều kiện dừng là nhập SBD = rỗng)
- Hiển thị các thí sinh dự thi theo lớp
- Loại bỏ các thí sinh có điểm trung bình < 5 ra khỏi danh sách (điểm trung bình =
(toan+ly+hoa+ngoaingu)/4)
- Tìm kiếm thí sinh theo số báo danh nhập vào
Câu 3 (2 điểm)
Người ta nói rằng ngăn xếp (stack) họat động theo nguyên tắc LIFO (Last In First Out) và hàng
đợi (queue) hoạt động theo nguyên tắc FIFO (First In First Out). Anh (chị) hiểu điều đó như thế
nào? Cho ví dụ minh họa?

Câu 1: Tương tự câu 3 đề 04

Câu 2

Tương tự câu 2 đề 07

Câu 3:
+ LIOF (last in first out): Phần tử vào sau cùng thì lấy ra xử lý trước tiên và ngược lại (0.5
đ)

+ FIFO (first in first out): Phần tử vào trước lấy ra xử lý trước và ngược lại (0.5 đ)

+ Ví du: (1 đ)

Ngăn xếp: Chồng đĩa đặt xuyên qua một cọc

Hàng đợi: Xếp hàng mua thực phẩm, ......

Đề 11
Câu 1(2 điểm)
Nêu khái niệm ngăn xếp và hàng đợi? Ngăn xếp và hàng đợi giống và khác nhau như thế nào?
Viết dạng cài đặt của ngăn xếp và hàng đợi bằng mảng. Hàng đợi tròn cài đặt bởi mảng khắc
phục hạn chế gì của hàng đợi không tròn cài đặt bởi mảng?
Câu 2(4 điểm)
Một tập S gồm 7 công việc (được đánh số từ 1 đến 7) với quan hệ “làm trước:> ” thỏa mãn các
điều kiện sau:
7<5 3<6 2<1 4<2
5<3 5<6 2<6
a) Hãy vẽ đồ thị biểu diễn S
b) Biểu diễn đồ thị bằng danh sách lân cận kề: Dạng cài đặt và hình ảnh đồ thị sau khi
biểu diễn.
c) Viết giải thuật duyệt đồ thị theo chiều rộng, chiều sâu xuất phát từ một đỉnh bất kỳ
trên đồ thị (đỉnh này được biết trước khi duyệt)?
Câu 3 (2 điểm)
Anh (chị) hãy nêu khái niệm cây nhị phân tìm kiếm(binary search tree)? Tại sao người ta lại nói
cây nhị phân tìm kiếm thuận lợi cho phép toán tìm kiếm, và các phép toán khác cần đến việc tìm kiệm
như: Thêm một đỉnh vào cây, loại một đỉnh ra khỏi cây, sửa đổi thông tin trên cây….? Anh(chị) hãy
phân tích để thể hiện rõ điều đó.

Câu 1

* Khái niệm ngăn xếp, hàng đợi: (0,5 đ)

- Ngăn xếp là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào ngăn xếp và phép loại
bỏ một phần tử ra khỏi ngăn xếp đều được thực hiện ở một đầu, đầu đó gọi là đỉnh của ngăn xếp
- Hàng đợi là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào hàng đợi được thực hiện
ở một đầu còn phép loại bỏ một phần tử ra khỏi hàng đợi được thực hiện ở đầu kia

* Sự giống và khác nhau giữa ngăn xếp và hàng đợi (0,5 đ)

+ Giống nhau:
-
Cũng là danh sách
-
Có hai phép toán cơ bản là bổ xung và loại bỏ (đều đóng vai trò là bộ nhớ đệm)

+ Khác nhau:

- Việc thêm vào, lấy ra một phần tử từ ngăn xếp đều được thực hiện ở một đầu, do đó
ngăn xếp hoạt động theo nguyên tắc LIFO, thích hợp với các ứng dụng có trình tự
truy xuất ngược với trình tự lưu trữ

- Việc thêm vào, lấy ra một phần tử từ hàng đợi được thực hiện ở hai đầu khác nhau,
do đó hàng đợi hoạt động theo nguyên tắc FIFO, thích hợp với các ứng dụng có trình
tự truy xuất và trình tự lưu trữ như nhau

* Dạng cài đặt ngăn xếp và hàng đợi bằng mảng: (0,5 đ)

+ Ngăn xếp:

Const n = 100;
Type Stack = Record
Ele: Array [1.. n ] of Item;
Top: 0..n;
End;
+ Hàng đợi:
Const n = 100;
Type Queue = Record
Ele: Array [1.. n ] of Item;
Front, Real: 0..n;
End;
Trong đó:
- Item: Là kiểu dữ liệu chứa trong hàng đợi hoặc ngăn xếp
- Top: Trỏ tới đỉnh ngăn xếp; Front, Real: Trỏ tới lối trước và lối sau của hàng đợi,
- Ele: Mảng chứa các phần tử có trong hàng đợi hoặc ngăn xếp
* Hàng đợi không tròn có hiện tượng khi thêm một phần tử và vào hàng đợi mà Real = n thì
không thêm được nữa, mặc dù lối trước có thể vẫn còn các ô nhớ trống. Hàng đợi tròn tận dụng tối đa
được không gian trống trong hàng khi thêm một phần tử và hàng, khắc phục hạn chế của hàng đợi
không tròn (0,5 đ)

Câu 2
a) Vẽ đồ thị biểu diễn S (1 đ)

1 2 3 5

4
6 7
b) Biểu diễn đồ thị bằng danh sách lân cận kề, hình ảnh đồ thị trong bộ nhớ (1 đ)

* Hình ảnh đồ thị trong bộ nhớ:

1 2
V[1]
2 4
V[2]
3 5
V[3]
4
V[4]
5 7
V[5]
6
V[6] 2 3 5
7
V[7]
* Dạng cài đặt:

const n = <số đỉnh tối đa trong đồ thị>;


Type Pointer = ^nut;
Nut = Record
Id: 0..n;
Next : Pointer;
End;
Graph = Pointer;

c) Các giải thuật duyệt : chiều sâu (1 đ), chiều rộng (1 đ)

Câu 3

* khái niệm cây nhị phân tìm kiếm (0.5 đ): Cây NPTK là một cây nhị phân thỏa mản 3 điều kiện:

Điều kiện 1: Khóa tại các đỉnh của cây con trái nhỏ hơn khóa tại gốc

Điều kiện 2: Khóa tại gốc > khóa tại các đỉnh của cây con bên phải

Điều kiện 3: Cây con bên trái và cây con bên phải đều là cây NPTK
* Cấu trúc cây NPTK trước hết thuận lợi chi phép toán tìm kiếm, độ phức tạp trong trường hợp xấu
nhất về mặt thời gian O(h), với h là chiều cao của cây. Từ đó kéo theo các phép toán khác cũng thuận
lợi như phép toán: Thêm, sửa, xóa, ..... (0.5 đ)

* Phân tích để thể hiện điều trên: Phân tích dựa vào độ phức tạp xâu nhất về mặt thời gian, với các
dạng tồn tại của cây NPTK như: Dạng cây suy biến, cây đầy đủ hoặc hoàn chỉnh, cây bình thường(1 đ)

Đề 12
Câu 1(2 điểm)

Nêu khái niệm cây nhị phân (binary tree)? Các cách cài đặt cây nhị phân? Ưu nhược điểm của
từng cách cài đặt.
Câu 2(4 điểm)

Cho một cây nhị phân tìm kiếm, các nút có khóa là các số nguyên. Hãy viết dạng cài đặt cây đã
cho bằng con trỏ, gốc của cây được trỏ bởi con trỏ R. Với dạng cài đặt này viết các thủ tục
tương ứng với các yêu cầu sau:

1) Tạo cây nhị phân tìm kiếm (Điều kiện dừng là nhập nút có giá trị là 0),

2) Cài đặt phép toàn tìm đỉnh có khóa x trên cây

3) Loại bỏ đỉnh có khóa x trên cây

4) Đếm số đỉnh hiện có trên cây


Câu 3 (2 điểm)

Cho biểu thức E = (2*x+y)*(5*a - b)3

a) Hãy vẽ cây nhị phân T biểu diễn biểu thức trung tố E như trên

b) Muốn có biểu thức dạng tiền tố, dạng hậu tố thì phải duyệt cây T theo thứ tự nào? Kết
quả duyệt?

Câu 1

* khái niệm cây nhị phân: (0.5 đ)

Cây nhị phân là một cây, trong đó số con tại mỗi đỉnh trên cây tối đa là 2 con và được sắp thành
cây con trái và cây con phải

* Có hai phương pháp cơ bản để cài đặt cây nhị phân:

a) Cài đặt cây nhị phân bằng mảng: (0.5 đ)


Const n = <số đỉnh tối đa trên cây> ;
Type Nut = Record
Infor: Integer;
Left, Right: 0 .. n;
End;
TreeBina = array[1..n] of Nut;
Var T : TreeBina;

b) Cài đặt cây nhị phân bởi con trỏ: (0.5 đ)

Type TreeBina = ^ Nut;


Nut = Record
Infor: Integer;
Left, Right: TreeBina;
End;
Var T : TreeBina;

* Ưu nhược điểm của từng dạng cài đặt: (0.5 đ)

a) Cài đặt bởi mảng:

Ưu điểm: - Các phép toán thực hiện tương đối dễ dàng

- việc truy cập đến các đỉnh trên cây là trực tiếp, tốc độ truy cập là nhanh và
đồng đều đối với mọi phần tử

Hạn chế: - Khi cài đặt gây hiện tựợng dư thừa bộ nhớ.....

b) Cài đặt bởi con trỏ

Ưu điểm: - Không có hiện tượng dư thừa bộ nhớ

Hạn chế: - Truy cập đến các phần tử trên cây là truy cập tuần tự, bao giờ cũng xuất phát từ
gốc, nên tốc đọ truy cập là chậm
-
.....

Câu 2

+ Dạng cài đặt cây NPTK sử dụng con trỏ: (0.5 đ)

Type TreeBSearch = ^Nut;


Nut = Record
Infor: Integer;
Left, Right: TreeBSearch;
End;
Var R : TreeBSearch;

+ Tạo cây nhị phân tìm kiếm: (1 đ)


-
Viết thủ tục thêm một đỉnh x vào cây R: Insert(x, R):

* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm

* Xin MT cấp phát ô nhớ cho M

* Đổ dữ liệu cần thêm vào ô nhớ có địa chỉ M

* Gắn M vào cây:

Nếu Cây rỗng (R = nil): R := M

Nếu cây không rỗng: Xác định vị trí thêm M:

If (x<R^.info) then Insert (x, R^.Left)

Else if (x>R^.info) then Insert(x, R^.right);

else thông báo x đã có trên cây


-
Trong khi điều kiện nhập chưa thỏa mãn tính dừng (x<>0):

 Nhập dữ liệu mới cần thêm x,

 Liên tiếp gọi thủ tục thêm đỉnh mới vào cây: Insert(x,R);

+ Tìm xem trên cây có đỉnh nào có thông tin = x không? (1 đ)


-
Nhập x
-
Sử dụng con trỏ phụ p duyệt bắt đầu từ gốc đến khi p = nil hoặc tìm thấy thì dừng:
Nếu p^.info = x => thông báo tìm thấy và dừng giải thuật, Nếu x< P^.Infor: Tìm
nhánh trái p => p := p^.left, ngược lại tìm nhánh phải P => p := p^.right

(Có thể viết giải thuật dưới dạng đệ quy)

+ Loại bỏ đỉnh có khóa x trên cây: (1 đ)

Cách làm:
-
Tìm x, p là con trỏ trỏ tới đỉnh có khóa x trên cây
-
Nếu đỉnh loại bỏ là lá (p^.left = nil; p^.right = nil): Dispose(p)
-
Nếu đỉnh loại bỏ có một con khác rỗng, một con = rỗng: Treo cây con khác rỗng
vào vị trí loại bỏ, giải phóng p
-
Nếu đỉnh loại bỏ có cả hai cây con đều khác rỗng: Treo cây con trái vào vị trí loại
bỏ, Treo cây con phải và vị trí trái nhất của cây con trái, giải phóng p

+ Đếm số đỉnh hiện có trên cây: (0.5 đ)

Cách làm: Có thể sử dụng một trong các phương pháp duyệt cây để đếm số đỉnh

Câu 3 *

a) Cây biểu thức: (1 đ)


+ *

* y * -

2 x - - * b

* b * b 5 a

b) 5 a 5 a

+ Duyệt cây biểu thức theo thứ tự trước => Kết quả là biểu thức tiền tố: *+*2xy**-*5ab-*5ab-
*5ab (0.5 đ)

+ Duyệt cây biểu thức theo thứ tự sau = > Kết quả là biểu thức hậu tố: 2x*y+*5a+-b5a*-b*5a*-
b** (0.5 đ)

Đề 13
Câu 1(2 điểm)
Nêu khái niệm cây? đường đi trên cây? chiều cao của cây? Hãy vẽ một cây và minh họa trên
cây đó. Viết dạng cài đặt cây bằng danh sách các con của mỗi đỉnh.
Câu 2(4 điểm)

Cho một cây nhị phân tìm kiếm lưu các sinh viên, mỗi nút trên cây lưu các thông tin của một
sinh viên, các thông tin cần quản lý của sinh viên: số báo danh(duy nhất cho mỗi sinh viên), họ
tên, lớp. Giả sử khóa của nút là trường số báo danh.
1. Hãy viết dạng cài đặt cây đã cho bằng con trỏ, gốc của cây được trỏ bởi con trỏ R.
2. Với dạng cài đặt trên viết các thủ tục tương ứng với các yêu cầu sau:
 Tạo cây nhị phân tìm kiếm có n đỉnh (n là số nguyên dương nhập từ bàn phím)
 Loại bỏ đỉnh khóa là x trên cây
 Cài đặt phép toán thêm đỉnh có khóa x
3. Anh(chị) hãy nêu cách tìm kiếm một sinh viên có trên cây hay không, nếu biết tên của sinh
viên mà không biết khóa(sbd) của sinh viên đó
Câu 3 (2 điểm)
Cho biểu thức E = (2*x+y)*(5*a - b)3
a) Hãy vẽ cây nhị phân T biểu diễn biểu thức trung tố E như trên
b) Muốn có biểu thức dạng tiền tố, dạng hậu tố thì phải duyệt cây T theo thứ tự nào? Kết quả
duyệt?

Câu 1

+ Khái niệm cây: Cây là một đồ thị vô hướng liên thông phi chu trình

+ Đường đi trên cây từ a1-> an là một dãy các đỉnh a 1, a2, a3, .....an-1, an, sao cho ai có quan hệ
với ai+1, i: 1->n-1

+ Chiều cao của cây bằng số mức lớn nhất của đỉnh có trên cây

Ví dụ:

+ Dạng cài đặt cây bằng danh sách các con của mỗi đỉnh:

Const n = <số các đỉnh tối đa trên cây>;


Type Pointer = ^ Member;
Member = Record
Id: 1..n;
Next : Pointer; // trỏ tới em liền kề
End;
Node = Record
Info: Integer;
Child: Pointer;
End;
Tree = Array [1..n ] of Node;
Var T: Tree;

Câu 2

1) Dạng cài đặt cây NPTK sử dụng con trỏ:


Type TreeBSearch = ^Nut;
Nut = Record
Infor: Integer;
Left, Right: TreeBSearch;
End;
Var R : TreeBSearch;

2)

+ Tạo cây nhị phân tìm kiếm:


-
Viết thủ tục thêm một đỉnh x vào cây R: Insert(x, R):

* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm

* Xin MT cấp phát ô nhớ cho M

* Đổ dữ liệu cần thêm vào ô nhớ có địa chỉ M

* Gắn M vào cây:

Nếu Cây rỗng (R = nil): R := M

Nếu cây không rỗng: Xác định vị trí thêm M:

If (x<R^.info) then Insert (x, R^.Left)

Else if (x>R^.info) then Insert(x, R^.right);

else thông báo x đã có trên cây


-
Trong khi điều kiện nhập chưa thỏa mãn tính dừng (số phần tử <n):

 Nhập dữ liệu mới cần thêm x,

 Liên tiếp gọi thủ tục thêm đỉnh mới vào cây: Insert(x,T);

+ Thủ tục loại bỏ đỉnh x ra khỏi cây sao cho cây sau khi laọi bỏ vẫn là cây NPTK:
-
Tìm xem x có trên cây không:?
-
Nếu không có thì thông báo và thoát khỏi chương trình
-
Nếu x có trên cây:

 Di con trỏ P đến vị trí loại bỏ

 Nếu p không có con: giải phóng p


 Nếu p có 1 cây con khác rỗng: treo cây con khác rỗng vào vị
trí loại bỏ, giải phóng p

 Nếu p có cả hai cây con khác rỗng: treo cây con trái vào vị trí
trái nhất của cây con phải, treo cây con phải vào vị trí loại bỏ,
giải phóng p

+ Viết thủ tục thêm một đỉnh x vào cây R: Insert(x, R):

* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm

* Xin MT cấp phát ô nhớ cho M

* Đổ dữ liệu cần thêm vào ô nhớ có địa chỉ M

* Gắn M vào cây:

Nếu Cây rỗng (R = nil): R := M

Nếu cây không rỗng: Xác định vị trí thêm M:

If (x<R^.info) then Insert (x, R^.Left)

Else if (x>R^.info) then Insert(x, R^.right);

else thông báo x đã có trên cây

3) Nêu cách tìm kiếm theo tên sv: Tìm kiếm tuần tự trên cây theo tên sv đã biết

Câu 3 *

a) Cây biểu thức:


+ *

* y * -

2 x - - * b

* b * b 5 a

5 a 5 a

b) + Duyệt cây biểu thức theo thứ tự trước => Kết quả là biểu thức tiền tố: *+*2xy**-*5ab-*5ab-
*5ab

+ Duyệt cây biểu thức theo thứ tự sau = > Kết quả là biểu thức hậu tố: 2x*y+*5a+-b5a*-b*5a*-
b**
Đề 14
Câu 1(2 điểm)
Nêu khái niệm cây? Viết dạng cài đặt cây bằng danh sách cha của mỗi đỉnh. Với cách cài đặt
này, viết thủ tục tìm cha của đỉnh thứ k trên cây (giả sử các đỉnh trên cây được đánh số theo một
thứ tự nào đó, k là số nguyên nhập từ bàn phím)
Câu 2(4 điểm)
Các phương pháp để định nghĩa một tập hợp. Giả sử cần quản lý các tập hợp A, B chứa các số
nguyên, các số nguyên này có giá trị thuộc đoạn [1..n] (n là một hằng số nào đó). Anh (chị) hãy:
1) Viết dạng cài đặt của tập hợp trên bởi véc tơ bít
2) Với dạng cài đặt trên, hãy viết các thủ tục tương ứng với các yêu cầu sau:
i. Nhập giá trị cho tập hợp A, B
ii. Tìm tập C = A∩B; C = AUB; C= A\B
iii. Xác định xem số nguyên x có thuộc tập A hay không?
iv. Thêm, loại bỏ số nguyên x vào, ra khỏi tập hợp
3) Anh(chị) hãy cho biết một tập hợp phải thỏa mãn điều kiện gì thì mới có thể cài đặt bằng
phương pháp vecto bít
Câu 3 (2 điểm)
Cho biểu thức E = (2*x+y)*(5*a - b)3
c) Hãy vẽ cây nhị phân T biểu diễn biểu thức trung tố E như trên
d) Muốn có biểu thức dạng tiền tố, dạng hậu tố thì phải duyệt cây T theo thứ tự nào? Kết
quả duyệt?

Câu 1

1) Khái niệm cây, cài đặt cây (1 đ)

+ Khái niệm cây: Cây là một đồ thị vô hướng liên thông phi chu trình

+ Cài đặt cây bằng danh sách cha của mỗi đỉnh:

Const n = <số đỉnh tối đa trên cây>;


Type Node = Record
Info: Item;
Parent: 0..n;
End;
Tree = array[1..n] of Node;
Var T: Tree;
Trong đó:
- Info: Chứa thông tin của đỉnh
- Item: Kiểu dữ liệu của dữ liệu lưu tại đỉnh của cây
2) Viết hàm tìm số thứ tự của đỉnh là cha của đỉnh thứ k trên cây T (1 đ)

Procedure Tim(k: byte; T: Tree):0..n;

Begin

Parent := T[k].parent;

End;

Câu 2

+ Có hai phương pháp để xác định một tập hợp trong toán học: (0.5 đ)

- Liệt kê tất cả các phần tử trong tập hợp (nếu tập hợp đó là hữu hạn)

- Nêu lên các đặc trưng chung của các phần tử trong tập hợp

1) Viết dạng cài đặt tập hợp bởi véc tơ bít: (0.5 đ)

const n = <số phần tử tối đa trong tập hợp>;


type set = array[1..n] of boolean;
var A, B: Set;
2) Viết các thủ tục tương ứng với các yêu cầu:

a) Nhập giá trị cho tập A, B: (0.5 đ)

procedure Nhap(var A: set);


var i: integer; c: char;
Begin
Writeln(‘Nhap giá trj cho các phần tử của tập hợp!’);
Repeat
Write(‘Nhap giá trị I = ’); readln(i);
A[i]:= true;
Write(‘Co nhap nua khong? (c/k)’); read(c);
Until (c=’k’)or(c=’K’);
End;
Gọi thủ tục nhập trên, đối số truyền vào là B, để nhập dữ liệu cho tập B

b)Tìm hợp, giao, trừ của hai tập hợp A,B (0.5 đ)

* giao của A và B

procedure Giao(A,B: set; var C: set);


var i: integer;
Begin
For i:=1 to n do
C[i]:= A[i] and B[i];
End;
* Tìm hợp của A và B:

procedure Hop(A,B: set; var C: set);


var i: integer;
Begin
For i:=1 to n do
C[i]:= A[i]or B[i];
End;
* Tìm hiệu A\B

procedure Hieu(A,B: set; var C: set);


var i: integer;
Begin
For i:=1 to n do
C[i]:= A[i] and notB[i];
End;
c) Tìm x trong tập A: Cách làm: kiểm tra xem a[x] = true hay false, nếu = true, kết luận tìm thấy,
ngược lại kết luận không tìm thấy (0.5 đ)

d) Thêm số nguyên x và tập hợp A: Đặt A[x]:= true; (0.5 đ)

e) Loại bỏ x ra khỏi tập hợp A: Đặt A[x]:= false; (0.5 đ)

3) Các phần tử trong tập hợp phải là các số nguyên hoặc được mã hóa bởi các số nguyên thì mới có thể
cài đặt tập hợp bởi véc tơ bít (0.5 đ)

Câu 3

Tương tự câu 3 đề 12

Đề 15
Câu 1(2 điểm)

Định nghĩa từ điển, tư tưởng của bảng băm mở. Viết dạng cài đặt từ điển bởi bảng băm mở. Với
dạng cài đặt này anh(chị) hãy cài đặt phép toán tìm xem trong từ điển T có chứa từ x hay
không? (x là một từ được nhập từ bàn phím)

Câu 2(3 điểm)

Giả sử cần quản lý một cây chứa các số nguyên. Hãy viết dạng cài đặt cây bằng mảng danh
sách các con của mỗi đỉnh. Hãy dựng một cây có 12 đỉnh và minh hoạ cách cài đặt trên bằng
hình ảnh cụ thể với cây vừa dựng. Nêu cách tạo một cây

Câu 3 (3 điểm)
Giả sử cần quản lý một danh sách các số nguyên. Hãy viết dạng cài đặt danh sách này bằng
mảng, với cấu trúc danh sách đã cài đặt, viết các chương trình con thực hiện các yêu cầu như
sau:

1) Tính trung bình cộng của các số dương lưu trong danh sách

2) Sắp xếp danh sách tăng dần

3) Hiển thị danh sách lên màn hình

Câu 1

1) Định nghĩa, tư tưởng, cài đặt (1 đ)

+ Định nghĩa từ điển:

Mô hình dữ liệu tập hợp, nhưng chi xét đến các phép toán thêm, xóa, tìm kiếm được gọi
là kiểu dữ liệu trừu tượng từ điển (dictionary).

+ Tư tưởng của bảng băm mở:


-
Phân chia tập hợp đã cho thành một số cố định các lớp(giả sử N lớp được đánh số
từ 0 -> N-1)
-
Sử dụng một mảng T có chỉ số chạy từ 0 đến N-1 để chứa các phần tử trong tập
hợp, mỗi thành phần T[i] là một “rổ” đựng các phần tử thuộc lớp thứ I, các phần
tư trong mỗi lớp được tổ chức thành một danh sách liên kết, T[i] là con trỏ trỏ tới
phần tử đầu tiên trong lớp thứ i. T chính là bảng băm mở

+ Cài đặt từ điển bởi bảng băm mở:

const N= ..
Type pointer = ^ ele;
Ele= Record
Key: keytype;
Next: pointer;
End;
Dictionary = array[0..N-1] of pointer;
Var T: Dictionary;

2) + Tìm xem trong từ điển T có chứa từ có khóa là x hay không? (1 đ)

Fuction member(x: keytype; T: dictionary): boolean;


Var p: pointer; found: boolean;
Begin
P:= T[h(x)];
Found:= false;
While p<>nil do
If p^.key=x then found:= true
Else p:=p^.next;
Member:= found;
End;
Câu 2

+ Dạng cài đặt cây bằng danh sách các con của mỗi đỉnh: (1 đ)

Const n = <số các đỉnh tối đa trên cây>;


Type Pointer = ^ Member;
Member = Record
Id: 1..n;
Next : Pointer; // trỏ tới em liền kề
End;
Node = Record
Info: Integer;
Child: Pointer;
End;
Tree = Array [1..n ] of Node;
Var T: Tree;

+ Dựng cây có 12 đỉnh và minh họa cách cài đặt trên bằng hình ảnh cụ thể với cây vừa dựng
(1 đ)

+ Nêu cách tạo cây: (1 đ)

b1) Nhập gốc cây, lưu vào hàng đợi

b2) Lấy một đỉnh từ hàng đợi ra, nhập các con của nó, mỗi khi nhập một con, lại đưa
con đó vào hàng đợi

b3) lặp đi lặp lại b2) cho đến khi hàng đợi rỗng. Ta thu được cây cần tạo

Đề 16
Câu 1(3 điểm)

Tác dụng của hàm băm trong việc tạo một từ điển cài đặt bởi bảng băm, các tiêu chuẩn để lựa
chọn một hàm băm. Trình bày các phương pháp băm gấp, băm cắt bỏ, băm lấy phần dư. Cho ví
dụ minh họa.
Câu 2(5 điểm) 25
Cho một cây nhị phân tìm kiếm có các khóa là các số nguyên như hình vẽ. 20 39

15 21 30 40
Anh (chị) hãy:
1) Tạo cây 31 35

2) Viết dạng cài đặt cây trên bằng con trỏ. Root là con trỏ trỏ tới gốc của cây
3) Tìm đỉnh có khóa x trên cây
4) Nêu phương pháp để loại bỏ một đỉnh x = 39 trên cây, sao cho cây sau khi loại bỏ
đỉnh đó vẫn là cây nhị phân tìm kiếm
5) Hủy cây

Câu 1

+ Tác dụng của hàm băm h(hash function) : Phân chia các phần tử của tập hợp vào trong các lớp. Nếu x
là giá trị khóa của môt phần tử nào đó của tập hợp thì h(x) là chỉ số nào đó của mảng T, h(x) được gọi
là giá trị băm của x, ta nói x thuộc lớp h(x); (1 đ)

+ Các tiêu chuẩn để lựa chọn một hàm băm: (0.5 đ)


-
Hàm băm phải cho phép tính được dễ dàng và nhanh chóng giá trị băm của mỗi
khóa
-
Phân bố đều các khóa vào các lớp

+ Một số phương pháp băm:

phương pháp băm gấp: (0.5 đ)

Giả sử khóa là số nguyên, ta phân chia khóa thành một số phần, sau đoa kết hợp các phần lại bằng
một phương pháp nào đó(có thể dùng phép cộng hoặc phép nhân) để nhận được giá trị băm

Ví dụ: Nếu khóa là số nguyên gồm 10 chữ số, N= 1000, ta phân thành các nhóm 3,3,2,2 chữ số từ
bên trái và công các nhòm lại, sau đó cắt cụt nếu cần thiết, ta sẽ nhận được giá trị băm 1229876087
được biến đổi thành: 122+987+60+87=1256, do ó ta có giá trị băm là: 256

Phương pháp băm cắt bỏ: (0.5 đ)

Giả sử khóa là số nguyên (nếu khóa không là số nguyên ta xét đến mã của chúng). Ta sẽ bỏ đi một
phần nào đó của khóa và lấy phần còn lại làm giá trị băm của khóa
Ví dụ:: Nếu khóa là số nguyên gồm 10 chữ số, N= 1000, ta lấy các chữ số thứ nhất, thứ 3, thứ 6
làm giá trị băm, giả sử khóa x= 1229876087 ta có h(x) = 126 là giá trị băm

Phương pháp băm lấy phần dư(0.5 đ)

Giả sử khóa là số nguyên, và giả sử ta muốn chia tập hợp các khóa thành N lớp. Ta chia khóa cho
N, rồi lấy phần dư làm giá trị băm.

Ví dụ: Viết một hàm băm để băm các khóa là các xâu ký tự có độ dài 10 thành các giá trị từ 0 đến
N-1

Type keytype= string[10];


Function h(x: keytype): 0..N-1;
Var I,sum:integer;
Begin
Sum:=0;
For i:=1 to 10 do Sum:=Sum+ord(x[i]);
H:= Sum mod N;
End;
Câu 2

+ Dạng cài đặt cây: (1 đ)

Type TreeBSearch = ^Nut;


Nut = Record
Infor: Integer;
Left, Right: TreeBSearch;
End;
Var T : TreeBSearch;

1) Tạo cây nhị phân tìm kiếm: (1 đ)


-
Viết thủ tục thêm một đỉnh x vào cây T: Insert(x, T):

* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm

* Xin MT cấp phát ô nhớ cho M

* Đổ dữ liệu cần thêm vào ô nhớ có địa chỉ M

* Gắn M vào cây:

Nếu Cây rỗng (T = nil): T := M

Nếu cây không rỗng: Xác định vị trí thêm M:

If (x<T^.info) then Insert (x, T^.Left)


Else if (x>T^.info) then Insert(x, T^.right);

else thông báo x đã có trên cây


-
Trong khi điều kiện nhập chưa thỏa mãn tính dừng (x<>0):

 Nhập dữ liệu mới cần thêm x,

 Liên tiếp gọi thủ tục thêm đỉnh mới vào cây: Insert(x,T);

2) Tìm xem trên cây T có nút chứa thông tin = x không: Search(x, T) (1 đ)
-
Nhâp x =?
-
Nếu cây rỗng (T = nil): Thông báo không tìm thấy
-
Nếu cây không rỗng:

a) Sử dụng con trỏ phụ M di chuyển đến các đỉnh trên cây bắt đầu từ gốc:

b) Nếu M^.info = x: thông báo tìm thấy(found := true), thoát

c) Nếu (x<M^.info) thì tìm x trên cây con trái của M: M := M^.Left, ngược lại
tìm x trên cây con phải của M : M := M^.Right;

d) Phép di chuyển M kết thúc khi m = nil(duyệt hết cây mà vẫn không thấy)
hoặc found = true (tìm thấy) thì dừng

3) Thủ tục loại bỏ đỉnh x = 39 ra khỏi cây sao cho cây sau khi laọi bỏ vẫn là cây NPTK: (1 đ)
-
Tìm xem x có trên cây không:?
-
Nếu không có thì thông báo và thoát khỏi chương trình
-
Nếu x có trên cây:

 Di con trỏ P đến vị trí loại bỏ

 Nếu p không có con: giải phóng p

 Nếu p có 1 cây con khác rỗng: treo cây con khác rỗng vào vị
trí loại bỏ, giải phóng p

 Nếu p có cả hai cây con khác rỗng: treo cây con trái vào vị trí
trái nhất của cây con phải, treo cây con phải vào vị trí loại bỏ,
giải phóng p
5) Hủy cây: Duyệt cây theo thứ tự sau để hủy các đỉnh có trên cây, Duyệt đến đỉnh nào gọi thủ tục loại
bỏ đỉnh đó (1 đ)

Đề 17
Câu 1(3 điểm)

Trình bày một phương pháp cài đặt cây nhị phân tìm kiếm. Dựng một cây nhị phân tìm kiếm có
13 nút, các đỉnh nhận giá trị là các số chẵn 2, 4, 6, … Viết thuật toán thêm một đỉnh mới x = 13
vào cây nhị phân tìm kiếm với cách cài đặt trên và minh hoạ trên cây vừa dựng. Kết quả của
từng phép duỵệt cây theo thứ tự trước, giữa, sau

Câu 2(3 điểm)

Anh (chi) hãy viết dạng cài đặt từ điển bởi bảng băm đóng. Nếu thêm một từ vào từ điển cài đặt
bởi bảng băm đóng thì khi nào xảy ra hiện tượng đụng khóa, ví dụ minh họa. Khi nào cần băm
lại, Hãy trình bày các phương pháp băm lại.

Câu 3 (2 điểm)

Nêu các cách cài đặt danh sách? viết dạng cài đặt tương ứng? ưu nhược điểm của từng cách cài
đặt.

Câu 1

+ Có thể cài đặt cây NPTK bởi con trỏ như sau: (0.5 đ)

Dạng cài đặt cây:

Type TreeBSearch = ^Nut;


Nut = Record
Infor: Integer;
Left, Right: TreeBSearch;
End;
Var T : TreeBSearch;

+ Dựng một cây NPTK có 13 nút, lưu các số nguyên chẵn, cây sau khi thêm đỉnh 13 như hình vẽ:
(0.5 đ)

+ Thủ tục thêm đỉnh x= 13 vào cây T: Insert(x, T): (1 đ)

* Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm

* Xin MT cấp phát ô nhớ cho M


* Đổ dữ liệu cần thêm vào ô nhớ có địa chỉ M
26
* Gắn M vào cây:

Nếu Cây rỗng (T = nil): T := M 14 40


Nếu cây không rỗng: Xác định vị trí thêm M:
8 16 36 42
If (x<T^.info) then Insert (x, T^.Left)

Else if (x>T^.info) then Insert(x, T^.right); 2 10 32 38

else thông báo x đã có trên cây


13 30 34
+ Kết quả duyệt cây theo thứ tự trước, giữa, sau: (1 đ)
-
Trước: 26 14 8 2 10 13 16 40 36 32 30 34 28 42
-
Giữa: 2 8 10 13 14 16 26 30 32 34 36 38 40 42
-
Sau: 2 13 10 8 16 14 30 34 32 38 36 42 40 26

Câu 2

+ Dạng cài đặt từ điển bởi bảng băm đóng: (0.5 đ)

type Dictionary = array[0..N-1] of keytype;

var T: dictionary;

+ Đụng khóa, giải quyết đụng khóa(1 đ)

- Dụng khóa xảy ra khi thêm một phần tử vào từ điển: Giả sử muồn thêm phần tử có khóa x và từ điển
T, ta muốn đặt khóa x vào thành phần T[h(x)] của mảng, như ở vị trí đó đã lưu giữ một giá trị khóa
khác, hoàn cảnh này còn gọi là sự va chạm (đụng khóa)

Ví dụ: N=10, các khóa a,b,c,d,e có các giá trị băm như sau: h(a)=7, h(b)=1, h(c)=4, h(d)=3, h(e)=3, Giả
sử ban đầu bảng rỗng, tức là tất cả các thành phần của bảng đều chứa giá trị rỗng.ta đưa lần lượt các giá
trị khóa a,b,c,d,e vào bảng, khi đó a,b,c,d lần lượt được đặt vào vị trí 7,1,4,3. Vì h(e)=3,ta tìm đến vị trí
thứ 3 của mảng, ta thấy vị trí này đã chứa d => xẩy ra hiện tượng đụng khóa khi thêm e vào bảng.

- Khi xảy ra hiện tượng đụng khóa ta cần băm lại: ta lần lượt xét các vị trí h1(x), h2(x),…..hi(x) – băm
lại lần thứ i cho đến khi nào tìm thấy vị trí trống để đặt x vào. Nếu không tìm được vị trí trống, ta nói
bảng đã đầy không thể thêm x được nữa ,

+ Một số phương pháp băm lại: (1.5 đ)

a) Băm lại tuyến tính


Các hàm hi(x) được xác định như sau:

hi(x) = (h(x) = i) mod N

Tức ta xem mảng là mảng vòng tròn và lần lượt xét đến các vị trí h(x)+1, h(x)+2, ……

b) Băm lại bình phương

hi(x) = (h(x) + i2) mod N

Câu 3

Tương tự câu 3 mã đề 04

Đề 18
Câu 1(3 điểm)

Tác dụng của hàm băm trong việc tạo một từ điển cài đặt bởi bảng băm, các tiêu chuẩn để lựa
chọn một hàm băm. Trình bày các phương pháp băm gấp, băm cắt bỏ, băm lấy phần dư. Cho ví
dụ minh họa.

Câu 2(3 điểm)


Viết dạng cài đặt cây nhị phân bằng mảng các nút. Với cách cài đặt này, viết các giải thuật
duyệt cây theo thứ tự trước, giữa, sau. Nêu ưu nhược điểm của cách cài đặt này?

Câu 3 (2điểm)

Vẽ cây nhị phân biểu diễn các biểu thức sau đây và viết chúng dưới dạng tiền tố, hậu tố

a) A/(B+C)+D*E-A*C
b) (x1 ^x2)v(x1^x2); với ^ là phép và(AND); v là phép hoặc (OR)

Câu 1

Tương tự câu 3 đề 16

Câu 2

+ Cài đặt cây nhị phân bằng mảng các nút: (0.5 đ)

Const n = <số đỉnh tối đa trên cây> ;


Type Nut = Record
Infor: Integer;
Left, Right: 0 .. n;
End;
TreeBina = array[1..n] of Nut;
Var T : TreeBina;

+ Giải thuật duyệt cây theo thứ tự trước: (0.5 đ)

PreOrder(T):

1) Visit (T);
2) preOrder(T.Left);
3) preOrder (T, Right);

+ Giải thuật duyệt cây theo thứ tự giữa (0.5 đ)

InOrder(T):
InOrder(T.Left);
Visit (T);
InOrder (T, Right);

+ Giải thuật duyệt cây theo thứ tự sau: (0.5 đ)

postOrder(T):
InOrder(T.Left);
InOrder (T, Right);
Visit (T);

+ Ưu nhược điểm của cây NP cài đặt bởi mảng (1 đ)

Ưu điểm:
-
Truy cập đến các nút là trực tiếp, do đó tốc độ truy cập là nhanh
-
Dễ thực hiện các thao tác

Nhược điểm:
-
Tốn bộ nhớ khi cài đặt, vì có hiện tượng giữ chỗ để đấy mà không dùng đến
-
bị quy định bởi không gian nhớ kế tiếp của mảng

Câu 3
/
a) (1 đ)

/ -
Biểu thức tiền tố: //A+bc-d*ef
A + D *
Biểu thức hậu tố: Abc+/def*-/

B C E F

b) (1 đ) v

^ ^
Biểu thức tiền tố: v^x1x2^x1x2

Biểu thức hậu tố: x1x2^x1x2^v x1 x2 x1 x2

Đề 19
Câu 1(4 điểm)
Xây dựng một cấu trúc dữ liệu thích hợp để biễu diễn đa thức P(x) có dạng :
P(x) = c1xn1 + c2xn2 +...+ck xnk
Biết rằng:
1) Các thao tác xử lý trên đa thức bao gồm :
+ Thêm một phần tử vào cuối đa thức
+ In danh sách các phần tử trong đa thức theo: - thứ
tự nhập vào
- ngược với thứ tự nhập vào
+ Hủy một phần tử bất kỳ trong đa thức
2) Số lượng các phần tử không hạn chế
3) Chỉ có nhu cầu xử lý đa thức trong bộ nhớ chính.
a) Giải thích lý do chọn CTDL đã định nghĩa.
b) Viết chương trình con ước lượng giá trị của đa thức P(x) khi biết x.
c) Viết chương trình con rút gọn biểu thức (gộp các phần tử cùng số mũ)
Câu 2 (4 điểm)
Cho một cây nhị phân tìm kiếm có các khóa là các số nguyên như hình vẽ.
25
20 39

15 21 30 40

Anh (chị) hãy: 31 35


6) Viết dạng cài đặt cây trên bằng con trỏ. Root là con trỏ trỏ tới gốc của cây
7) Tìm đỉnh có khóa x trên cây
8) Nêu phương pháp để loại bỏ một đỉnh x = 39 trên cây, sao cho cây sau khi loại bỏ
đỉnh đó vẫn là cây nhị phân tìm kiếm
9) Hiển thị cây
10) Hủy cây

Câu 1

1) Lựa chọn cấu trúc, giải thích (1 đ)

+ Biểu diễn đa thức bằng danh sách liên kết đơn, một đa thức là một danh sách liên kết

.Mỗi nút trong danh sách là một bản ghi gồm hai trường: heso: lưu hệ số, trường somu: lưu số mũ

+ Chọn cấu trúc danh sách liên kết vì nó phù hợp với các thao tác yêu cầu từ 1->3

+Tính giá trị đa thức (1.5 đ)


-
viết hàm tính lũy thừa:
-
Nhập x;
-
pow(x,n): hàm này cho kết quả là xn

function pow(x,n:integer): longint;

var i: integer; tam:longint;

begin

tam:=x;

for i:=2 to n do tam:=tam*x

end;
-
Duyệt từ đầu đến cuối đa thức để tính giá trị của đa thức, giá trị này = kq

p:=L; {L: là con trỏ trỏ tới đầu danh sách biểu diễn đa thức}

while p<>nil do

begin

kq:=kq+q^.heso*pow(x,q^.somu);

p:=p&.next;

end;

+ Rút gọn đa thức: (1.5 đ)


-
Sắp xếp danh sách giảm dần theo số mũ
-
duyệt từ đầu đến cuối danh sách biểu diễn đa thức, xét 2 nút kế tiếp trong danh
sách,:

a) nếu 2 nút nào có cùng số mũ thì cộng hệ số lại, lưu vào biến tong, nếu
tong=0, thì loại bỏ 2 nút đó và duyệt tiếp, nêu tong <>0, tạo ra một nút mới,
hệ số của nút này = tong, số mũ = số mụ của 1 trong 2 nút đó, loại bỏ hai nút
này khỏi danh sách, gắn nút mới vào vị trí loại bỏ, duyệt tiếp danh sách

b) Nếu chúng có số mũ khác nhau thì duyệt tiếp

Câu 2:

Tương tự câu 2 đề 16

Đề 20
Câu 1(1 điểm)

Anh (Chị) hãy nêu một vài cấu trúc dữ liệu mà anh(chị) đã được học và tự nghiên cứu. Cài đặt
các cấu trúc đó trên máy tính.

Câu 2 (3 điểm)

Hãy cho biết nội dung của stack sau mỗi thao tác trong dãy :

EAS*Y**QUE***ST***I*ON

Với một chữ cái tượng trưng cho thao tác thêm chữ cái tương ứng vào stack,
dấu * tượng trưng cho thao tác lấy nội dung một phần tử trong stack in lên màn hình.

Hãy cho biết sau khi hoàn tất chuỗi thao tác, những gì xuất hiện trên màn hình?
Viết các chương trình con thêm một ký tự vào ngăn xếp, lấy một ký tự từ ngăn xếp ra để hiển
thị lên màn hình
Câu 3 (4 điểm)
Cho biểu thức trung tố sau:
E = a-b*(c+e)/15.
Hãy trình bày phương pháp để chuyển một biểu thức trung tố sang hậu tố, có sử dụng đến cấu
trúc ngăn xếp. Minh họa cụ thể trên biểu thức đã cho. Viết giải thuật tương ứng
Câu 1 (1đ)

+ Một số cấu trúc dữ liệu như: mảng, bản ghi, tệp tin, danh sách, …..

+ Cài đặt:

Câu 2

+ Nội dung của ngăn xếp sau khi thực hiện các thao tác là: ON (1 đ)

+ Kết qua trên màn hình sau khi thực hiện các thao tác là: SYAEUQTSEI (1 đ)

+ Các thủ tục: thêm, lấy một phần tử ra khỏi ngăn xếp (1 đ)

Câu 3

1) Phương pháp chuyển một biểu thức trung tố sang hậu tố: (1,5 đ)

* Sử dụng ngăn xếp Sđể lưu các dấu mở ngoặc, các dấu phép toán, và dấu /. Ta đưa ký hiệu $ để đánh
dấu đáy của ngăn xếp. Khi đỉnh của ngăn xếp chứa $, có nghĩa là ngăn xếp rỗng

* Trên tập các ký hiệu S, (, +, -, *, / ta xác định hàm ưu tiên Pri như sau:

Pri($)<Pri(()<Pri(+)=Pri(-)<Pri(*)=Pri(/)

* Giả sử cần chuyển biểu thức rung tố E sang biểu thức hậu tố E1, ta thêm vào bên phải E dấu # để
đánh dấu hết biẻu thức E. Cách chuyển E sang E1 như sau:

1. Đọc một thành phần của biểu thức E, lưu vào x (đọc lần lượt từ trái qua phải)

1.1 Nếu x là toán hạng, thì viết nó vào bên phải E1

1.2 Nếu x là dấu (thì đẩy nó vào ngăn xếp

1.3 Nếu x là một trong các dấu phép toán +, -, *, / thì:

a) Xét phần tử y ở đỉnh ngăn xếp

b) Nếu Pri(y)>= Pri(x) thì loại y khỏi ngăn xếp, viết y vào bên phải E1 và quay lại bước
a)

c) Nếu Pri(y)<Pri(x) thì đẩy x vào ngăn xếp

1.4 nếu x là dấu) thì:

a) Xét phần tử y ở đỉnh ngăn xếp

b) Nếu y là dấu phép toán thì loại y khỏi ngăn xếp, viết y vào bên phải E1 và quay lại a)
c) Nếu y là dấu (thì loại nó khỏi ngăn xếp

2. Lặp lại bước 1 cho tới khi toàn bộ biểu thức E được đọc qua

3. Loại phần tử ở đỉnh ngăn xếp và viết nó vào bên phải E1. Lặp lại bước này cho đến khi ngăn
xếp rỗng

2. Minh họa cụ thể trên biểu thức đã cho (1 đ)

Thành phần trong biểu thức E Ngăn xếp Biểu thức e1


$
a $ a
- $- a
b $- ab
* $-* ab
( $-*( ab
c $-*( abc
+ $-*(+ abc
e $-*(+ abce
) $-*( abce+
$-* abce+
/ $-* abce+
$- abce+*
15 $-/ abce+*15
$-/ abce+15/
$- Abce+*15/
$ abce+*15/-
3. Phác thảo giải thuật chuyển E thành E1 (1 đ)

Áp dụng ý 1 phác thảo giải thuật tương ứng

Đề 21
Câu 1(2 điểm)
Khái niệm ngăn xếp, hàng đợi, các cách cài đặt.
Câu 2 (3 điểm)
Cho một stack S, được cài đặt bởi mảng một chiều S có n = 6 phần tử, Top chứa chỉ số ở đỉnh
ngăn xếp. Thoạt đầu stack rỗng (Top=0). Anh(chị) hãy:
1) Viết dạng cài đặt của ngăn xếp
2) Hãy xác định kết quả cuỗi cùng khi thực hiện các phép tính sau? Giải thích:
a:= 2; b:= 5;
PUSH (a, S); PUSH (4, S); PUSH (b+2, S);
PUSH (9, S); PUSH (a+b, S);
while (Top<>0) do
begin
Pop (x, Top); Write(x);
end;
Biết rằng:
PUSH (n, S): Ứng với thao tác đẩy phần tử n vào ngăn xếp S
Pop (n, S): Ứng với thao tác lấy phần tử trong ngăn xếp S ra và lưu vào biến n
3) Anh(chị) hãy viết thủ tục PUSH, Pop tương ứng ở trên
Câu 3 (3 điểm)
1) Hãy cho biết nội dung của hàng đợi sau mỗi thao tác trong dãy :
EAS*Y**QUE***ST***I*ON
Với một chữ cái tượng trưng cho thao tác thêm chữ cái tương ứng vào hàng đợi,
dấu * tượng trưng cho thao tác lấy nội dung một phần tử trong hàng đợi in lên
màn hình.
2) Hãy cho biết sau khi hoàn tất chuỗi thao tác trên, những gì xuất hiện trên màn hình?
3) Viết dạng cài đặt hàng đợi trên bởi mảng
4) Với cách cài đặt trên, hãy viết thủ tục thêm một ký tự vào hàng đợi, lấy một ký tự ra từ hàng
đợi để hiển thị lên màn hình
Câu 1

+ Khái niệm ngăn xếp, hàng đợi (1 đ)


-
Ngăn xếp là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào
ngăn xếp và phép loại bỏ một phần tử ra khỏi ngăn xếp đều được thực hiện ở một
đầu, đầu đó gọi là đỉnh của ngăn xếp
-
Hàng đợi là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào
hàng đợi được thực hiện ở một đầu còn phép loại bỏ một phần tử ra khỏi hàng đợi
được thực hiện ở đầu kia

+ Có hai phương pháp cài đặt ngăn xếp: Bởi mảng và bởi con trỏ: (1 đ)
-
Sử dụng mảng:

a) Const n = <số phần tử tối đa trong ngăn xếp>;


b) Type Stack = Record
 Top: 0..n;
 Element: array[1..n]of Item;
End;
Var S: Stack;
-
Sử dụng con trỏ:

Type Stack = ^Nut;


Nut = Record
Info: Item;
Next : Stack;
End;
Var Top: Stack;

+ Có thể cài đặt hàng đợi bởi con trỏ hoặc bởi mảng:
-
Sử dụng mảng

Const n = <số phần tử tối đa trong hàng đợi>


Type QUEUE = Record
Info: Item;
Front, Real: 0.. n;
End;
Var Q: QUEUE;
-
Sử dụng con trỏ:

Type Nut = Record


Info: Item;
Next: ^Nut;
End;
Queue = ^ Nut;
Var F, R: Queue;

+ Ví dụ minh hoạ ngăn xếp, hàng đợi: tự cho

Câu 2

1) Viết dạng cài đặt (1 đ)

2) Kết quả: 79742 (1 đ)

3) Thủ tục Push, pop (1 đ)

Câu 3 Tương tự câu 2 đề 20

Đề 22
Câu 1 (2 điểm)
Định nghĩa từ điển, Tư tưởng của bảng băm sử dụng trong việc cài đặt từ điển. Viết dạng cài đặt
từ điển bởi bảng băm mở. Với dạng cài đặt này anh(chị) hãy cài đặt phép toán tìm xem trong từ
điển T có chứa từ x hay không? (x là một từ được nhập từ bàn phím)
Câu 2(4 điểm)

Cho một danh sách liên kết đơn (DSLK) có nút đầu danh sách được trỏ bởi con trỏ L, các
phần tử trong danh sách có kiểu dữ liệu Item nào đó.
1) Viết các hàm trên DSLK đơn này:
a. insert_first (thêm một phần tử vào đầu danh sách),
b. insert_last (thêm một phần tử vào cuối danh sách),
c. remove_first(loại bỏ phần tử đầu tiên trong danh sách),
d. remove_last(loại bỏ phần tử cuối cùng trong danh sách)
2) Dùng các hàm ở ý 1) để tạo ra một hàng đợi và một ngăn xếp chứa n phần tử; (n là số
nguyên dương nhập từ bàn phím)
3) Lấy các phần tử trong ngăn xếp và hàng đợi ra hiển thị lên màn hình.
Câu 3 (2 điểm)
Dựng đồ thị có hướng G có giá trị ma trận lân cận kề như sau:

1 2 3 4 5 6
1 0 1 0 0 1 1
2 1 1 1 0 0 1
3 0 1 0 1 1 1
4 1 0 1 0 1 1
5 1 0 0 1 0 1
6 1 1 1 1 1 1
Nêu kết quả phép duyệt đồ thị G theo chiều sâu, và chiều rộng xuất phát từ V1.

Câu 1

Tương tự câu 1 đề 15

Câu 2

Các hàm:

1) procedure insert_first(x:item, var L: list); {thêm phần tử x vào đầu danh sách L} (0.5 đ)

Var m:list;
Begin
new(M);
m^.infor:= x;
M^.next:=L;
l:=M;
End;
2)procedure insert_last(x: Item, var L: list); (thêm một phần tử x vào cuối danh sách L) (0.5 đ)

var M, p:list;
Begin
p:=L; while (p^.next <>nil) do p:=p^.next;
new(M);
M^.infor:= x;
p^.next := M;
m^.next:=nil;
End;
3) Procedure remove_first(var m: list; var L:list)(loại bỏ phần tử đầu tiên trong danh sách L, M trỏ tới
phần tử sau khi bị loại bỏ khỏi danh sách); (0.5 đ)

Begin
if (L<>nil) then M:=L; L:=L^.next;
End;
4) Procedure remove_last(var M:list; var L:list)(loại bỏ phần tử cuối cùng trong danh sách L; M trỏ tới
nút sau khi loại bỏ khỏi danh sách) (0.5 đ)

var p,q:list;
Begin
if L<>nil Then
Begin
p:=L; q:=p^.next;
while (q^.next<>nil) do
begin
p:q; q:=q^.next;
end;
M:=q; p^.next:=nil;
End;
End;
2) tạo một hàng đợi và một ngăn xếp chứa n phần tử (1 đ)

a)Tạo ngăn xếp


procedure taoNgănxep(var Top:list);
var n, i, x:integer;
Begin
writeln(‘Nhap n=’); readln(n);
for i:= 1 to n do
write(‘Nhạp gia trị =’); readln(x); insert_first(x, Top);
End;
b) Tạo hàng đợi
procedure taohangdoi(var L,F:list);
var n, i, x:integer;
Begin
L:=nil; F:=nil;
writeln(‘Nhap n=’); readln(n);
for i:= 1 to n do
write(‘Nhạp gia trị =’); readln(x); insert_last(x, F);
End;

Lấy các phần tử trong hàng đợi và trong ngăn xếp hiển thị lên màn hình(1 đ)

procedure hienthi_nganxep(top:list);
var m:list;
begin
while top<>nil do
begin
remove_firsts(M, Top);
write(M^.infor);
end;
Tương tự với hàng đợi
Câu 3

1. Dựng đồ thị (1đ) 2 3

1 4

2) Kết quả duyệt (1đ) 6 5

Kết quả duiyệt theo chiều rộng: 1 2 4 5 6 3

Kết quả duyệt theo chiều sâu: 12 3 4 5 6

Đề 23
Câu 1 (2 điểm)
Định nghĩa từ điển, các phép toán trên từ điển, trình bày phương pháp cài đặt từ điển bởi bảng
băm mở (tư tưởng, dạng cài đặt). Cho ví dụ minh họa

Câu 1(3 điểm)

Khái niệm cây? Trình bày cách cài đặt cây bằng con trưởng và em liền kề của mỗi đỉnh sử
dụng mảng. Vẽ ra một cây bất kỳ làm ví dụ minh họa. Viết thủ tục tìm con trưởng và em liền
kề của đỉnh thứ k trên cây T (k là một số nguyên dương nhập từ bàn phím; giả sử các đỉnh trên
cây đã được đánh số theo một thứ tự nào đó)

Câu 2 (3 điểm)
Cho 3 danh sách móc nối đơn, lần lượt có nút đầu tiên trong danh sách được trỏ bởi L1, L2,
L3. Anh(chị) hãy:
1) Viết dạng cài đặt của danh sách
2) Hãy viết các giải thuật:
a) Ghép danh sách L2 vào danh sách L1 và cho con trỏ L trỏ tới nút đầu danh
sách tổng hợp
b) Ghép danh sách L3 vào trước danh sách L2 và L1 vào sau L2 và cho con trỏ L
trỏ tới danh sách tổng hợp
3) Nhận xét về ưu nhược điểm của cách cài đặt trên
(Giả sử cả 3 danh sách đều khác rỗng).
Câu 1

+ Định nghĩa từ điển: (0.5 đ)

Mô hình dữ liệu tập hợp, nhưng chi xét đến các phép toán thêm, xóa, tìm kiếm được gọi
là kiểu dữ liệu trừu tượng từ điển (dictionary).

+ Cài đặt từ điển bởi bảng băm mở: (0.5 đ)

const N= ..
Type pointer = ^ ele;
Ele= Record
Key: keytype;
Next: pointer;
End;
Dictionary = array[0..N-1] of pointer;
Var T: Dictionary;
+ Tư tưởng của bảng băm mở trong việc cài đặt từ điển: (0.5 đ)

-
Phân chia tập hợp đã cho thành một số cố định các lớp(giả sử N lớp được đánh số
từ 0 -> N-1)
-
Sử dụng một mảng T có chỉ số chạy từ 0 đến N-1 để chứa các phần tử trong tập
hợp, mỗi thành phần T[i] là một “rổ” đựng các phần tử thuộc lớp thứ I, các phần
tư trong mỗi lớp được tổ chức thành một danh sách liên kết, T[i] là con trỏ trỏ tới
phần tử đầu tiên trong lớp thứ i. T chính là bảng băm mở

+ Ví dụ: Tự cho (0.5 đ)

Câu 2

+ Cây bao gồm một tập hợp hữư hạn các đỉnh, giữa các đỉnh có một mối quan hệ gọi là quan hệ phân
cấp cha – con (0.5 đ)

+ Cài đặt cây bởi con trưởng và em liền kề của mỗi đỉnh sử dụng mảng: (0.5 đ)

const n= 50;
type nut= record

eldest, nextsibling: 0..n;

infor:Item;

end;

tree=array[1..n]of nut;

var T: tree;

+ Vẽ một cây, minh hoạ bằng hình ảnh: (1 đ)

a 2 a 0
5 b 3
===>hình ảnh cây trong bộ nhớ:
b c d 0 c 4
0 d 0
e f 0 e 6
0 f 0

+ Thủ tục tìm con trưởng của đỉnh k trên cây T: Contruong:=T[k].eldest; (1 đ)

+ Thủ tục tìm em liền kề của đỉnh thứ k trên cây T: Emlienke:=T[k].nextsibling; (1 đ)

Câu 3

a) Dạng cài đặt (1 đ)

b) Ghép L2 vào sau L1, L trỏ tới danh sách kết quả: (1 đ)

Procedure Ghep1(L1, L2, var L):


if (L2 = nil) then L:=L
else if(L1 = nil) then L:= L2
else Begin
M:=L1;
While(M^.next<>nil)do M:=M^.next;
M^.next := L2;
L:= L1;
End;

c) Ghép L3 vào trước L2, L1 vào sau L2, L trỏ tới danh sách kết quả(1 đ)

Procedure Ghep2(L1, L2, L3, var L):


Begin
Ghep1(L2, L1, M);
Ghep1(L3, M, L);
End;

Đề 24
Câu 1(2 điểm)
Thế nào là cấu trúc dữ liệu, giải thuật, mối quan hệ giữa chúng. Cấu trúc dữ liệu và giải thuật
đóng vai trò như thế nào trong việc giải quyết một bài toán tin học? Hãy cho một ví dụ minh
họa?

Câu 2 (3 điểm)
Trình bày một phương pháp cài đặt cây nhị phân tìm kiếm. Dựng một cây nhị phân tìm kiếm
có 13 nút, các đỉnh nhận giá trị là các số chẵn 2, 4, 6, … Viết thuật toán thêm một đỉnh mới x
= 13 vào cây nhị phân tìm kiếm và minh hoạ trên cây vừa dựng.

Câu 3 (3 điểm)

Một ma trận chỉ chứa rất ít phần tử với giá trị có nghĩa (ví dụ: phần tử  0 được gọi là phần tử
có nghĩa) được gọi là ma trận thưa. Ví dụ :

Hãy dùng cấu trúc danh sách liên kết để tổ chức biễu diễn một ma trận thưa sao cho tiết kiệm
bộ nhớ nhất (chỉ lưu trữ các phần tử có nghĩa).
a) Cấu trúc một nút trong danh sách có dạng như thế nào?
b) Viết dạng cài đặt ma trận trên bằng danh sách liên kết
c) Viết chương trình cho phép nhập, xuất ma trận
Câu 1

Tương tự câu 1 đề 09

Câu 2
Tương tự câu 1 đề 17

Câu 3

a) (1 đ) Ma trận sẽ thay bằng một danh sách liên kết đơn, danh sách này sẽ lưu các phần tử có nghĩa
của ma trận, mỗi phần tử trong ma trận được tổ chức dưới dạng một nút. Cấu trúc 1 nút trong danh sách
là một bản ghi gồm 4 trường có dạng:

chỉ số hàng Chỉ số cột Giá trị Next

b) Nhập ma trận (1 đ) Tương tự như nhập danh sách liên kết đơn thông thường

c) xuất ma trân (1 đ): Tương tự như hiển thị danh sách

Đề 25
Câu 1 (1 điểm)
Thế nào là cấu trúc dữ liệu tiền định(định sẵn) của ngôn ngữ lập trình bậc cao? Cho ví dụ minh
họa
Câu 1(2 điểm)

Cho một danh sách liên kết đơn có n phần tử, các phần tử là các số nguyên. Hãy: Viết dạng cài
đặt của danh sách, và viết chương trình con đảo nhóm k phần tử đầu và nhóm k phần tử cuối
của danh sách cho nhau. Biết rằng: n > 2k

Câu 2 (4 điểm)

Cho một cây đa phân bất kỳ các đỉnh chứa các số nguyên. Anh(chị) hãy:

1) Viết dạng cài đặt của cây bởi danh sách các con của mỗi đỉnh.

2) Viết các chương trình con tương ứng với các yêu cầu sau:

a) Tạo một cây (điều kiên dừng nhập là: nhập số <0)

b) Tính số đỉnh trên cây

c) Tính chiều cao của cây

d) Tìm kiếm xem trên cây có chứa đỉnh có thông tin = x không? (x là số nguyên nhập từ
bàn phím)
Câu 1
1) Cấu trúc dữ liệu tiền định của ngôn ngữ lập trình bậc cao là các cấu trúc dữ liệu đã được định nghĩa
sẵn trong ngôn ngữ lập trình đó, người lập trình chỉ việc sử dụng mà không cần định nghĩa lại (0.5
đ)
3) Một vài cấu trúc dữ liệu tiền định như: mảng, bản ghi, tệp tin, ...... (0.5 đ)

Câu 2
+ Dạng cài đặt của danh sách: (1 đ)

Type Nut = record


infor: integer;
` Next: ^ nut;
end;
List = ^Nut;
Var L: List;
+ Đảo nhóm k phần tử đầu cho k phần tử cuối của danh sách L: (1 đ)

Cách làm: - Chia danh sách L làm 3 đoạn, lần lượt cho L1, L2, L3 trỏ tới đầu mỗi đoạn

+ Tách k phần tử đầu của L, L1 trỏ tới phần tử đầu của danh sách này

+ Đếm số nút trong danh sách L lưu vào d

+ Tách d-k phần tử đầu của L, L2 trỏ tới đầu đoạn này

+ Đoạn còn lại của L, cho L3 trỏ tới đầu đoạn


-
Ghép các danh sách lần lượt theo trình tự: L3, L2, L1
-
cho L trỏ tới đầu danh sách đã ghép

Câu 2
+ Có thể cài đặt cây bằng danh sách các con của mỗi đỉnh: Tương tự y1) câu 3 đề 09 (1đ)

+ Viết các chương trình con tương ứng với các yêu cầu:

1) Tạo cây (1 đ)

b1) Nhập gốc cây, lưu vào hàng đợi. mức của gốc:=1

b2) Lấy một đỉnh từ hàng đợi ra, nhập các con của nó, các con này có mức:=mức +1,
gắn vào cây, mỗi khi nhập một con, lại đưa con đó vào hàng đợi,
b3) lặp đi lặp lại b2) cho đến khi nhập số 0. Ta thu được cây cần tạo

2) Có thể sử dụng một trong các phương pháp duyệt cây để tính số đỉnh trên cây(1 đ)

3) Tính chiều cao của cây : = mức(1 đ)

4) Tìm kiếm đỉnh có thông tin = x trên cây: Có thể sử dụng một trong các phương pháp duyệt cây
để tìm kiếm đỉnh có thông tin = x(1 đ)

Đề 26
Câu 1(2 điểm)

Khái niệm danh sách? Cho một danh sách chứa các số nguyên. Anh(chi) hãy:

1) Viết dạng cài đặt của danh sách bằng danh sách liên kết đơn

2) Viết chương trình con đổi ngược mối liên kết của các nút trong DSLK trên

Câu 2 (4 điểm)

Cho một đa thức bất kỳ. Anh(chị) hãy:

1) Biểu diễn đa thức trên dưới dạng một danh sách liên kết đơn với mỗi phần tử là một cấu
trúc chứa hệ số và số mũ của thành phần đó.

2) Viết các chương trình con tương ứng với các yêu cầu sau:

1) Tối giản một đa thức (gộp các thành phần có cùng số mũ lại và sắp xếp đa thức theo
chiều số mũ giảm dần)

2) Tính tổng, hiệu và tích của hai đa thức bất kỳ

3) Hiển thị đa thức lên màn hình

Câu 3 (2 điểm)
Anh(Chị) trình bày các cách cài đặt danh sách mà anh(chị) đã đươc học và tự nghiên cứu (Viết
dạng cài đặt, ưu nhược điểm của từng cách cài đặt)

Câu 1

1) khái niệm danh sách, dạng cài đặt (1 đ)

+ Danh sách là một cấu trúc dùng để lưu trữ một tập hợp hữu hạn biến động các phần tử thuộc
cùng một lớp đối tượng nào đó
+ Cài đặt danh sách bởi danh sách liên kết đơn:

type list=^nut;
nut = record
infor: iteger;
next:list;
end;
var L: list;
2) 2) Đảo ngược mối liên kết của các phần tử trong d/s (1 đ)

+ Giả sử L là con trỏ trỏ tới nút đầu tiên trong danh sách.

+ Để có thể đảo ngược danh sách ta làm như sau:

1. L1:=nil; { khởi tạo danh sách L1 rỗng}

2. Loại bỏ phần tử đầu tiên của danh sách L, p trỏ tới phần tử này

3. Gắn p vào L1: p^.next:=L1, L1:=p

Lặp đi lặp lại bước 3 cho đến khi danh sách L rỗng; L:=L1

Câu 2

1)Biểu diễn đa thức (1 đ)

type list=^nut;
nut = record
heso: real;
somu: integer;
next:list;
end;
var L: list;
2) Các chương trình con

y1) Tối giản đa thức(1 đ)

Cách làm:

1. Giả sử đa thức là một danh sách có nút đầu được trỏ bởi L

2. Sắp xếp đa thức giảm dần theo số mũ

3. duyệt đa thức từ đầu đến cuối, xét 2 nút kế tiếp trong danh sách L:

+ nếu cùng số mũ thì cộng hệ số của 2 nút lại:


 nếu tổng = 0, thì loại bỏ 2 nút đó khỏi danh sách L

 Nếu tổng khác 0, thì lặp lại bước 3 cho đến khi gặp nút có hệ
số khác nó thì: loại bỏ các nút có cùng số mũ ra khỏi L, gắn
vào danh sách L1

+ Nếu khác số mũ, thì tách nút đứng trước ra khỏi L, gép vào L1

4. Lặp đi lặp lại bước 3 cho đến khi L rỗng; L:=L1

ý 2) Cách làm(1 đ)

a) Giả sử cần tính tổng 2 đa thức có các nút đầu được trỏ bởi con trỏ A,B

- Sử dụng 2 con trỏ p,q di chuyển đến các nút của 2 danh sách A,B từ đầu đến cuối:

p:=A; q:=B; {xuất phát từ nút đầu tiên}

+ Nếu p^.somu=q^.somu, thì:

 Cộng 2 hệ số tương ứng của 2 nút được trỏ bởi p, q:


tong:=p^.heso + q^.heso

 Nếu tong=0, p:=p^.next; q:=q^.next;

 Nếu tong <>0 thì m^.heso:=tong, m^.somu:=p^.somu; gắn m


vào cuối danh sách có nút đầu được trỏ bởi C, khởi tạo C:=nil

+ Nếu p^.somu>q^.somu, thì: m^.heso:= p^.heso; m^.somu:=p^.somu; gắn m vào cuối danh
sách C; p:=p^.next

+ Nếu p^.somu<q^.somu, thì : m^.heso:= q^.heso; m^.somu:=q^.somu; gắn m vào cuối danh
sách C; q:=q^.next

+ Nếu một trong 2 danh A, B kết thúc trước, thì gắn phần còn lại của danh sách chưa kết thúc
vào cuối danh sách C

 C chính là đa thức tổng

b) Tính hiệu: cách làm tương tự như tính tổng

c) tính tích: , tách từng nút của danh sách A, nhân với các nút tương ứng của danh sách B, công các đa
thức thành phần lại

ý 3 cách làm: (1 đ)
duyệt toàn bộ đa thức từ đầu đến cuối, duyệt đến nút nào, hiển thị hệ số và số mũ của nút đấy

Câu 3

Ví dụ: Cấu trúc dữ liệu danh sách,

Có thể cài đặt danh sách bởi con trỏ(1 đ)

Ưu điểm:
-
Không gây hiện tượng lãng phí bộ nhớ (Hiện tượng giữ chỗ để đấy mà không
dùng đến như danh sách cài đặt bởi mảng)
-
Cấu trúc dữ liệu danh sách cài đặt bởi con trỏ còn gọi là cấu trúc dũ liệu động,
không gian bộ nhớ được cấp phát trong heap, do đó nó không bị giới hạn bởi kích
thước 64kb như đối với cấu trúc dữ liệu tĩnh
-
Các phần tử trong danh sách nằm ở những vị trí dải dác, do đó tận dụng được
những không gian trống này, mà không cần một vùng nhớ kế tiếp như cài đặt bởi
mảng
Nhược điểm:
-
Tốc độ truy cập đến các phần tử trong danh sách là chậm, không đồng đều đối với
mọi phần tử (truy cập tuần tự một chiều)
-
Từ phần tử trước không truy cập ngược lại phần tử đứng trước
-
mỗi phần tử trong danh sách tốn thêm một không gian là 4byte để lưu địa chỉ của
phàn tử đứng sau nó trong danh sách

hoặc cài đặt danh sách bởi mảng: (1 đ)

b. Ưu điểm

1) truy cấp đến các phần tử là trực tiếp do đó nhanh và đồng đều đối với mọi
phần tử

2) Các thao tác thực hiện tương đối dễ dàng

c. nhược điểm

1) Có hiện tượng dư thừa bộ nhớ: Hiện tượng giữ chỗ để đấy mà không dùng
tới

2) Bị hạn chế bởi không gian kế tiếp trong bộ nhớ

3) Là cấu trúc dữ liệu tĩnh, bị giới hạn không gian bộ nhớ trong thanh ghi dữ
liệu và thanh ghi stack
4) có hiện tượng co giãn, dịch chuyển các phần tử khi thực hiện thao tác bổ
sung phần tử, hoặc loại bỏ phần tử, do đó là số lượng phép tính trong giải
thuật tăng= > độ phức tạp tính toán cũnh tăng theo

Đề 27 15

Câu 1(3 điểm) Cho cây nhị phân như hình vẽ: 10 21

9 12 31
0
Anh(chị) hãy:
1) Nêu khái niệm cây nhị phân tìm kiếm, cây đã cho có phải là cây nhị phân tìm kiếm
không? Giải thích tại sao?
2) Viết dạng cài đặt cây cân bằng bởi con trỏ.
3) Thêm một đỉnh có khoá x = 30 vào cây (minh họa vị trí được thêm trên cây, giải
thuật thêm tương ứng)
Câu 2(2 điểm)
Cho một danh sách kế tiếp biểu diễn cây thư mục (directory tree), mỗi phần tử gồm 2 thành
phần: tên thư mục, vị trí của thư mục cha trên danh sách này (số nguyên chỉ thứ tự thư mục
trong danh sách). Nếu là thư mục gốc thì giá trị thứ hai là 0. In cây thư mục này ra màn hình.
Câu 2 (3 điểm)

Cho một đa thức bất kỳ. Anh (chị) hãy:


1) Biểu diễn đa thức trên dưới dạng một danh sách liên kết đơn với mỗi phần tử là một cấu
trúc chứa hệ số và số mũ của thành phần đó.
2) Viết các chương trình con tương ứng với các yêu cầu sau:
a) Tối giản một đa thức (gộp các thành phần có cùng số mũ lại và sắp xếp đa thức theo
chiều số mũ giảm dần)
c) Hiển thị đa thức lên màn hình
Câu 1

1) (1đ)

* khái niệm cây nhị phân tìm kiếm: Cây NPTK là một cây nhị phân thỏa mản 3 điều kiện:

Điều kiện 1: Khóa tại các đỉnh của cây con trái nhỏ hơn khóa tại gốc

Điều kiện 2: Khóa tại gốc > khóa tại các đỉnh của cây con bên phải

Điều kiện 3: Cây con bên trái và cây con bên phải đều là cây NPTK

* Cây nhị phân đã cho là cây NPTK vì nó thỏa mãn các điều kiện được nêu trong khái niệm cây NPTK

2) Dạng cài đặt cây bằng con trỏ(0.5đ)


Type BinaSearchTree = ^ Nut;
Nut = Record
Key: integer;
Left, Right: BinaSearchTree;;
End;
Var T : BinaSearchTree;

3) Thêm đỉnh có khóa x = 30 vào cây: (1.5đ)


15
* Hình ảnh cây sau khi thêm x:
10 21

9 12 31
0
* Viết thủ tục thêm một đỉnh x vào cây R: Insert(x, R):
30
- Sử dụng con trỏ phụ M chứa địa chỉ của nút cần thêm

- Xin MT cấp phát ô nhớ cho M

- Đổ dữ liệu cần thêm vào ô nhớ có địa chỉ M

- Gắn M vào cây:

Nếu Cây rỗng (R = nil): R := M

Nếu cây không rỗng: Xác định vị trí thêm M:

If (x<R^.info) then Insert (x, R^.Left)

Else if (x>R^.info) then Insert(x, R^.right);

else thông báo x đã có trên cây

Câu 2:(2đ)

Duyệt danh sách để hiển thị các nút trong danh sách theo hình dạng cây thư mục

Câu 3: Tương tự câu 2 đề 26

Đề 28
Câu 1(1 điểm)

Nêu khái niệm ngăn xếp? ứng dụng ngăn xếp?


Câu 2 (5 điểm)

Cho một danh sách kế tiếp biểu diễn cây thư mục (directory tree), mỗi phần tử gồm 2 thành
phần: tên thư mục, vị trí của thư mục cha trên danh sách này (số nguyên chỉ thứ tự thư mục
trong danh sách). Nếu là thư mục gốc thì giá trị thứ hai là 0. Anh (chị) hãy:

1) Viết dạng cài đặt của cây thư mục bởi danh sách kế tiếp như trên. Cho ví dụ và minh họa
bằng hình ảnh

2) Viết giải thuật đếm xem trên cây có tất cả bao nhiêu thư mục

3) Viết giải thuật xoá thư mục “Bai tap” và tất cả các thư mục con trong nó

4) Viết chương trình con hiển thị cây thư mục này ra màn hình.

Câu 3 (2 điểm)

Hãy dùng stack ở dạng liên kết đơn (cài đặt ngăn xếp bởi con trỏ) để đảo ngược vị trí của tất cả
các phần tử ở vị trí lẻ trong một DSLK đơn, có nút đầu danh sách được trỏ bởi con trỏ L; các
phần tử trong danh sách là các số nguyên

Câu 1

- Ngăn xếp là một danh sách tuyến tính trong đó phép bổ sung một phần tử vào ngăn xếp và phép loại
bỏ một phần tử ra khỏi ngăn xếp đều được thực hiện ở một đầu, đầu đó gọi là đỉnh của ngăn xếp (0.5
đ)

- Cấu trúc ngăn xếp thường được áp dụng cho những bài toán có trình tự truy xuất ngược với trình tự
lưu trữ. Ví dụ: (0.5 đ)

+ Bài toán chuyển đổi cơ số, tìm ước số chung của hai số nguyên, bài toán tính giá
trị biểu thức, ....

+ Thường áp dụng trong một số bài toán tìm đường đi trong lý thuyết đồ thị (lưu vết
đường đi)

+ làm môi trường lưu trữ các biến toàn cục và cục bộ của các thủ tục trong chương
trình dịch của ngôn ngữ lập trình.

.....

Câu 2

1) Dạng cài đặt, cho ví dụ và minh họa bằng hình ảnh(1.5 đ)

+ Dạng cài đặt:


Const n = ….;
Type Nut = Record
TenThuMuc: String;
Vitri: 0..n;
End;
List = Array[1..n] of Nut;
Var T: List;
+ Ví dụ: Cho cây thư mục như sau:

1
\users \BT\

2 3
Tin\ Toan\

4 5 6 7 8
Hình ảnh cây thư mục trong bộ nhớ MT với các cài đặt trên như sau:
BT1 Bt2 Bt3 BT1 BT2
Số thứ tự TenThuMuc Vitri
1 \users \BT\ 0
2 Tin\ 1
3 Toan\ 1
4 BT1 2
5 Bt2 2
6 Bt3 2
7 BT1 3
8 BT2 3
9 Nil 0
… …
n nil 0
2) Đếm số lượng các thư mục trên cây(1 đ)

Fuction Dem(T: List): integer;


Var i: 0..n;
Begin
i := 0;
While (T[i].TenThuMuc<>nil) do
i:=i+1;
dem:=i;
End;
3) Xóa thư mục bài tập và tất cả các thư mục con trong nó (1.5 đ)
-
Duyệt danh sách để tìm đến thư mục bài tập, xác định số thứ tự của thư mục này,
giả sử là i. Nếu không tim thấy thì thông báo không có thư mục để xóa, nếu tìm
thấy:
a) Viết thủ tục loại bỏ thư mục con của i có vị trí là i là vị trí tìm thấy đầu tiên

b) Lặp đi lặp lại bước a) Cho đến khi xóa hết các thư mục con có vị trí là i

c) Xóa thư mục cha thứ i

1) Hiện cây thư mục lên màn hình (1đ)

Duyệt danh sách từ đầu đến đêm, duyệt đến thư mục nào thì hiện thị tên và vị trí cha của thư
mục đó

Câu 3 (2 điểm)

Gợi ý cách làm:

+ Lần lượt tách các phần tử ở vị trí lẻ trong danh sách L, đưa vào trong ngăn xếp cho đến khi
duyệt hết danh sách

+ Lần lượt lấy từng phần tử trong ngăn xếp ra, gắn vào các vị trí lẻ trong danh sách L.

Đề 29
Câu 1(2 điểm)

Nêu khái niệm cây nhị phân (binary tree)? Các cách cài đặt? ưu nhược điểm của từng dạng cài
đặt?

Câu 2 (4 điểm)

Một ma trận chỉ chứa rất ít phần tử với giá trị có nghĩa (ví dụ: phần tử  0 được gọi là
phần tử có nghĩa) được gọi là ma trận thưa.

Ví dụ :

Hãy dùng cấu trúc danh sách liên kết để tổ chức biễu diễn một ma trận thưa sao cho tiết
kiệm bộ nhớ nhất (chỉ lưu trữ các phần tử có nghĩa).

a) Cấu trúc một nút trong danh sách có dạng như thế nào?

b) Viết dạng cài đặt của ma trận thưa đã cho bằng danh sách liên kết

b) Viết chương trình cho phép nhập, xuất ma trận

Câu 2 (2 điểm)
Hãy dùng stack ở dạng liên kết đơn (cài đặt ngăn xếp bởi con trỏ) để đảo ngược vị trí của tất cả
các phần tử ở vị trí chẵn trong một DSLK đơn, có nút đầu danh sách được trỏ bởi con trỏ L; các
phần tử trong danh sách là các số nguyên

Câu 1: Tương tự câu 1 đề 12

Câu 2

a) (1 đ) Ma trận sẽ thay bằng một danh sách liên kết đơn, danh sách này sẽ lưu các phần tử có nghĩa
của ma trận, mỗi phần tử trong ma trận được tổ chức dưới dạng một nút. Cấu trúc 1 nút trong danh sách
là một bản ghi gồm 4 trường có dạng:

chỉ số hàng Chỉ số cột Giá trị Next

b) Dạng cài đặt của ma trận(1 đ)

Type Nut = Record


ChiSoHang, ChiSoCot: integer;
Giatri: integer;
Next: ^Nut;
End;
Matran = ^nut;
c) Nhập (1 đ), xuất ma trận (1 đ): Tương tự như nhập, xuất danh sách liên kết đơn thông thường

Câu 3:

Cách làm tương tự câu 3 đề 28, tuy nhiên xét các phần tử ở vị trí chẵn thay vì xét các phần tử ỏ
vị trí lẻ

Đề 30
Câu 1(2 điểm)

Nêu khái niệm cây nhị phân (binary tree)? Các cách cài đặt? ưu nhược điểm của từng dạng cài
đặt?

Câu 2 (5 điểm)

Cho 3 danh sách móc nối đơn chứa các số nguyên, lần lượt có nút đầu tiên trong danh sách
được trỏ bởi L1, L2, L3. Anh (chị) hãy:

a) Viết dạng cài đặt của danh sách

b) Viết các giải thuật tương ứng với các yêu cầu sau:
1. Ghép danh sách L2 vào danh sách L1 và cho con trỏ L trỏ tới nút
đầu danh sách tổng hợp

2. Ghép danh sách L3 vào trước danh sách L2 và L1 vào sau L2 và


cho con trỏ L trỏ tới danh sách tổng hợp

3. Loại bỏ tất cả các số 0 trong danh sách L ra khỏi danh sách

4. Hiển thị danh sách L lên màn hình

(Giả sử cả 3 danh sách đều khác rỗng).

Câu 2 (1 điểm)

Hãy dùng stack ở dạng liên kết(cài đặt ngăn xếp bởi con trỏ) để đảo ngược vị trí của tất cả các
phần tử ở vị trí lẻ trong một DSLK đơn, có nút đầu danh sách được trỏ bởi con trỏ L; các phần
tử trong danh sách là các số nguyên

Câu 1: Tương tự câu 1 đề 29

Câu 2:

a) Dạng cài đặt của danh sách: (1 đ)

Type Nut = record


infor: integer;
` Next: ^ nut;
end;
List = ^Nut;
Var L, L1, L2, L3: List;

b) Ghép L2 vào sau L1, L trỏ tới danh sách kết quả: (1 đ)

Procedure Ghep1(L1, L2, var L):


if (L2 = nil) then L:=L
else if(L1 = nil) then L:= L2
else Begin
M:=L1;
While(M^.next<>nil)do M:=M^.next;
M^.next := L2;
L:= L1;
End;
c) Ghép L3 vào trước L2, L1 vào sau L2, L trỏ tới danh sách kết quả(1 đ)

Procedure Ghep2(L1, L2, L3, var L):


Begin
Ghep1(L2, L1, M);
Ghep1(L3, M, L);
End;

d) Loại bỏ tất cả các số 0 ra khỏi danh sách L(1 đ)

Kiểm tra xem danh sách L có rỗng hay không? Nếu rỗng trở về chương trình chính, nếu không
rỗng thực hiện loại bỏ như sau:
-
Sử dụng con trỏ phụ q duyệt tử đầu đến cuối danh sách, nếu q^.info =0 thì gọi thủ
tục loại bỏ phần tử được trỏ bởi q trong danh sách
-
Viết thủ tục loại bỏ phần tử được trỏ bởi con trỏ q trong danh sách L:

a) Giả sử đã biết vị trí con trỏ q

b) Sử dụng con trỏ phụ p di chuyển đến vị trí trước q:

P:= L;

While p^.next<> q do p:= p^.next;

c) Loại bỏ phần tử ở vị trí q:

p^.next := q^.next;
dispose(q);
q:= p^.next;// lưu vị trí tiếp theo vị trí loại bỏ để còn loại bỏ tiếp

e) Hiển thị danh sách L(1 đ)

procedure Hienthi(l:list);
var i: integer;p: list;
begin
writeln(‘Danh sách cac so nguyen la:’);
p: =L;
while p<>nil do
begin
write(p^.info:6);
p:=p^.next;
end;
end;
Câu 3
Tương tự câu 3 đề 28

You might also like