143、编写一个函数,该函数接受一个整数链表,并重新排列节点,使存储的整数按顺序排列。
使用选择排序算法实现链表排序
可使用选择排序算法实现该功能,以下是具体的函数实现思路和代码示例。
算法思路为:
- 从原链表中逐个移除节点并添加到第二个链表
- 直到所有节点都移到第二个链表
- 此时第二个链表即为有序链表
代码示例
#include <iostream>
// 定义链表节点结构体
struct node {
int data;
node* next;
node(int value) : data(value), next(nullptr) {}
};
// 选择排序函数
void sort_list(node*& head_ptr) {
node* sorted_list = nullptr;
while (head_ptr != nullptr) {
node* max_node = head_ptr;
node* prev_max = nullptr;
node* current = head_ptr;
node* prev = nullptr;
// 找到最大节点
while (current != nullptr) {
if (current->data > max_node->data) {
max_node = current;
prev_max = prev;
}
prev = current;
current = current->next;
}
// 移除最大节点
if (prev_max == nullptr) {
head_ptr = max_node->next;
} else {
prev_max->next = max_node->next;
}
// 将最大节点插入到新链表头部
max_node->next = sorted_list;
sorted_list = max_node;
}
head_ptr = sorted_list;
}
在上述代码中:
- 定义了
node结构体表示链表节点 -
sort_list函数实现了选择排序算法 - 函数通过遍历原链表找到最大节点
- 将其从原链表移除并插入到新链表头部
- 最终原链表为空,新链表即为有序链表
144、描述模板函数的主要目的。
模板函数的主要目的是允许程序使用同一函数处理不同的数据类型,只要这些数据类型具有所需的操作符(如 > 、 == )和拷贝构造函数,避免为每种数据类型单独编写函数。
145、与模板方法相比,使用typedef方法来泛化数据类型有什么缺点?typedef方法有什么优点吗?
缺点:
- 若一个程序需要使用同一函数的多个不同版本,
typedef方法不允许,因为程序只能为item定义一种数据类型。
优点:
-
typedef语法更简单。 - 模板会带来额外陷阱和晦涩的编译错误,而
typedef不会。
146、什么是模板前缀,它在模板函数中用于何处?
模板前缀是表达式 `template <class Item>`,它告知编译器接下来的定义将使用一个未指定的数据类型 `Item`。在模板函数中,模板前缀总是位于模板函数定义之前。此外,在模板类定义外,模板前缀要立即放在每个函数原型和定义之前,包括成员定义和其他操作模板类的函数。
147、在maximal函数中,模板Item参数允许哪些数据类型?
C++内置类型(如int、char等),或定义了>运算符和拷贝构造函数的类。
148、编写一个模板函数,用于比较两个项。如果这两个项相等,则打印消息“Those are the same”。否则,打印消息“Those are different”。该函数有两个参数。参数类型可以是任何具有拷贝构造函数且定义了 == 运算符的类型。
以下是实现该功能的模板函数代码:
template <class Item>
void compare(Item a, Item b) {
if (a == b) {
std::cout << "Those are the same" << std::endl;
} else {
std::cout << "Those are different" << std::endl;
}
}
149、编写ordered_insert模板函数的实现,该函数用于将一个元素按顺序插入到一个已排序的数组中。
以下是

658

被折叠的 条评论
为什么被折叠?



