[数据结构·C++语法] 处理未知长度或多组数据
针对你在期末考试或 LeetCode 刷题中遇到的“未知长度多组数据录入”的情况,C++ 有几种标准的处理模式。
C++ 处理未知长度/多组数据录入的常用模板
在数据结构考试或算法题(OJ/LeetCode)中,通常没有明确告诉你“一共有多少个数字”,而是说“直到输入结束”或“输入为0时停止”。以下是标准解决方案:
1. 利用 cin 的返回值 (C++ 标准写法)
cin >> x 表达式在 C++ 中会返回输入流对象本身。在 while 循环条件中,它会被隐式转换为 bool 类型。
- 如果读取成功,返回
true。 - 如果遇到 EOF (End Of File) 或格式错误,返回
false。
场景 A:每次读取一个数
1 | int x; |
int a, b;
// 只有当 a 和 b 都成功读取时,才进入循环
while (cin >> a >> b) {
// 处理边 (a, b)
addEdge(a, b);
}
1 |
|
int x;
// 只要返回值不等于 EOF,就说明还有数据
while (scanf(“%d”, &x) != EOF) {
// 处理 x
process(x);
}
1 |
|
int x;
while (cin >> x && x != 0) {
// 注意:这里的逻辑是,读取了 x,且 x 不为 0 时才进入
// 如果输入 0,循环直接终止
process(x);
}
1 |
|
string line;
while (getline(cin, line)) {
// line 中包含了整行内容(不含换行符)
process(line);
}
1 |
|
#include
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(nullptr) {}
};
int main() {
// 1. 创建虚拟头节点 (Dummy Head),简化操作
ListNode* dummyHead = new ListNode(0);
ListNode* tail = dummyHead; // tail 永远指向链表最后一个节点
int val;
std::cout << "请输入一组整数 (Windows按Ctrl+Z结束, Mac按Ctrl+D结束):" << std::endl;
// 2. 核心循环:读取直到 EOF
while (std::cin >> val) {
ListNode* newNode = new ListNode(val);
tail->next = newNode; // 链接
tail = newNode; // 更新尾指针
}
// 3. 此时链表构建完成,头节点是 dummyHead->next
ListNode* realHead = dummyHead->next;
// (可选) 遍历打印验证
ListNode* p = realHead;
while (p != nullptr) {
std::cout << p->val << " -> ";
p = p->next;
}
std::cout << "NULL" << std::endl;
return 0;
}
```
