理论卷2025年12月GESP等级认证(C++) · 五级

GESP C++ 5级 2025.12

满分 100 · 及格 60 · 时长 60 分钟 · 共 27 题 (单选15 / 判断10 / 编程题2)
试卷阅览 · 免费预览前 10 题 · 交卷后可查看答案与解析
1
单选题号 #10971
分值 2

对如下定义的循环单链表,横线处填写( )。

// 循环单链表的结点
struct Node {
 int data; // 数据域
 Node* next; // 指针域

 Node(int d) : data(d), next(nullptr) {}
};

// 创建一个只有一个结点的循环单链表
Node* createList(int value) {
 Node* head = new Node(value);
 head->next = head;
 return head;
}

// 在循环单链表尾部插入新结点
void insertTail(Node* head, int value) {
 Node* p = head;
 while (p->next != head) {
 p = p->next;
 }
 Node* node = new Node(value);
 node->next = head;
 p->next = node;
}

// 遍历并输出循环单链表
void printList(Node* head) {
 if (head == nullptr) return;

 Node* p = head;
 _______________________ //在此处填入代码 
 cout << endl;
}
A
while (p != nullptr){
 cout data next;
}
B
while (p->next != nullptr){
 cout data next;
}
C
do {
 cout data next;
} while (p != head);
D
for ( ; p ; p = p->next ) {
 cout data << " ";
}
2
单选题号 #10972
分值 2

区块链技术是比特币的基础。在区块链中,每个区块指向前一个区块,构成链式列表,新区块只能接在链尾,不允许在中间插入或删除。下面代码实现插入区块添加函数,则横线处填写( )。

//区块(节点)
struct Block {
 int index; // 区块编号(高度)
 string data; // 区块里保存的数据
 Block* prev; // 指向前一个区块

 Block(int idx, const string& d, Block* p) : index(idx), data(d), prev(p) {}
};

// 区块链
struct Blockchain {
 Block* tail;

 // 初始化
 void init() {
 tail = new Block(0, "Genesis Block", nullptr);
 }

 // 插入新区块
 void addBlock(const string& data) {
 _______________________ //在此处填入代码 
 }
 // 释放内存

 void clear() {
 Block* cur = tail;
 while (cur != nullptr) {
 Block* p = cur->prev;
 delete cur;
 cur = p;
 }
 tail = nullptr;
 }
};
A
Block* newBlock = new Block(tail->index + 1, data, tail);
tail = newBlock->prev;
B
Block* newBlock = new Block(tail->index + 1, data, tail);
tail = newBlock;
C
Block* newBlock = new Block(tail->index + 1, data, tail->prev);
tail = newBlock;
D
Block* newBlock = new Block(tail->index + 1, data, tail->prev);
tail = newBlock->prev;
3
单选题号 #10973
分值 2

下面关于单链表和双链表的描述中,正确的是( )。

struct DNode {
 int data;
 DNode* prev;
 DNode* next;
};

// 在双链表中删除指定节点
void deleteNode(DNode* node) {
 if (node->prev) {
 node->prev->next = node->next;
 }
 if (node->next) {
 node->next->prev = node->prev;
 }
 delete node;
}

struct SNode {
 int data;
 SNode* next;
};

// 在单链表中删除指定节点
void deleteSNode(SNode* head, SNode* node) {
 SNode* prev = head;
 while (prev->next != node) {
 prev = prev->next;
 }
 prev->next = node->next;
 delete node;
}
A

双链表删除指定节点是 O(1)O(1),单链表是 O(1)O(1)

B

双链表删除指定节点是 O(n)O(n),单链表是 O(1)O(1)

C

双链表删除指定节点是 O(1)O(1),单链表是 O(n)O(n)

D

双链表删除指定节点是 O(n)O(n),单链表是 O(n)O(n)

4
单选题号 #10974
分值 2

假设我们有两个数 a=38a=38 和 b=14b=14,它们对模 mm 同余,即 a≡b(modm)a \equiv b \pmod m。以下哪个值不可能是 mm?

A

3

B

4

C

6

D

9

5
单选题号 #10975
分值 2

下面代码实现了欧几里得算法。下面有关说法,错误的是( )。

