



















Preview text:
  lOMoAR cPSD| 58605085
CHƯƠNG 2: C/C++ CƠ BẢN      
CÂU HỎI TRẮC NGHIỆM  
Câu 1: Trong ngôn ngữ C, biến dùng để lưu trữ gì?    a) Hàm          b) Toán tử    c) Dữ liệu          d) Câu lệnh. 
Câu 2: Kiểu dữ liệu int trong C được sử dụng để lưu trữ:    a) Số nguyên          b) Số thực    c) Chuỗi kí tự          d) Số phức. 
Câu 3: Toán tử ++ được sử dụng để thực hiện:    a) Phép cộng          b) Phép trừ 
c) Phép tăng giá trị biến lên 1 đơn vị   
d) Phép giảm giá trị biến đi 1 đơn vị Câu 
4: Trong C, kiểu dữ liệu nào được sử dụng để lưu trữ các giá trị logic (đúng/sai)?    a) int            b) char    c) bool            d) float 
Câu 5: Trong C, toán tử ++i và i++ hoạt động theo cách nào khác nhau? 
a) ++i tăng giá trị của i trước khi sử dụng, i++ tăng giá trị sau khi sử dụng. 
b) ++i tăng giá trị sau khi sử dụng, i++ tăng giá trị trước khi sử dụng. 
c) Cả hai hoạt động giống nhau. 
d) Không có sự khác biệt nào giữa chúng.. 
Câu 6: Cho 3 biến số nguyên (int) a = 5, b = 4, c = 3,hãy cho biết giá trị của biểu thức: (a*++b)/c    a. 0.            b. 1.    c. 2.            d. Tất cả đều sai 
Câu 7: Cho 3 biến số nguyên a = 5, b = 2, c = 3, kết quả: (a>5)&&(c<2)&&(++b ==2)là:    a. Đúng/True.          b. Sai/False 
Câu 8: Cho biến a được khai báo như sau:  bool a; Trong 
các câu lệnh sau, câu lệnh nào là ĐÚNG:    a. a = 0;          b. a = true;    c. a = 1;          d. Tất cả đều đúng      lOMoAR cPSD| 58605085   
Câu 9: Cho biến a được khai báo như sau:  char a; Trong 
các câu lệnh sau, câu lệnh nào là SAI:    a. a = 'b';          b. a = "B";    c. a = 49;          d. a = ' '; 
Câu 10: Trong các câu lệnh sau, câu lệnh nào là ĐÚNG:    a. int x = y = z = 10;       
b. int x = 10, y = 10, z = 10;   
c. int x = 10,int y = 10, int z = 10;    d. Tất cả đều đúng 
Câu 11: Hãy chọn câu lệnh đúng để tính giá trị của hàm mũ e^x và lưu vào biến result:    a) result = exp(x);        b) result = pow(x, e);    c) result = log(x);        d) result = sqrt(x); 
Câu 12: Trong ngôn ngữ C, dấu {} được sử dụng để làm gì?   
a) Đánh dấu các điều kiện đúng và sai. 
b) Đánh dấu khối lệnh hoặc nhóm lệnh.   
c) Đánh dấu kết thúc một vòng lặp.   
d) Bắt buộc sử dụng trong mọi câu lệnh if. 
Câu 13: Câu lệnh nào trong C được sử dụng để thoát khỏi một vòng lặp sớm hơn dự kiến?    a. return          b. next    c. continue          d. break 
Câu 14: Câu lệnh continue trong một vòng lặp được sử dụng để làm gì? a) 
Kết thúc vòng lặp hiện tại và tiếp tục vòng lặp ngoài. 
b) Thực hiện một lệnh hoặc khối lệnh nếu điều kiện đúng. 
c) Lặp lại vòng lặp hiện tại từ đầu. 
d) Tạo một lặp vô hạn. 
Đoạn chương trình sau dùng cho 2 câu dưới:   int i=0,x=0,n=0;  for (i = 0;i<3;i++)   { for (x = 2;  x>=0; x--)    { n++;  printf("%d",i++);    }   }  
Câu 15: Cho biết giá trị của n sau khi kết thúc đoạn chương trình trên:    a. 3.            b. 4.      lOMoAR cPSD| 58605085   c. 5.            d. 6. 
Câu 16: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là:    a. 01            b. 12    c. 012            d. 0123 
Đoạn chương trình sau dùng cho 2 câu dưới:   int i = 5, n = 0;  do {  n++; if (i%2  == 1)   i--;    else   printf("%d", --i);  
} while (i>0);  
Câu 17: Cho biết đoạn lệnh trong vòng lặp do-while được lặp lại mấy lần:    a. 3           b. 4    c. 5            d. 6 
Câu 18: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là:    a. 135            b. 531    c. 31            d. Tất cả đều SAI. 
Đoạn chương trình sau dùng cho 2 câu dưới:   int i=0,x=2,n=0;  while (i<3)   { while  (x>=0)    { n = n +  1;  printf("%d_",x);  x = x - 1;    }     i = i + 1;    }      
Câu 19: Cho biết giá trị của n sau khi kết thúc đoạn chương trình trên:    a. 3.            b. 4.    c. 5.            d. Tất cả đều sai. 
Câu 20: Kết quả xuất ra màn hình sau khi chạy đoạn chương trình trên là:    a. 0 _1_          b. 1_2_    c. 0 _1_ 2_          d. Tất cả đều sai.      lOMoAR cPSD| 58605085   
Đoạn chương trình sau dùng cho 2 câu dưới:  
int num = 12345,reversed = 0, n = 0,digit;  while (num != 0)   { n++; digit = num %  10; reversed = reversed +  digit; num /= 10;   }      
Câu 21: Cho biết giá trị của reversed sau khi chạy đoạn chương trình trên:    a. 2.            b. 3.    c. 4.            d. Tất cả đều sai. 
Câu 22: Cho biết giá trị của n sau khi chạy đoạn chương trình trên:    a. 2            b. 3    c. 4            d. Tất cả đều sai. 
Đoạn chương trình sau dùng cho 2 câu dưới:   int f(int a, int b)   { if(a>b) return a - b;  else  return b - a;   }   void main()   { int x = 5, y = 3;  x = f(x,y); y = f(y,x);  int n = f(x,y) + f(y,x);   }      
Câu 23: Giá trị của x và y sau khi kết thúc đoạn chương trình trên là:    a. x = 5, y = 5          b. x = 2, y = 1    c. x = 1, y = 2          d. Tất cả đều sai. 
Câu 24: Giá trị của biến n sau khi kết thúc đoạn chương trình trên là:    a. 0.            b. 1.    c. 2.            d. Tất cả đều sai.            lOMoAR cPSD| 58605085   
Đoạn chương trình sau dùng cho 2 câu dưới:   int f(int a)  
{ if( a==1) return 1; if(a%2  == 0) return f(a-1)*2; else  return (f(a-1) + 1);   }   void main()   { int x =  f(3); int y  = f(4);   }      
Câu 25: Giá trị của x sau khi kết thúc đoạn chương trình trên là:    a. 3            b. 4    c. 5            d. Tất cả đều sai. 
Câu 26: Giá trị của biến y sau khi kết thúc đoạn chương trình trên là:    a. 0.            b. 1.    c. 2.            d. Tất cả đều sai.    
BÀI TẬP THỰC HÀNH   Bài 1: 
Viết chương trình cho phép người sử dụng nhập vào giá trị điện dung C, điện cảm L (số thực). 
Tính và in ra tần số cộng hưởng Fch của mạch L,C nối tiếp. Cho biết:  1  𝐹𝑐    Bài 2 : 
Viết chương trình tính tiền cước taxi với bảng giá như sau :  
• 2 km đầu tiên : 20.000 đ.  
• 8 km tiếp theo : 7.000đ/km.  
• 10 km tiếp theo : 5.000đ/km. • Từ km thứ 21  : 3.000đ/km.  
Dựa trên các thông số trên, viết chương trình có các chức năng sau :  
• Cho phép người sử dụng nhập vào số km đi được (số nguyên).  
• Tính tiền cước taxi dựa vào bảng giá trên, in kết quả sau khi tính toán ra màn hình.          lOMoAR cPSD| 58605085 Bài 3: 
Viết chương trình cho phép người sử dụng nhập vào 1 giá trị số nguyên a. Tìm và in ra tất cả 
các giá trị ước số của a.  Bài 4: 
Viết chương trình cho phép người sử dụng nhập vào 2 giá trị số nguyên a và b. Tìm bội số 
chung nhỏ nhất (BSCNN) và ước số chung lớn nhất (USCLN) của a và b và in ra màn hình.  Bài 5: 
Viết chương trình cho phép người sử dụng nhập vào một giá trị số nguyên a. Kiểm tra a có phải 
là số nguyên tố hay không? In kết luận ra màn hình.  Bài 6: 
Viết chương trình cho phép người sử dụng nhập vào một giá trị số nguyên N. In ra màn hình 
tất cả số nguyên tố nằm trong khoảng [0,N].  Bài 7: 
Viết câu lệnh định nghĩa hàm int SumDigit (int x) có chức năng tính tổng giá trị các chữ số  của một số nguyên.  Bài 8 : 
Viết câu lệnh định nghĩa hàm bool IsPrime (int x) có chức năng kiểm tra một giá trị số nguyên 
có phải là một số nguyên tố hay không.  Bài 9: 
Viết câu lệnh định nghĩa hàm int Factorial (int x) có chức năng tính giai thừa của một số 
nguyên theo nguyên lý đệ quy. 
Bài 10: Viết câu lệnh định nghĩa hàm void PascalTriangle (int n) có chức năng in ra màn hình 
hệ số của tam giác pascal bậc từ 0 đến n.   
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – MẢNG (ARRAY)      
CÂU HỎI TRẮC NGHIỆM  
Câu 1: Trong ngôn ngữ lập trình C, mảng là gì?   
a. Một tập hợp chứa nhiều giá trị   
b. Một loại dữ liệu số nguyên    c. Một chuỗi ký tự        d. Một hàm số 
Câu 2: Trong C, các phần tử của mảng có thể chứa các kiểu dữ liệu khác nhau.    a. Đúng          b. Sai      lOMoAR cPSD| 58605085
Câu 3: Trong các câu lệnh sau khai báo mảng M sau, câu lệnh nào là ĐÚNG:    a. int [5][3] M;        b. int M[][] ;    c. int M[5][3];         
d. Không có câu lệnh nào ĐÚNG; 
Câu 4: Trong ngôn ngữ lập trình C, vị trí (index) phần tử cuối cùng của mảng là bao nhiêu?    a. -1            b. 0    c. 1           
d. N-1 (với N là số phần tử của mảng) 
Câu 5: Cách nào sau đây được sử dụng để truy xuất vào phần tử thứ 4 của mảng myArray?    a. myArray[4];        b. myArray(4);    c. get(myArray, 4);        d. myArray.get(4); 
Câu 6: Câu lệnh nào sau đây để tạo một mảng số nguyên có kích thước 10 với phần tử đầu tiên 
trong mảng có giá trị bằng 1 trong C?    a. int arr[10] = {0};        b. int arr[10] = {1};    c. int arr[10] = {};       
d. Không có câu lệnh nào ĐÚNG; 
Câu 7: Con trỏ trong C là gì?   
a. Biến chứa một giá trị     
b. Biến chứa địa chỉ của một biến khác    c. Biến chứa một hàm       
d. Biến chứa một số nguyên 
Câu 8: Để khai báo một con trỏ kiểu integer trong C, bạn sử dụng cú pháp nào sau đây?    a. int pointer;          b. integer* pointer;    c. int* pointer;          d. pointer int; 
Câu 9: Để lấy địa chỉ của một biến trong C và gán cho một con trỏ, bạn sử dụng toán tử nào?    a. *            b. &    c. ->            d. .    
Câu 10: Khi một con trỏ được khai báo, nó sẽ trỏ đến?    a. Giá trị ngẫu nhiên        b. Giá trị 0   
c. Không trỏ đến đâu cả     
d. Đến địa chỉ của biến null 
Câu 11: Để giải phóng bộ nhớ được cấp phát cho một con trỏ, bạn sử dụng hàm nào?    a. free()          b. malloc()    c. allocate()          d. deallocate()  Câu 12:  
Cho đoạn chương trình như sau:      lOMoAR cPSD| 58605085   int x = 5,y = 3;     
int *a = &x, *b = &y;      int c = *x + *y;  
Cho biết giá trị của c sau khi kết thúc đoạn chương trình trên    a. 3.            b. 4.    c. 5.            d. Tất cả đều sai.  Câu 13:  
Cho đoạn chương trình như sau:    int x = 5,y = 3;     
int *a = &x, *b = &y;      *a = *b;  int c = x + y;  
Cho biết giá trị của c sau khi kết thúc đoạn chương trình trên    a. 4.            b. 5.    c. 6.            d. Tất cả đều sai.    
Đoạn chương trình sau dùng cho 2 câu dưới:   int M[3] = {-1,9,6};  int S = 0;  
for (int i = 2;i>=0;i--)   { if (M[i]%2 == 1) S = S +  M[i]; else S = S -  M[i]; printf("%d ",S);   }      
Câu 14: Cho biết giá trị của S sau khi chạy đoạn chương trình trên: :    a. 4.            b. 5.    c. 7.            d. 9. 
Câu 15: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:    a. 6 3 4          b. 6 4 3    c. 3 4 6         
d. Tất cả đều sai.  
Đoạn chương trình sau dùng các câu dưới:       lOMoAR cPSD| 58605085
int M[3][3] = {{-1,4,2},{4,2,7},{1,5,4}}; 
for (int i = 2;i>=0;i--)   { for (int j =  2;j>=0;j--)    { if (M[i][j]>M[j][i])  M[i][j] = M[j][i];    } printf("%d  ",M[i][i]);   }        
Câu 16: Cho biết giá trị của phần tử M[1][1] sau khi chạy đoạn chương trình trên:    a. -1            b. 1    c. 2            d. 4 
Câu 17: Cho biết giá trị của phần tử M[2][0] sau khi chạy đoạn chương trình trên:    a. -1            b. 1    c. 4            d. 5 
Câu 18: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:    a. 4 2            b. 4 2 -1    c. 5 4 2 -1          d. Tất cả đều sai. 
Đoạn chương trình sau dùng các câu dưới:   int M[3][3] = 
{{2,5,2},{1,6,7},{1,5,4}}; int a = 
M[0][0]; for (int i = 0;i<3;i++)   {  
 for (int j = 0;j<3;j++)    {    if (M[i][j]>a)    {    M[i][j] = a;  a = M[i][j];    }  }    
printf("%d ",M[i][i]);   }        
Câu 19: Cho biết giá trị của phần tử M[1][2] sau khi chạy đoạn chương trình trên:    a. 6.            b. 1.    c. 4.            d. 2. 
Câu 20: Cho biết giá trị của phần tử M[2][1] sau khi chạy đoạn chương trình trên:    a. 2.            b. 1.    c. 4.            d. 5.      lOMoAR cPSD| 58605085
Câu 21: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:    a. 4 2 2.          b. 2 2 2.    c. 5 4 2 2.          d. Tất cả đều sai 
Đoạn chương trình sau dùng các câu dưới:   int M[5] = {-1,3,2,4,7}; 
for (int i = 0;i<4;i++)   { 
if (M[i]>M[i+1]) M[i] =  M[i+1];    
else printf("%d",M[i]);   }        
Câu 22: Cho biết giá trị của phần tử M[2] sau khi chạy đoạn chương trình trên:    a. -1.            b. 3.    c. 2.            d. 4. 
Câu 23: Cho biết giá trị của phần tử M[4] sau khi chạy đoạn chương trình trên:    a. 2.            b. 3.    c. 4.            d. 7. 
Câu 24: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:    a. -124          b. -12    c. -13            d. Tất cả đều sai. 
Đoạn chương trình sau dùng các câu dưới:  
int tong = 0, tich = 1; int  M[2][2] = {{-1,4},{2,5}}; 
for (int i = 0;i<2;i++)   { for (int j =  0;j<2;j++)    {  
 if (i > j) tong = tong + M[i][j]; 
else tich = tich * M[i][j];    } printf("%d  ", tong);   }          
Câu 25: Cho biết giá trị của biến tong sau khi chạy đoạn chương trình trên:    a. 1.            b. 2.    c. 3.            d. Tất cả đều sai. 
Câu 26: Cho biết giá trị của biến tich sau khi chạy đoạn chương trình trên:    a. -4.            b. -2.      lOMoAR cPSD| 58605085   c. -10.            d. Tất cả đều sai. 
Câu 27: Cho biết kết quả in ra màn hình sau khi chạy đoạn chương trình trên:    a. 0 2.            b. 0 3.    c. 1 6.            d. Tất cả đều sai.        
BÀI TẬP THỰC HÀNH      Bài 1: 
Viết chương trình tạo một mảng số nguyên 1 chiều 10 phần tử, cho phép người sử dụng nhập 
vào các giá trị cho mảng. Hiển thị mảng sau khi nhập ra màn hình. Bài 2: 
Viết chương trình tạo một mảng số nguyên 2 chiều 3x3 (3 hàng, 3 cột), cho phép người sử dụng 
nhập vào các giá trị cho mảng. Hiển thị mảng ra màn hình theo đúng hàng-cột. Bài 3: 
Tạo sẵn một dữ liệu (mảng M: 1 chiều số nguyên 20 phần tử) có các giá trị ngẫu nhiên. Hiển 
thị mảng ban đầu ra màn hình. 
Thực hiện lọc trung bình x3 theo công thức sau: 
M[i] = (M[i-1] + M[i] + M[i+1])/3     M[0] = (M[0] + M[1])/2      
M[20] = (M[20]+ M[19])/2 Xuất giá 
trị của dữ liệu sau khi lọc ra màn hình.  Bài 4: 
Viết chương trình tạo một mảng số nguyên 1 chiều 10 phần tử với các giá trị cho trước. Cho 
phép nhập giá trị x, tìm và in vị trí phần tử của mảng có giá trị bằng x (Nếu mảng không có 
phần tử bằng với x thì in giá trị “Not found”).        Bài 5 : 
Viết chương trình tạo một mảng số nguyên 1 chiều 100 phần tử với các giá trị ngẫu nhiên. In 
ra màn hình tất cả các giá trị phần tử là duy nhất trong mảng (phần tử duy nhất là phần tử có 
giá trị không trùng với bất kì phần tử nào khác trong mảng). Bài 6: 
Viết chương trình tạo một mảng số nguyên 1 chiều 100 phần tử với các giá trị ngẫu nhiên. Cho 
phép nhập giá trị x, in ra màn hình tất cả các tổ hợp 3 giá trị phần tử có tổng bằng x. Bài 7:      lOMoAR cPSD| 58605085
Viết câu lệnh định nghĩa hàm int Max (int A[], int size) có chức năng tìm giá trị phần tử lớn  nhất trong mảng.  Bài 8 : 
Viết câu lệnh định nghĩa hàm int Find (int A[], int size, int x) có chức năng tính tìm vị trí của 
phần tử có giá trị bằng x (trả về -1 nếu không thấy giá trị phù hợp).  Bài 9: 
Viết câu lệnh định nghĩa hàm void Insert (int A[], int size, int x, int n) có chức năng chèn thêm 
giá trị x vào vị trí n trong mảng.  Bài 10: 
Viết câu lệnh định nghĩa hàm void Delete (int A[], int size, int n) có chức năng xóa phần tử tại  vị trí n trong mảng.   
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – DANH SÁCH LIÊN  KẾT (LINKED LIST)      
CÂU HỎI TRẮC NGHIỆM  
Câu 1: Trong linked list đơn (singly-linked list), mỗi node chứa những phần tử gì?    a) Giá trị dữ liệu       
b) Địa chỉ của node tiếp theo   
c) Địa chỉ của node trước đó      d) Tất cả đều đúng. 
Câu 2: Trong linked list đôi (double-linked list), node cuối cùng thường có con trỏ trỏ đến đâu?    a) NULL          b) Node đầu tiên   
c) Địa chỉ của chính nó      d) Tất cả đều sai 
Câu 3: Loại linked list nào trong đó node cuối cùng sẽ trỏ đến node đầu tiên:    a) Singly linked list        b) Double linked list    c) Circular linked list        d) Tất cả đều sai. 
Câu 4: Chèn một phần tử vào giữa một danh sách liên kết yêu cầu sửa đổi bao nhiêu con trỏ?    a) 1.            b) 2.    c) 3.            d) 4. 
Câu 5: Chèn một phần tử vào cuối một danh sách liên kết yêu cầu sửa đổi bao nhiêu con trỏ?    a) 1.            b) 2.    c) 3.            d) 4.      lOMoAR cPSD| 58605085
Câu 6: Trong trường hợp xóa node đầu tiên của linked list, chúng ta cần làm gì?   
a) Giải phóng bộ nhớ của node đó.   
b) Đặt con trỏ của node tiếp theo là NULL    c) Cả a) và b).          d) Tất cả đều sai. 
Câu 7: Để xóa một node khỏi linked list, cần phải thực hiện? 
a) Đặt con trỏ của node sau nó trỏ đến node trước nó 
b) Đặt con trỏ của node trước nó trỏ đến node sau nó  c) Cả a) và b)  d) Tất cả đều sai. 
Câu 8: Thao tác nào sau đây cần phải xét đến số lượng phần tử của linked list?   
a) Xóa phần tử đầu tiên.     
b) Xóa phần tử cuối cùng.   
c) Chèn phần tử mới vào vị trí đầu tiên.  d) Tất cả đều sai. 
Câu 9: Để chèn thêm node mới vào danh sách liên kết vòng, cần thay đổi giá trị của bao nhiêu  con trỏ (pointer):    a) 1.            b) 2.    c) 3.            d) 4. 
Đoạn chương trình sau dùng cho các câu hỏi tiếp theo:  
void display(struct node* start)  
{ if(start == NULL) return; else 
printf("%d ", start->data); display(start- >next);   }        
Câu 10: Cho biết kết quả in ra màn hình khi chạy đoạn code trên với danh sách liên kết đơn 
chứa giá trị lần lượt 1->2->3->4:    a. 1 2 3 4          b. 1 3 1 3    c. 1 3 3 1          d. Tất cả đều sai. 
Câu 11: Cho biết kết quả in ra màn hình khi chạy đoạn code trên với danh sách liên kết đơn 
chứa giá trị lần lượt 1->2->3->4->5:    a. 1 2 3 4 5          b. 1 3 5 5 3 1    c. 1 3 5 1 3 5          d. Tất cả đều sai. 
Đoạn chương trình sau dùng cho các câu hỏi tiếp theo:       lOMoAR cPSD| 58605085
void insert(struct node* start,int value)   { if(start == NULL)  return; if (start->value%2  == 0)  
 { struct node* new_node = (struct node*)malloc(sizeof(struct 
node)); new_node->value = value; new_node->next = start-
>next; start->next = new_node;    } else insert(start- >next,value);   }          
Câu 12: Cho biết kết quả của danh sách liên kết khi gọi hàm insert(head,10) với danh sách 
liên kết đơn chứa giá trị lần lượt 1->2->3->4:    a. 1->2->10->3->4        b. 1->10->2->3->4    c. 1->2->3->10->4        d. Tất cả đều sai.    
Câu 13: Cho biết kết quả của danh sách liên kết khi gọi hàm insert(head,10) với danh sách 
liên kết đơn chứa giá trị lần lượt 2->4->6:    a. 2->4->6    b. 2->4->6->10          c. 2->10->4->6  d. Tất cả đều sai.                 BÀI TẬP  THỰC HÀNH   Bài 1: 
Viết chương trình tạo một danh sách liên kết đơn chứa các giá trị số nguyên. Cho phép người 
sử dụng nhập vào giá trị (10 giá trị) cho danh sách liên kết. Hiển thị giá trị các phần tử của  danh sách ra màn hình.  Bài 2: 
Viết chương trình tạo một danh sách liên kết đơn chứa 10 giá trị số nguyên (SV tự cho các giá 
trị phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm và in ra vị trí phần tử 
trong danh sách có giá trị bằng x. Bài 3: 
Viết chương trình tạo một danh sách liên kết đơn chứa 10 giá trị số nguyên (SV tự cho các giá 
trị phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm và xóa tất cả các phần tử 
trong danh sách có giá trị bằng x. Bài 4:      lOMoAR cPSD| 58605085
Viết câu lệnh định nghĩa hàm Append() có chức năng thêm phần tử mới vào cuối 1 danh sách  liên kết đơn.  Bài 5: 
Viết câu lệnh định nghĩa hàm Insert() có chức năng thêm phần tử mới vào đầu 1 danh sách liên  kết đơn.  Bài 6: 
Viết chương trình tạo một danh sách liên kết đơn 10 phần tử với các giá trị tăng dần (danh sách 
liên kết sắp xếp tăng dần). Tìm và xóa các phần tử trùng lặp có trong danh sách (phần tử trùng 
lặp là phần tử có giá trị bằng với 1 phần tử khác trong danh sách).    Ban đầu: 
Linked_list = 10 -> 11 -> 11 -> 12 -> 12 -> 21 -> 43   Sau khi xóa: 
Linked_list = 10 -> 11 -> 12 -> 21 -> 43 Bài  7: 
Viết chương trình tạo một danh sách liên kết đơn 10 phần tử với giá trị ngẫu nhiên (danh sách 
liên kết sắp xếp không được sắp xếp). Tìm và xóa các phần tử trùng lặp có trong danh sách 
(phần tử trùng lặp là phần tử có giá trị bằng với 1 phần tử khác trong danh sách).    Ban đầu: 
Linked_list = 12 -> 11 -> 12 -> 21 -> 41 -> 43 -> 21     Sau khi xóa: 
Linked_list = 12 -> 11 -> 21 -> 41 -> 43  
Bài 8 : Viết câu lệnh định nghĩa hàm Max() có chức năng tìm giá trị phần tử lớn nhất trong 
một danh sách liên kết đơn. 
Bài 9: Viết câu lệnh định nghĩa hàm void Print() có chức năng in ra màn hình giá trị n phần 
tử đầu tiên trong 1 danh sách liên kết. 
Bài 10: Viết câu lệnh định nghĩa hàm void Copy() có chức năng sao chép giá trị phần tử từ 1 
mảng sang 1 danh sách liên kết.          lOMoAR cPSD| 58605085
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – STACK & QUEUE      
CÂU HỎI TRẮC NGHIỆM  
Câu 1: Stack là các cấu trúc dữ liệu lưu trữ các phần tử theo cơ chế nào?    a) FIFO (First In, First Out)      b) LIFO (Last In, First Out)    c) LILO (Last In, Last Out)      d) FILO (First In, Last Out). 
Câu 2: Trong stack, phần tử cuối cùng được thêm vào được gọi là gì?    a) Top            b) Front    c) Rear          d) Bottom 
Câu 3: Phép toán nào không phải là phép cơ bản trong stack?    a) Push          b) Pop    c) Peek          d) Remove 
Câu 4: Chèn thêm một phần tử vào stack yêu cầu sửa đổi bao nhiêu con trỏ?    a) 1.            b) 2.    c) 3.            d) 4. 
Câu 5: Trong ngăn xếp (stack), phần tử nào được xóa đầu tiên?    a) Phần tử đầu          b) Phần tử cuối    c) Phần tử ở giữa        d) Tất cả đều sai 
Câu 6: Ngăn xếp (stack) thường được sử dụng trong trường hợp nào sau đây? a) 
Khi cần thực hiện tìm kiếm phần tử trong danh sách 
b) Khi cần thực hiện tính toán toán học phức tạp 
c) Khi cần thực hiện các thao tác theo nguyên tắc LIFO 
d) Khi cần sắp xếp dữ liệu theo thứ tự tăng dần. Câu 7: Hàng đợi (Queue) hoạt động theo  nguyên tắc nào?    a) LIFO (Last-In, First-Out)      b) FIFO (First-In, First-Out)    c) LILO (Last-In, Last-Out)      d) FILO (First-In, Last-Out) 
Câu 8: Hàng đợi (Queue) có thể được triển khai bằng cấu trúc dữ liệu nào sau đây?    a) Mảng (array)       
b) Danh sách liên kết đơn (singly linked list)    c) Cả hai          d) Tất cả đều sai.         lOMoAR cPSD| 58605085
Câu 9: Trong hàng đợi (Queue), phần tử nào được xóa đầu tiên?   
a) Phần tử đầu danh sách     
b) Phần tử cuối danh sách   
c) Phần tử ở giữa danh sách      d) Phần tử ngẫu nhiên    
Cho 1 Stack có 5 phần tử giá trị lần lượt {1,2,3,4,5}. Cho đoạn câu lệnh sau:  
Push(1); Pop(); Push(2); Push(3); Pop(); Push(4);  Pop(); Pop(); Push(5);      
Câu 10: Số phần tử của Stack sau khi chạy đoạn lệnh trên:    a. 5            b. 4    c. 3            d. Tất cả đều sai. 
Câu 11: Giá trị của phần tử trên cùng (Top) của Stack:    a. 3            b. 4    c. 5            d. Tất cả đều sai. 
Cho 1 Queue có 5 phần tử giá trị lần lượt {1,2,3,4,5}. Cho đoạn câu lệnh sau:  
Push(1); Pop(); Push(2); Push(3); Pop(); Push(4);  Pop(); Pop(); Push(5);      
Câu 12: Số phần tử của Queue sau khi chạy đoạn lệnh trên:    a. 5            b. 4    c. 3            d. Tất cả đều sai. 
Câu 13: Giá trị của phần tử đầu tiên (First) của Queue:    a. 3            b. 4    c. 5            d. Tất cả đều sai.        
BÀI TẬP THỰC HÀNH   Bài 1: 
Viết chương trình tạo 1 ngăn xếp A (Stack) và 1 hàng đợi B (Queue) chứa các giá trị số nguyên. 
Cho phép người sử dụng nhập vào giá trị (10 giá trị), thêm các giá trị này vào A và B. Hiển thị 
giá trị các phần tử của A và B ra màn hình.         lOMoAR cPSD| 58605085
Bài 2: Viết chương trình tạo một Stack A chứa 10 giá trị số nguyên (SV tự cho các giá trị 
phần tử). Cho phép người sử dụng nhập vào 1 số nguyên x. Kiểm tra xem trong A có phần tử 
nào có giá trị bằng x hay không. Bài 3: 
Viết chương trình tạo một Queue A chứa 10 giá trị số nguyên (SV tự cho các giá trị phần tử). 
Cho phép người sử dụng nhập vào 1 số nguyên x. Tìm và đếm số lần xuất hiện của x trong A.  Bài 4: 
Viết chương trình cho phép người sử dụng nhập vào 1 giá trị số nguyên x. Chuyển số nguyên 
x sang hệ nhị phân (Binary) sử dụng Stack. In kết quả ra màn hình.    Nhập:    x = 20     Hiển thị:  Binary = 10100   Bài 5: 
Viết câu lệnh định nghĩa hàm void Print() có chức năng in ra màn hình giá trị n phần tử đầu 
tiên trong 1 Queue.   Bài 6: 
Viết câu lệnh định nghĩa hàm Max() có chức năng tìm giá trị phần tử lớn nhất trong một hàng  đợi Queue.  Bài 7: 
Viết câu lệnh định nghĩa hàm void Copy() có chức năng sao chép giá trị phần tử từ 1 mảng sang  1 Stack.  Bài 8: 
Viết chương trình cho phép người sử dụng nhập vào 1 phép toán dưới dạng chuỗi kí tự (string). 
Chuyển biểu thức sang dạng Pre-fix và Post-fix sử dụng Stack. In biểu thức sau khi chuyển đổi 
ra màn hình (dưới dạng chuỗi kí tự).    Nhập:    A + B * (C – D)     Hiển thị:  Prefix: ABCD-*+         Postfix: +*DCBA      
CHƯƠNG 3: CẤU TRÚC DỮ LIỆU CƠ BẢN – TREE & GRAPH      
CÂU HỎI TRẮC NGHIỆM  
Câu 1: Cây (Tree) là gì trong cấu trúc dữ liệu và giải thuật?      lOMoAR cPSD| 58605085
a) Một tập hợp các nút liên kết với nhau theo một cấu trúc tuyến tính. 
b) Một tập hợp các nút không có liên kết với nhau. 
c) Một tập hợp các nút liên kết với nhau theo cấu trúc không tuyến tính. 
d) Một tập hợp các nút được sắp xếp thành một dãy. 
Câu 2: Trong một cây, nút không có nút con nào được gọi là gì?  a) Nút gốc (Root)        b) Nút lá (Leaf)  c) Nút con (Child)       
d) Nút trung gian (Intermediate) 
Câu 3: Độ sâu của một nút trong cây là gì? 
a) Số lượng nút từ nút đó đến nút gốc. 
b) Số lượng nút con của nút đó. 
c) Số lượng nút con của nút gốc.   
d) Số lượng nút trong cây. 
Câu 4: Độ cao của một cây là gì? 
a) Số lượng nút từ nút gốc đến nút lá xa nhất. b) Số lượng nút trong cây. 
c) Số lượng nút con của nút gốc.   
d) Số lượng nút con của nút lá. 
Câu 5: Loại cây nào có đặc điểm là mỗi nút có không quá hai nút con?   
a) Cây nhị phân (Binary Tree)   
b) Cây nhị phân tìm kiếm (BST)   
c) Cây cân bằng (Balanced Tree)   
d) Cây hợp nhất (Merge Tree) 
Câu 6: Trong cây nhị phân, nút nào là nút nằm trên cùng của một nhánh và không có nút con?    a) Nút lá (Leaf)        b) Nút gốc (Root)   
c) Nút trung gian (Intermediate)    d) Nút cha (Parent) 
Câu 7: Đồ thị (Graph) là gì trong cấu trúc dữ liệu và giải thuật? 
a) Một tập hợp các đỉnh (vertex) được kết nối bởi các cạnh (edge). 
b) Một tập hợp các cạnh không có đỉnh nào. 
c) Một tập hợp các đỉnh không có cạnh nào. 
d) Một tập hợp các đỉnh và các nút.    
Câu 8: Loại đồ thị nào mà mỗi cặp đỉnh đều được kết nối bởi một cạnh không hướng? a) 
Đồ thị vô hướng (Undirected Graph) b) Đồ thị có hướng (Directed Graph)   
c) Đồ thị trống (Empty Graph)   
d) Đồ thị đơn (Simple Graph) 
Câu 9: Trong đồ thị có hướng, cạnh nào chỉ đi từ đỉnh A đến đỉnh B mà không thể đi ngược lại từ B  đến A?   
a) Cạnh liên kết (Connecting Edge)    b) Cạnh kép (Double Edge)      lOMoAR cPSD| 58605085
c) Cạnh hướng (Directed Edge) 
d) Cạnh đồng hướng (Parallel Edge) Câu 10: Trong 
đồ thị, một nhóm các đỉnh được kết nối với nhau bởi các cạnh được gọi là gì? a) Đồ thị con  (Subgraph)     
b) Đồ thị kết nối (Connected Graph) 
c) Đồ thị con liên thông (Connected Subgraph) d) Đồ thị con không liên thông Câu 
11: Trong cây nhị phân, nút nào là nút cha của nút con được gọi là "trái"?   
a) Nút có chỉ số thấp hơn     
b) Nút có chỉ số cao hơn    c) Nút có chỉ số chẵn        d) Nút có chỉ số lẻ 
Câu 12: Cây B-Tree là một cấu trúc dữ liệu phân tán được sử dụng chủ yếu để làm gì?   
a) Tìm kiếm và sắp xếp dữ liệu   
b) Lưu trữ và truy xuất dữ liệu từ cơ sở dữ liệu lớn   
c) Xử lý dữ liệu dạng cây     
d) Tạo ra các cấu trúc dữ liệu phức tạp 
Câu 13: Trong cây B-Tree, nút nào được gọi là nút gốc?   
a) Nút có chỉ số thấp nhất     
b) Nút có chỉ số cao nhất   
c) Nút ở tầng trên cùng     
d) Nút ở tầng dưới cùng 
Câu 14: Trong cây B-Tree, nút nào là nút lá?    a) Nút không có con       
b) Nút có nhiều hơn một con   
c) Nút có một con duy nhất      d) Nút gốc 
Câu 15: Trong cây B-Tree, khóa được sắp xếp như thế nào trong mỗi nút?    a) Không cần sắp xếp        b) Tăng dần    c) Giảm dần          d) Ngẫu nhiên 
Câu 16: Trong cây nhị phân tìm kiếm, điều gì đảm bảo rằng mỗi nút trong cây có giá trị lớn hơn tất 
cả các nút trong cây con bên trái và nhỏ hơn tất cả các nút trong cây con bên phải của nó? a) Thuộc 
tính BST (Binary Search Tree) 
b) Thuộc tính AVL (Adelson-Velsky và Landis) 
c) Thuộc tính Red-Black Tree  d) Thuộc tính Heap 
Câu 17: Cho Graph sau, phát biểu nào là đúng?