C++中如何检测输入结束?循环终止实现求助
解决C++中while循环检测输入结束的问题
在C++中,你可以利用cin的状态来检测输入是否到达末尾。当输入流遇到EOF(文件结束符)或者输入失败时,cin会进入失效状态,此时它的布尔值会变为false,我们可以直接用这个特性来控制循环的终止。
修正后的代码
#include <iostream> using namespace std; // 假设你已定义Node结构体及相关操作函数 struct Node { int data; Node* next; Node() : data(0), next(nullptr) {} Node(int val) : data(val), next(nullptr) {} }; void insertAtTheHead(Node** head, int w) { Node* newNode = new Node(w); newNode->next = *head; *head = newNode; } void insertAtTheTail(Node** head, int w) { Node* newNode = new Node(w); if (*head == nullptr) { *head = newNode; return; } Node* temp = *head; while (temp->next != nullptr) { temp = temp->next; } temp->next = newNode; } void deleteAtHead(Node** head) { if (*head == nullptr) return; Node* temp = *head; *head = (*head)->next; delete temp; } void deleteAtTail(Node** head) { if (*head == nullptr) return; if ((*head)->next == nullptr) { delete *head; *head = nullptr; return; } Node* temp = *head; while (temp->next->next != nullptr) { temp = temp->next; } delete temp->next; temp->next = nullptr; } void printList(Node* head) { Node* temp = head; while (temp != nullptr) { cout << temp->data << " "; temp = temp->next; } cout << endl; } int main() { Node* head = nullptr; // 直接初始化为空指针,避免冗余节点操作 int k; // 用cin >> k作为循环条件,读取失败则退出循环 while (cin >> k) { if(k == 1) { int w; cin >> w; insertAtTheHead(&head, w); } else if(k == 2) { int w; cin >> w; insertAtTheTail(&head, w); } else if(k == 3) { deleteAtHead(&head); // 传指针的指针,确保头指针正确更新 } else if(k == 4) { deleteAtTail(&head); // 同理,传指针的指针 } } printList(head); // 输入结束后打印链表 return 0; }
关键修改说明
- 循环条件:将循环条件改为
while (cin >> k),每次循环开始时尝试读取k。读取成功则进入循环体处理指令;读取失败(输入结束或格式错误)则直接退出循环,之后执行链表打印。 - 移除冗余判断:原代码中
if(input is ended)的判断可以完全删除,循环条件已经覆盖了输入结束的逻辑。 - 修正函数传参:
deleteAtHead、deleteAtTail这类会修改头指针的函数,必须传入Node**(指针的指针),否则修改仅在函数内部生效,外部head指针不会更新,会导致野指针或内存泄漏。 - 初始化优化:直接将
head初始化为nullptr,替代先创建节点再删除的冗余操作,更符合链表空状态的定义。
测试输入示例
对于输入1 13 1 22 2 60 3 1 10,循环会依次处理每个指令:
- 读取
k=1,读取w=13,插入链表头部 - 读取
k=1,读取w=22,插入链表头部 - 读取
k=2,读取w=60,插入链表尾部 - 读取
k=3,删除链表头部 - 读取
k=1,读取w=10,插入链表头部 - 输入结束,循环退出,打印链表内容:
10 13 60
内容的提问来源于stack exchange,提问作者mmdmxi
相关产品推荐
相关产品推荐

