测试链表是否彼此相等

时间:2013-11-19 03:34:14

标签: c++ linked-list set

我有一组链接列表中的数字。我想比较它们,看看它们是否是一组中的相同数字。这是我现在的代码:

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。这里缺少什么链接?

4 个答案:

答案 0 :(得分:1)

您需要调整返回条件,因为截至目前,如果每个列表中都存在thissecond中的第一个值,则返回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)

如果两个成员的成员数不同,请使用您的代码

。你的循环将以travel1travel2退出,其中没有。当其他元素仍然不是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);
}