【问题标题】:How to delete element from list in c++C++中如何从列表中删除元素
【发布时间】:2021-08-06 01:14:48
【问题描述】:

我目前正在用 C++ 创建一个单链表 现在我正在尝试创建一个函数showList 来打印列表的内容,如果它为空,则打印“空列表”。但是,现在它每次都会打印列表“空列表”。当列表为空时,它会打印一个空行并在新行“空列表”中打印 这是我当前的代码:

template <typename T>
struct Node {
    T data;
    Node* next;
};

template <typename T>
void showList(const Node<T>* head){
    
    while (head != nullptr){
        std::cout << head->data << " " ;
        head = head->next;
    }
    std::cout << std::endl;

    if(head->data = 0){
       std::cout << "Empty list"<< std::endl;
    }

}

【问题讨论】:

  • 小测验:当while 循环结束时:1)head 的值是多少,2)给定#1,head-&gt;data 的值是多少?
  • @SamVarshavchik head 的值会一样吗?我认为它不会改变任何东西。 head->data 为 nullptr
  • “相同”是什么意思?您认为head 必须是什么值才能使while 循环终止?而且,鉴于head 是那个值,你认为head-&gt;data 意味着什么?而且既然data不是指针,你怎么期望它变成nullptr
  • @SamVarshavchik 它必须是 nullptr。现在我意识到头部而不是数据必须是nullptr。这没有意义。我刚刚尝试了所有发现的方法,这是建议的解决方案之一,但没有奏效。
  • if(head-&gt;data = 0) 应该对大多数编译器发出警告。您真的打算将零分配给 data 字段吗?

标签: c++ list linked-list


【解决方案1】:

假设您的意思是一个空列表是headnullptr 的列表,您可以明确地检查它:

void showList(const Node<T>* head) {
    if (head == nullptr) {
       std::cout << "Empty list"<< std::endl;
       return;
    }
    
    while (head != nullptr){
        std::cout << head->data << " " ;
        head = head->next;
    }
    std::cout << std::endl;
}

【讨论】:

  • 在这种情况下,while 循环可以更改为do..while 循环,因此head 在第一次迭代时不会重复执行两次检查:do { ... } while (head != nullptr); 进入循环后, head 已经保证在第一次迭代中不是 nullptr,因此无需再次验证。
猜你喜欢
  • 2021-03-10
  • 2010-10-13
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多