由用户输入n个10以内的数,每输入i(0≤i≤9),就把它插入到第i号队列中。最后把10个队列中非空队列,按队列号从小到大的顺序串接成一条链,并输出该链的所有元素。给出完整能运行的c++代码和详细代码思路
时间: 2024-10-23 10:12:56 浏览: 12
这是一个经典的链表操作题目,我们可以创建一个动态数组(vector)来模拟10个队列,每个队列可以是一个双向链表的节点。下面是详细的C++代码思路和实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 链表节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
// 动态数组模拟队列
class Queue {
private:
vector<ListNode*> queue;
public:
// 入队
void enqueue(int num) {
queue.push_back(new ListNode(num));
}
// 出队并返回头节点
ListNode* dequeue() {
if (queue.empty()) return nullptr; // 如果为空则返回nullptr
ListNode* front = queue[0];
queue.erase(queue.begin()); // 移除头部节点
return front;
}
};
int main() {
Queue q[10]; // 创建10个队列
int n, i;
cout << "请输入数字个数(n): ";
cin >> n;
for (int j = 0; j < n; ++j) {
cout << "请输入数字i和值(i, value): ";
cin >> i >> q[i].enqueue; // 使用函数名作为入队操作
}
// 串接非空队列
ListNode* head = nullptr, *tail = nullptr;
for (int i = 0; i < 10; ++i) {
ListNode* current = q[i].dequeue(); // 取出队首元素
while (current != nullptr) {
if (head == nullptr) {
head = tail = current;
} else {
tail->next = current;
tail = tail->next;
}
current = q[i].dequeue();
}
}
// 输出链表
ListNode* node = head;
while (node != nullptr) {
cout << node->val << " ";
node = node->next;
}
cout << endl;
// 清理内存
for (int i = 0; i < 10; ++i) {
if (q[i].queue.size()) { // 只有非空队列才删除结点
delete q[i].queue.back();
q[i].queue.pop_back();
}
}
return 0;
}
```
这个程序首先通过循环接收用户输入,然后利用Queue类将数字添加到对应的队列。接着遍历所有队列,将非空队列的元素连接成链表,并输出结果。最后记得释放动态分配的内存。
阅读全文