我有一组链接列表中的数字。我想比较它们,看看它们是否是一组中的相同数字。这是我现在的代码:
bool set::equalset(set second)
{
Data *travel1, *travel2;
travel1 = top;
travel2 = second.topval(); //gets the top value for the second set
while (travel2->next != NULL && travel1->next != NULL)
{
if (!in(travel2->value)) //in checks if the value is in the set
return false;
if (!second.in(travel1->value)) //same idea here
return false;
travel2 = travel2->next;
travel1 = travel1->next;
return true;
}
return false;
}
所以我的代码所做的是获取两个集合的最高值并分别设置等于travel1 / 2,然后当travel不指向两个集合中的空值时,它遍历列表并检查是否来自任一组的值彼此相同。如果未找到值,则将其设置为false。否则,它将被设置为true并且发现它们是相等的。
然而,这段代码只有一半有效 - 你可以通过输入1,2为第一组和1,2,3为第二组轻松打破它们,它们将返回相等。我认为第三个值(3)会使它返回false。这里缺少什么链接?
答案 0 :(得分:1)
您需要调整返回条件,因为截至目前,如果每个列表中都存在this
和second
中的第一个值,则返回true。
做这样的事情:
bool set::equalset(set second)
{
Data *travel1, *travel2;
travel1 = top;
travel2 = second.topval(); //gets the top value for the second set
while (travel2->next != NULL && travel1->next != NULL)
{
if (!in(travel2->value)) //in checks if the value is in the set
return false;
if (!second.in(travel1->value)) //same idea here
return false;
travel2 = travel2->next;
travel1 = travel1->next;
}
return true;
}
答案 1 :(得分:1)
在你描述的情况下,第一个集合的迭代器在搜索第二个集合的第三个元素之前将为NULL,从而打破你的while循环。您也可以独立地遍历每个集合。在比较每个元素的元素之前,您还可以检查两个元素的元素数是否相同。
答案 2 :(得分:1)
。你的循环将以travel1
或travel2
退出,其中没有。当其他元素仍然不是NULL
时,元素将指向NULL
。在您的情况下,travel1
将指向NULL
,并且仍会在travel2
中解析要素
按以下代码检查
bool set::equalset(set second)
{
Data *travel1, *travel2;
travel1 = top;
travel2 = second.topval(); //gets the top value for the second set
while (travel2->next != NULL && travel1->next != NULL)
{
if (!in(travel2->value)) //in checks if the value is in the set
return false;
if (!second.in(travel1->value)) //same idea here
return false;
travel2 = travel2->next;
travel1 = travel1->next;
}
if (travel2->next == NULL && travel1->next == NULL)
{
return true;
}
return false;
}
在此代码中,对于带有元素1 2 2和1 2的两个集合,它将返回false
答案 3 :(得分:1)
您的代码有几个问题。首先,您没有检查 last 节点。像这样的循环条件:
while (travel2->next != NULL && travel1->next != NULL)
只要其中一个枚举数到达最后一个节点,就会中断,但从不检查它。此外,它还意味着两组单 - 节点 - 每个都将始终比较真。
接下来,在第一次迭代之后你有一个硬回车,所以没有想到这个永远在以相同节点值开头的两个集合上返回false。
travel2 = travel2->next;
travel1 = travel1->next;
return true; // this doesn't belong here.
接下来,传递参数按值,这意味着正在调用复制构造函数。我不知道你是否实现了它(如果你没有实现,你会遇到完全不同的问题),但没有理由复制列表只是为了看它是否等于*this*
。该函数应该以const-reference作为参数。
bool set::equalset(const set& second)
最后,您的退出条件是正确的,但您无法假设列表都已用尽。你必须验证它。您可以通过返回 false 来执行此操作,如果 旅行者非空(如果列表不均匀,则会返回其中一个。
全部放在一起:
bool set::equalset(const set& second)
{
const Data *travel1 = top;
const Data *travel2 = second.top;
while (travel1 && travel2)
{
if (!in(travel2->value)) //in checks if the value is in the set
return false;
if (!second.in(travel1->value)) //same idea here
return false;
travel2 = travel2->next;
travel1 = travel1->next;
}
return !(travel1 || travel2);
}
针对排序列表进行了优化
如果您在输入和删除方法期间保留列表已排序,则可以更加轻松地实现此目标,如下所示:
bool set::equalset(const set& second)
{
const Data *travel1 = top;
const Data *travel2 = second.top;
while (travel1 && travel2 && travel1->value == travel2->value)
{
travel1 = travel1->next;
travel2 = travel2->next;
}
return !(travel1 || travel2);
}