检查链表的结尾
Check the end of the linked list
我有一个简单的链表结构,我想迭代它。
struct Node{
int data;
struct Node *next;
};
假设我在没有初始化的情况下创建了一个数据为1的节点next
。
Node* test3 = new Node;
test3->data = 1;
因为next不是NULL
,所以我在迭代这个链表的时候不能做限制条件
我认为没有任何方法可以检测内存是否已分配。
我该如何解决这个问题?
如您所料,next
成员不能用于确定这一点,因为它具有未定义的值,任何试图从中读取的行为都是未定义的行为。您需要设置它,或确保它已设置。如果你不能这样做,那么你需要通过其他方式来跟踪最后一个节点,比如将指向最后一个节点的指针存储在一个变量中。
这是最愚蠢的问题......或者不是,如果你不熟悉链接列表。
每次制作 new
时只需初始化 next = 0;
。
然后你可以设置一个 if
条件来检查你正在处理的节点是否有下一个节点或者它是最后一个节点。
类似于:
node* test = new node;
test->data = 1;
test->next = 0;
//[....]
test = test->next;
if (test)
{
//do what you have to...
}
如果if
条件不成立,则前一个节点为最后一个。
您也可以将其设置为:
if (test->next) //next != 0
{
//this is not the last node
}
else //next = 0
{
//this is the last node
}
编辑2015_11_26-0154
node* test = new node;
test->initialized = 0;
当您使用 C++ 时,您也可以向结构添加构造函数。这样更安全,因为您不会忘记初始化下一个指针:
struct Node{
int data;
struct Node *next;
Node() : next(0) {}
};
当您创建 new Node
时,next
会自动初始化为 NULL
== 0。
我有一个简单的链表结构,我想迭代它。
struct Node{
int data;
struct Node *next;
};
假设我在没有初始化的情况下创建了一个数据为1的节点next
。
Node* test3 = new Node;
test3->data = 1;
因为next不是NULL
,所以我在迭代这个链表的时候不能做限制条件
我认为没有任何方法可以检测内存是否已分配。
我该如何解决这个问题?
如您所料,next
成员不能用于确定这一点,因为它具有未定义的值,任何试图从中读取的行为都是未定义的行为。您需要设置它,或确保它已设置。如果你不能这样做,那么你需要通过其他方式来跟踪最后一个节点,比如将指向最后一个节点的指针存储在一个变量中。
这是最愚蠢的问题......或者不是,如果你不熟悉链接列表。
每次制作 new
时只需初始化 next = 0;
。
然后你可以设置一个 if
条件来检查你正在处理的节点是否有下一个节点或者它是最后一个节点。
类似于:
node* test = new node;
test->data = 1;
test->next = 0;
//[....]
test = test->next;
if (test)
{
//do what you have to...
}
如果if
条件不成立,则前一个节点为最后一个。
您也可以将其设置为:
if (test->next) //next != 0
{
//this is not the last node
}
else //next = 0
{
//this is the last node
}
编辑2015_11_26-0154
node* test = new node;
test->initialized = 0;
当您使用 C++ 时,您也可以向结构添加构造函数。这样更安全,因为您不会忘记初始化下一个指针:
struct Node{
int data;
struct Node *next;
Node() : next(0) {}
};
当您创建 new Node
时,next
会自动初始化为 NULL
== 0。