迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C++ >

检查C++中的链表是否为空

作者:迹忆客 最近更新:2023/08/22 浏览次数:

链表的功能类似于数组,并使用指针来实现。 这是动态数据结构的最简单示例,可以从数组中的任意点增长和收缩。

链表具有多个动态分配的节点,其中包含一个值和一个指针。 本教程将教您三种在 C++ 中检查链表是否为空的方法。


C++ 中使用根元素检查链表是否为空

链表中的根充当一个元素,即使链表为空,该元素也始终存在。 在链表中拥有根的另一个用途是将最后一个元素链接回根,形成一个循环。

在 C++ 中,有两种主要方法可以通过提供指向列表第一个元素的指针来检查链表是否为空(例如: if (root->next == NULL) { /* empty list */ })或者将链表的列表元素链接回其根以形成循环(if (root->next == root) { /*empty list */ })。 使用根元素检查链表是否为空需要至少一个不保存数据的链表节点。

代码示例:

#include<bits/stdc++.h>
using namespace std;

class Node{

    public:
        int data;
        Node *next;

        Node(){
            data=0;
            next=NULL;
        }
};

class linked_list{
    Node *root;
    public:
        linked_list(){
            root=NULL;
        }

        Node* getRoot(){
            return root;
        }

        void add_node(int n){
            Node *temp = new Node();
            temp->data = n;
            temp->next = NULL;
            if(root == NULL){
                root=temp;
                root->next=root;
            }
            else{
                Node *last=root;
                while(last->next!=root){
                    last=last->next;
                }
                temp->next=root;
                last->next=temp;
            }
        }

        void printList(){
            Node *temp=root;
            if(temp!=NULL){
                do{
                cout<<temp->data<<" ";
                temp = temp->next;
                } while(temp!=root);
            }
        }

        bool isEmpty(){
            if(root->next==root && root->data==0) return true;
            return false;
        }
};

int main(){

    linked_list l1;
    l1.add_node(5);
    l1.add_node(10);
    l1.add_node(15);

    if(l1.isEmpty()) cout<<"The list is empty!\n";
    else {
        cout<<"The list is not empty! List contains:\n";
        l1.printList();
    }
    return 0;
}

输出:

The list is not empty! List contains:
5 10 15

头节点或根节点表示其在链表中的起始位置。 对于根来说,总是有一个元素。


在 C++ 中不使用根元素检查链表是否为空

如果没有根,当链表为空时,链表指针为 NULL。 这种方法检查链表是否为空的复杂度与检查根元素相同,即 O(1)。

当您分配新节点时,您需要为变量初始化一个合理的默认值,以便可以轻松识别长度为零的数据成员以识别其 NULL 行为。

代码示例:

#include<bits/stdc++.h>
using namespace std;

class Node
{
    public:
        int data;
        Node *next;
} ;

void push(Node** head_ref, int new_data){

    Node* new_node = new Node();
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}

bool isEmpty( Node** list){
    if((*list)==NULL) return true;
    return false;
}

void printList(Node *node)
{
    while (node != NULL)
    {
        cout<<node->data<<" ";
        node = node->next;
    }
}

int main(){

    Node *list=NULL;
    if(isEmpty(&list)) cout<<"List is Empty"<<endl;
    else{
        cout<<"List is not empty! List contains:"<<" ";
        printList(list);
    }
    // Inserting some elements in the list
    push(&list,8);
    push(&list,4);

    if(isEmpty(&list)) cout<<"The List is Empty"<<endl;
    else{
        cout<<"The list is not empty! The list contains:"<<" ";
        printList(list);
    }
    return 0;
}

输出:

The List is Empty
The list is not empty! The list contains: 4 8

仅当节点的下一个指针设置为 NULL 时,链表才能正确终止。 如果链表的头指针设置为NULL,那么它将被称为零长度链表,零长度链表也是一个空列表,因为它代表一个NULL头指针。


C++中使用根点检查链表是否为空

可以将链表的最后一个元素链接到根,形成一个循环,这样可以帮助识别空链表。 利用根点有很多好处,包括永远不会将 NULL 作为下一个元素; 因此,程序员不再需要检查它。

它提供了一些独特的情况,例如如果链表的根点或头点链接回自身,则它代表一个空链表。 如果 if (root->next == root) { /* empyty list */ } 为 true,则链表为空。

伪代码:

node *root;

... // process code (exp.)

if (root -> next == root) { /* empty list */ }

// check the head pointer - if it is NULL, there's no entry in the list.

int isEmpty( node * list )
 {
   if( !list )

      return 1;

   return 0; // otherwise in case false check
 }

如果您在 C++ 中创建变量或为其分配一些垃圾值,您的数据可能会被中和或清零。 您必须学习显式初始化变量、为它们分配唯一值,并了解管理它的规则。

上一篇:C++ 中的移动语义

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

C++ 中的移动语义

发布时间:2023/08/22 浏览次数:160 分类:C++

在本文中,我们将讨论 C++ 中的移动语义:我们将讨论深拷贝和浅拷贝的相关概念 我们将快速讨论左值和右值的概念。 我们将尝试通过示例来理解移动语义。

在 C++ 中抛出异常

发布时间:2023/08/21 浏览次数:200 分类:C++

C++抛出异常是C++的一个强大功能,可用于处理错误和意外事件。 它主要用于终止程序的执行或将控制权转移到程序的不同部分。在 C++ 中抛出异常

C++ 中抛出超出范围的异常

发布时间:2023/08/21 浏览次数:176 分类:C++

This article discusses how to throw an out of range exception in C++. It also discusses the possible errors while throwing out of range exception in C++.

在 C++ 中抛出异常消息

发布时间:2023/08/21 浏览次数:192 分类:C++

它是通过在程序中可能出现问题的地方抛出异常来执行的。 C++ 中有几个异常处理关键字,但本文将介绍如何使用可变消息引发异常。使用标准 C++ 异常抛出带有消息的异常 - 无效参数

C++ 中的 A Declaration Shadows a Parameter 错误

发布时间:2023/08/21 浏览次数:188 分类:C++

每个对象或变量总是有一些边界、范围或作用域来访问其他类成员,例如由 C++ 中的访问说明符定义为 public、private 或 protected 的数据成员或成员函数。当我们在程序的特定范围或块中多次定义

C++ 中的错误 Error ID Returned 1 Exit Status

发布时间:2023/08/21 浏览次数:130 分类:C++

C++ [Error]: Id returned 1 exit status 不是常见错误。 这通常意味着程序崩溃了,并且在不查看堆栈跟踪的情况下很难确定原因。

C++ 中错误 Too Many Arguments to Function

发布时间:2023/08/21 浏览次数:178 分类:C++

我们在编写一段代码时会遇到很多错误。 解决错误是编程中最关键的部分之一。本文将讨论我们在 C++ 中遇到的一个错误:Too Many Arguments to Function。

处理 C++ 中的错误

发布时间:2023/08/21 浏览次数:197 分类:C++

本文讨论了 C++ 中的错误和异常处理。C++ 中的错误处理 C++ 程序中可能存在多种类型的错误。 有些错误需要向用户发出提示。

C++ 中错误 Function Returns the Address of a Local Variable

发布时间:2023/08/21 浏览次数:119 分类:C++

根据作用域,C 和 C++ 中的变量分为局部变量和全局变量。 虽然可以从程序的任何部分访问全局变量,但局部变量却不然。让我们讨论一下为什么会出现这个错误以及如何修复它。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便