220 câu trắc nghiệm Cấu trúc dữ liệu và giải thuật
Nhằm giúp các bạn ôn tập và hệ thống lại kiến thức nhanh chóng để đạt kết quả cao trong kì thi sắp tới, tracnghiem.net tổng hợp và chia sẻ đến các bạn 220 câu trắc nghiệm Cấu trúc dữ liệu và giải thuật (có đáp án). Hi vọng sẽ trở thành nguồn tài liệu bổ ích giúp các bạn học tập và nghiên cứu một cách tốt nhất. Để ôn tập hiệu quả các bạn có thể ôn theo từng phần trong bộ câu hỏi này bằng cách trả lời các câu hỏi và xem lại đáp án và lời giải chi tiết. Sau đó các bạn hãy chọn mục "Thi thử" để hệ thống lại kiến thức đã ôn. Chúc các bạn thành công với bộ đề "Cực Hot" này nhé.
Chọn hình thức trắc nghiệm (20 câu/20 phút)
Chọn phần
-
Câu 1:
Cấu trúc dữ liệu nào tương ứng với LIFO:
A. Queue
B. Linked List
C. Tree
D. Stack
-
Câu 2:
Lựa chọn câu đúng nhất về danh sách liên kết đôi (Doubly Linked List):
A. Vùng liên kết của một phần tử trong danh sách liên đôi có 02 mối liên kết với 01 phần tử khác trong danh sách
B. Vùng liên kết của một phần tử trong danh sách liên đôi có 01 mối liên kết với 02 phần tử khác trong danh sách
C. Vùng liên kết của một phần tử trong danh sách liên đôi có 02 mối liên kết với 02 trước và sau nó trong danh sách
D. Vùng liên kết của một phần tử trong danh sách liên đôi có 02 mối liên kết với phần tử đầu và cuối của danh sách
-
Câu 3:
Cho thuật toán tìm nhị phân không đệ quy sau:
int NRecBinarySearch (int M[], int N, int X)
{ int First = 0;
int Last = N – 1;
while (First <= Last)
{
int Mid = (First + Last)/2;
if (X == M[Mid])
return(Mid);
if (X < M[Mid])
Last = Mid – 1;
else
First = Mid + 1;
}
return(-1);
}
Chọn câu đúng nhất trong trường hợp tốt nhất khi phần tử ở giữa của mảng có giá trị bằng X:
A. Số phép gán: Gmin = 3 Số phép so sánh: Smin = 2
B. Số phép gán: Gmin = 2 Số phép so sánh: Smin = 3
C. Số phép gán: Gmin = 2 Số phép so sánh: Smin = 2
D. Số phép gán: Gmin = 0 Số phép so sánh: Smin = 2
-
Câu 4:
Cho thuật toán sắp xếp Bubble Sort như sau:
void BubbleSort(int M[], int N)
{
for (int I = 0; I < N-1; I++)
for (int J = N-1; J > I; J--)
if (M[J] < M[J-1])
Swap(M[J], M[J-1]);
return;
}
Chọn câu đúng nhất cho hàm Swap
A. void Swap(int &X, int &Y) { int Temp = X; X = Y; Y = Temp; return; }
B. void Swap(float X, floatY) { int Temp = X; X = Y; Y = Temp; return; }
C. void Swap(int *X, int *Y) { int Temp = X; X = Y; Y = Temp; return; }
D. void Swap(int X, intY) { int Temp = X; X = Y; Y = Temp; return; }
-
Câu 5:
Cho cây biểu thức sau:
Chọn biểu thức tương ứng với cây
A. (2 * (4 + (5 + 3)))
B. . (4 * (2+ (5 + 3)))
C. (2 * (3 + (5 +4)))
D. (2 * (5 + (4+ 3)))
-
Câu 6:
Cho thuật toán sau:
int LinearSearch (int M[], int N, int X)
{ int k = 0;
while (M[k] != X k < N )
k++;
if (k < N )
return (k);
return (-1);
}
Chọn câu đúng nhất trong trường hợp xấu nhất khi không tìm thấy phần tử nào có giá trị bằng X:
A. Số phép gán: Gmax = 1 Số phép so sánh: Smax = 2N+1
B. Số phép gán: Gmax = 2 Số phép so sánh: Smax = 2N+1
C. Số phép gán: Gmax = 1 Số phép so sánh: Smax = 2N+2
D. Số phép gán: Gmax = 1 Số phép so sánh: Smax = N+2
-
Câu 7:
Cho thuật toán sau:
int LinearSearch (float M[], int N, float X)
{
int k = 0;
M[N] = X;
while (M[k] != X) //n+1 lan
(M[k] != X) //n+1 lan k++;
if (k < N)
return (k);
return (-1);
}
Chọn câu đúng nhất trong trường hợp xấu nhất khi không tìm thấy phần tử nào có giá trị bằng X:
A. Số phép gán: Gmax = 1 Số phép so sánh: Smax = N + 2
B. Số phép gán: Gmax = 2 Số phép so sánh: Smax = N + 2
C. Số phép gán: Gmax = 2 Số phép so sánh: Smax = N + 1
D. Số phép gán: Gmax = 2 Số phép so sánh: Smax =2 N + 2
-
Câu 8:
Cấu trúc dữ liệu cho kiểu dữ liệu sinh viên như sau:
typedef struct tagSV{
char MSSV[8];
char Ten[30];
char NgaySinh[11];
float DTB;
}SV;
Khai báo
SV sv1, *sv2;
Lựa chọn các câu đúng nhất để gán giá trị cho mã sinh viên của sv1 và sv2:
A. sv1.MSSV = “Nguyen Van A”; sv2.MSSV = “Nguyen Van B”;
B. sv1.MSSV = “Nguyen Van A”; sv2->MSSV = “Nguyen Van B”;
C. sv1->MSSV = “Nguyen Van A”; sv2->MSSV = “Nguyen Van B”;
D. sv1->MSSV = “Nguyen Van A”; sv2.MSSV = “Nguyen Van B”;
-
Câu 9:
Với thủ tục như sau:
void operation()
{
int x,a[10],n;
int x,m,l,h,flag=0;
cout<<"Enter the element to be searched:";
cin>>x;
l=0; h=n-1;
while(l<=h)
{
m=(l+h)/2;
if(x==a[m]) {
lag=1; break;
}
else if(x>a[m])
l=m+1;
else if(x<a[m])
h=m-1;
}
if(flag==0)
cout<<"ABSENT";
else
cout<<"PRESENT";
}
Lựa chọn câu đúng nhất để mô tả thủ tục trên
A. Thủ tục tìm nhị phân phần tử được nhập từ bàn phím, nếu tìm thấy sẽ thông báo ABSENT
B. Thủ tục tìm nhị phân phần tử được nhập từ bàn phím, nếu không tìm thấy sẽ thông báo ABSENT
C. Thủ tục tìm tuyến tính phần tử được nhập từ bàn phím, nếu tìm thấy sẽ thông báo ABSENT
D. Thủ tục tìm tuyến tính phần tử được nhập từ bàn phím, nếu không tìm thấy sẽ thông báo ABSENT
-
Câu 10:
Biểu diễn và tổ chức ngăn xếp (Stack) bằng danh sách liên kết giả sử bề mặt của ngăn xếp là đầu danh sách liên kết:
typedef struct SElement
{ T Key;
SElement *Next;
} SOneElement;
typedef struct SOneElement *SSTACK;
SSTACK SSP;
Thêm 1 phần tử vào ngăn xếp (dùng cấu trúc dữ liệu mô tả ở trên)
B1: NewElement = Khởi tạo nút mới (dùng toán tử new)
B2: if (NewElement == NULL)
Thực hiện BKT
B3: if (SSP == NULL)
B3.1: SSP = NewElement
B3.2: Thực hiện BKT
B4: …………………………………………
B5: …………………………………………
BKT: Kết thúc
Chọn câu lệnh chính xác cho B4 và B5
A. B4: NewElement ->Next = SSP SSP = NewElement
B. B4: SSP = NewElement ->Next B5: SSP = NewElement
C. B4: SSP = NewElement ->Next B5: NewElement = SSP
D. B4: NewElement ->Next = SSP B5: NewElement = SSP
-
Câu 11:
Cấu trúc dữ liệu biểu diễn hàng đợi bằng danh sách liên kết:
typedef struct QElement
{ T Key;
QElement *Next;
} QOneElement;
typedef QElement *QType;
Cấu trúc dữ liệu quản lý hàng đợi bằng hai phần tử đầu (Front) và cuối (Rear):
typedef struct QPElement
{ QType Font;
QType Rear;
} SQUEUE;
SQUEUE SQList;
Thêm phần tử vào sau phần tử Rear. Giả sử dữ liệu đưa vào hàng đợi là NewData, mã giả được mô tả như sau:
B1: NewElement = Khởi tạo nút mới có thành phần NewData
B2: IF (NewElement == NULL)
Thực hiện BKT
B3: IF (SQList.Front == NULL) // hàng đợi dang rỗng
B3.1: SQList.Front = SQList.Rear = NewElement
B3.2: Thực hiện BKT
B4: …………………………………………..
B5: …………………………………………..
BKT: Kết thúc
Chọn câu đúng nhất cho bước B4, B5
A. B4: SQList.Front->Next = NewElement B5: SQList.Front = NewElement
B. B4: SQList.Rear->Next = NewElement B5: SQList.Rear = NewElement
C. B4: NewElement = SQList.Rear->Next B5: SQList.Rear = NewElement
D. B4: NewElement = SQList.Front->Next B5: SQList.Font = NewElement
-
Câu 12:
Chọn định nghĩa đúng nhất về hàng đợi (Queue):
A. Hàng đợi còn được gọi là danh sách FILO và cấu trúc dữ liệu này còn được gọi cấu trúc FILO (First In Last Out)
B. Hàng đợi là một danh sách mà trong đó thao tác thêm 1 phần tử vào trong danh sách được thực hiện 1 đầu này và lấy 1 phần tử trong danh sách lại thực hiện bởi đầu kia
C. Hàng đợi là một danh sách mà trong đó thao tác thêm 1 phần tử hay hủy một phần tử trong danh sách được thực hiện 1 đầu
D. Hàng đợi phải là một danh sách liên kết đơn
-
Câu 13:
Chiều dài đường đi của một cây (path’s length of the tree) được định nghĩa là tổng tất cả các chiều dài đường đi của tất cả các nút trên cây. Xét cây sau:
A. Chiều dài đường của cây trên là 63
B. Chiều dài đường của cây trên là 64
C. Chiều dài đường của cây trên là 65
D. Chiều dài đường của cây trên là 66
-
Câu 14:
Chọn định nghĩa đúng nhất đối với cây nhị phân tìm kiếm:
A. Cây nhị phân tìm kiếm là cây nhị phân có thành phần khóa của mọi nút lớn hơn thành phần khóa của tất cả các nút trong cây con trái của nó và nhỏ hơn thành phần khóa của tất cả các nút trong cây con phải của nó
B. Cây nhị phân tìm kiếm là cây nhị phân có thành phần khóa của mọi nút nhỏ hơn thành phần khóa của tất cả các nút trong cây con trái của nó và nhỏ hơn thành phần khóa của tất cả các nút trong cây con phải của nó
C. Cây nhị phân tìm kiếm là cây nhị phân có thành phần khóa của mọi nút lớn hơn thành phần khóa của tất cả các nút trong cây con trái của nó và lớn hơn thành phần khóa của tất cả các nút trong cây con phải của nó.
D. Cây nhị phân tìm kiếm chính là cây nhị phân
-
Câu 15:
Chọn định nghĩa đúng nhất về cây cân bằng tương đối:
A. Cây cân bằng tương đối là một cây nhị phân thỏa mãn điều kiện là đối với mọi nút của cây thì số nút của cây con trái và số nút của cây con phải của nút đó hơn kém nhau không quá 1. Cây cân bằng tương đối còn được gọi là cây AVL (AVL tree)
B. Cây cân bằng tương đối là một cây N phân thỏa mãn điều kiện là đối với mọi nút của cây thì chiều cao của cây con trái và chiều cao của cây con phải của nút đó hơn kém nhau không quá 2. Cây cân bằng tương đối còn được gọi là cây AVL (AVL tree)
C. Cây cân bằng tương đối là một cây nhị phân thỏa mãn điều kiện là đối với mọi nút của cây thì chiều cao của cây con trái và chiều cao của cây con phải của nút đó hơn kém nhau không quá 1. Cây cân bằng tương đối còn được gọi là cây AVL (AVL tree)
D. Cây cân bằng tương đối cũng là cây cân bằng hoàn toàn
-
Câu 16:
Định nghĩa cấu trúc dữ liệu của danh sách liên kết đơn được mô tả như sau:
struct Node
{
int Key; Node *
NextNode;
} OneNode;
Trong đó, khai báo Node * NextNode; dùng để mô tả
A. Con trỏ trỏ tới phần dữ liệu
B. Vùng liên kết quản lý địa chỉ phần tử kế tiếp
C. Con trỏ trỏ tới phần dữ liệu cuối của danh sách
D. Vùng liên kết quản lý địa chỉ phần tử kế tiếp của phần tử cuối
-
Câu 17:
Khi cần thêm một phần tử có giá trị thành phần dữ liệu là NewData (là một số nguyên) vào đầu của danh sách liên kết đơn dùng thuật toán có mã giả mô tả như dưới đây?
typedef struct Node
{
int Data; Node * NextNode;
} OneNode; typedef OneNode * SLLPointer;
SLLPointer SSList;
B1: NewNode = new OneNode
B2: IF (NewNode = NULL) Thực hiện BKT
B3: NewNode ->NextNode = NULL
B4: NewNode ->Data = NewData B5: NewNode->NextNode = SLList
B6: SLList = NewNode BKT: Kết thúc
Tìm mô tả chính xác cho B5
A. Chuyển vai trò đứng đầu của NewNode cho SLList
B. Nối NewNode vào sau SLList
C. Chuyển vai trò đứng đầu của SLList cho NewNode
D. Nối SLList vào sau NewNode
-
Câu 18:
Tìm kiếm xem trong danh sách liên kết đơn có tồn tại nút có thành phần dữ liệu là SearchData hay không. Thao tác này chúng ta vận dụng thuật toán tìm tuyến tính để tìm kiếm:
typedef struct Node
{
int Data;
Node * Link;
} OneNode;'
typedef OneNode * Pointer;
Pointer SSList; // Quản lý danh sách liên kết đơn bởi 1 phần tử đầu
B1: CurNode = SLList
B2: IF (………………………………………………)
Thực hiện BKT
B3: CurNode = CurNode->Link
B4: Lặp lại B2
BKT: Kết thúc
Chọn điều kiện hợp lý cho mã giả ở B2
A. CurNode != NULL OR CurNode->Data = SearchData
B. CurNode = NULL OR CurNode->Data != SearchData
C. CurNode = NULL OR CurNode->Data = SearchData
D. CurNode != NULL OR CurNode->Data != SearchData
-
Câu 19:
Cho cấu trúc dữ liệu như sau:
typedef struct Node
{
int Key;
Node *NextNode;
} OneNode;
typedef SLLOneNode * Type;
Thuật toán chọn trực tiếp viết trên ngôn ngữ C++ áp dụng cho danh sách liên kết đơn quản lý bởi một phần tử đầu tiên được mô tả:
void StraightSelection(Type &SList)
{
Type MinNode;
int Temp;
Type CurrNode,TempNode;
CurrNode = SList;
while (CurrNode!=NULL)
{
TempNode = CurrNode->NextNode;
MinNode = CurrNode;
while (TempNode!=NULL)
{
TempNode = CurrNode->NextNode;
MinNode = CurrNode;
while (TempNode!=NULL)
{
if (………………………………………………)
MinNode = TempNode;
TempNode = TempNode->NextNode;
}
[1] Temp = MinNode->Key;
[2] MinNode->Key = CurrNode->Key;
[3] CurrNode->Key = Temp CurrNode=CurrNode->NextNode;
}
}
Tìm mô tả chính xác cho [1], [2], [3]
A. Hoán vị 2 mối liên kết
B. Hoán vị 2 vùng giá trị
C. Hoán vị nút đầu và nút cuối
D. Hoán vị 2 nút kế tiếp nhau
-
Câu 20:
Với cấu trúc dữ liệu như sau:
typedef struct DNode
{
int Key;
DNode * NextNode;
DNode * PreNode;
} DOneNode
typedef DLLOneNode * DPointerType;
typedef struct DPairNode
{ DPointerType DLLFirst;
DPointerType DLLLast;
} DPType;
Hàm thêm phần tử vào cuối danh sách liên kết đôi quản lý bởi 2 phần tử đầu và cuối
DPointerType DLLAddLast(DPType &DList, int NewData)
{
DPointerType NewNode = gọi hàm tạo nút mới có vùng dữ liệu là NewData ;
if (NewNode == NULL)
return (NULL);
if (DList.DLLLast == NULL)
DList.DLLFirst = DList.DLLLast = NewNode;
else
{
……………………………………………….
……………………………………………….
………………………………………………
}
return (NewNode);
} Hãy lựa chọn câu đúng nhất để điền vào chỗ trống ở trên
A. DList.DLLLast ->NextNode = NewNode; NewNode ->PreNode = DList.DLLLast; NewNode = DList.DLLLast;
B. DList.DLLLast ->NextNode = NewNode; DList.DLLLast = NewNode ->PreNode; DList.DLLLast = NewNode;
C. NewNode = DList.DLLLast ->NextNode; NewNode ->PreNode = DList.DLLLast; DList.DLLLast = NewNode;
D. DList.DLLLast ->NextNode = NewNode; NewNode ->PreNode = DList.DLLLast; DList.DLLLast = NewNode;