You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修改说明

  1. 循环条件:将循环条件改为while (cin >> k),每次循环开始时尝试读取k。读取成功则进入循环体处理指令;读取失败(输入结束或格式错误)则直接退出循环,之后执行链表打印。
  2. 移除冗余判断:原代码中if(input is ended)的判断可以完全删除,循环条件已经覆盖了输入结束的逻辑。
  3. 修正函数传参:deleteAtHead、deleteAtTail这类会修改头指针的函数,必须传入Node**(指针的指针),否则修改仅在函数内部生效,外部head指针不会更新,会导致野指针或内存泄漏。
  4. 初始化优化:直接将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 21:33:13