int gcd1(int a, int b) {
 return b == 0 ? a : gcd1(b, a % b);
}

int gcd2(int a, int b) {
 while (b != 0) {
 int temp = b;
 b = a % b;
 a = temp;
 }
 return a;
}
A

gcd1() 实现为递归方式。

B

gcd2() 实现为迭代方式。

C

当 aa 较大时,gcd1() 实现会多次调用自身,需要较多额外的辅助空间。

D

当 aa 较大时,gcd1() 的实现比 gcd2() 执行效率更高。

6
单选题号 #10976
分值 2

唯一分解定理描述的内容是( )。

A

任何正整数都可以表示为两个素数的和。

B

任何大于 11 的合数都可以唯一分解为有限个质数的乘积。

C

两个正整数的最大公约数总是等于它们的最小公倍数除以它们的乘积。

D

所有素数都是奇数。

7
单选题号 #10977
分值 2

下述代码实现素数表的线性筛法,筛选出所有小于等于 nn 的素数,则横线上应填的代码是( )。

vector linear_sieve(int n) {
 vector is_prime(n +1, true);
 vector primes;

 is_prime[0] = is_prime[1] = 0; //0和1两个数特殊处理
 for (int i = 2; i <= n; ++i) {
 if (is_prime[i]) {
 primes.push_back(i);
 }
 ________________________________ { // 在此处填入代码 
 is_prime[ i * primes[j] ] = 0;
 if (i % primes[j] == 0)
 break;
 }
 }

 return primes;
}
A

for (int j = 0; j < primes.size() && i * primes[j] <= n; j++)

B

for(int j = sqrt(n); j <= n && i * primes[j] <= n; j++)

C

for (int j = 1; j <= sqrt(n); j++)

D

for(int j = 1; j < n && i * primes[j] <= n; j++)

8
单选题号 #10978
分值 2

下列关于排序的说法,正确的是( )。

A

快速排序是稳定排序。

B

归并排序通常是稳定的。

C

插入排序是不稳定排序。

D

冒泡排序不是原地排序。

9
单选题号 #10979
分值 2

下面代码实现了归并排序。下述关于归并排序的说法中,不正确的是( )。

void merge(vector& arr, vector& temp, int l, int mid, int r) {
 int i = l, j = mid + 1, k = l;
 while (i & arr, vector& temp, int l, int r) {
 if (l >= r) return;
 int mid = l + (r - l) / 2;
 mergeSort(arr, temp, l, mid);
 mergeSort(arr, temp, mid + 1, r);
 merge(arr, temp, l, mid, r);
}
A

归并排序的平均复杂度是 O(nlog⁡n)O(n \log n)

B

归并排序需要 O(n)O(n) 的额外空间

C

归并排序在最坏情况的时间复杂度是 O(n2)O(n^2)

D

归并排序适合大规模数据

10
单选题号 #10980
分值 2

下述 C++ 代码实现了快速排序算法,最坏情况的时间复杂度是( )。

int partition(vector& arr, int low, int high) {
 int i = low, j = high;
 int pivot = arr[low]; // 以首元素为基准
 while (i = pivot) j--;
 while (i & arr, int low, int high) {
 if (low >= high) return;
 int p = partition(arr, low, high);
 quickSort(arr, low, p - 1);
 quickSort(arr, p + 1, high);
}
A

O(n)O(n)

B

O(log⁡n)O(\log n)

C

O(n2)O(n^2)

D

O(nlog⁡n)O(n\log n)

🔒

已解锁前 10 题

第 11~27 题(共 17 题)需开通题库会员或使用积分包作答
本卷为 VIP 试卷:需开通题库会员(无限刷)或购买积分包(每题 1 积分);已购长期正课学员自动享有权益
海小星AI平台海小星AI平台

点亮AI梦想,编程未来之星。专业的青少年AI编程教育平台。

课程方向

  • AIGC人工智能
  • Scratch图形化
  • Python编程
  • C++/NOIP竞赛

联系我们

  • 北京市西城区万博苑7号楼3层F28室
  • +86-010-83553010
  • contact@seanova.cn

© 2026 海小星AI平台|京ICP备2022032747号

隐私政策服务条款