【问题标题】:variables not being compared right变量没有被正确比较
【发布时间】:2014-10-29 08:21:40
【问题描述】:

下面是我编写的用于在 C++ 中生成排序链表的类 当它不是模板时,完全相同的代码可以工作。 但是,一旦我进行了模板化,代码似乎无法正确比较变量。

例如, 当我插入 1, -1, 13 该列表应按升序排列 -1 1 13。 然而,最终的名单是 13 -1 1。

在调试过程中,它甚至没有通过最后一种情况。 它进入第二种情况时,说13小于-1。

发生了什么事...?

template <class ItemType>
bool List342<ItemType>::Insert(ItemType *obj)
{
Node *insNode = new Node;
insNode->data = obj;

if (head == NULL)
{
    head = insNode;
    return true;
}

if (obj <= head->data)
{
    insNode->next = head;
    head = insNode;
    return true;
}

Node *pNode = head;
while ((pNode->next != NULL) && ((pNode->next)->data <= obj))
{
    pNode = pNode->next;
}
insNode->next = pNode->next;
pNode->next = insNode;
return true;
}

这是节点定义

struct Node {
    ItemType *data;
    Node *next;
};

【问题讨论】:

  • 在使用调试器逐行执行代码时,您看到了什么?
  • 在插入 1 和 -1 之前它表现良好。但是当它插入 13 时,它只是进入了 obj data 的情况。该值显示为 -1 和 13 ......因此在 -1 之前插入 13。
  • 可以看看Node的定义吗?
  • 实际上......该函数正在接收“ItemType *obj”作为它的参数。它接收指向 ItemType 的指针,而不是 ItemType。因此“obj data”比较的是内存位置,而不是它们包含的值。
  • 我明白了...谢谢。我还在为指针的概念苦苦挣扎... :(...

标签: c++ if-statement linked-list insertion-sort


【解决方案1】:

您的比较 (obj &lt;= head-&gt;data)((pNode-&gt;next)-&gt;data &lt;= obj) 显然在 ItemType * 指针之间。如果要在它们指向的 ItemType 对象之间进行比较,则需要取消引用指针。例如,测试(*obj &lt;= *head-&gt;data)

【讨论】:

  • 这行得通!所以当与指针比较时,两个值都需要是指针值..?
  • 对不起,我不明白这个问题。能详细点吗?
  • 所以,当我将obj作为参数时,它被接受为*obj,指针。 pNode 也被声明为一个指针。然后,当我稍后尝试使用它们时,是否需要再次指定它们是指针? (obj data) 不应该与 (*obj data) 相同
  • 这不太对。一旦名称obj 被声明为ItemType * 类型的变量,obj 的每个后续使用都引用该指针变量。另一方面,*obj 指的是obj 指向的对象。星号* 是取消引用运算符;它不仅重新表达obj 是一个指针。 (如果您尝试与使用类型化符号的 Perl 等语言进行比较,您可能会感到困惑。在 C++ 中,没有符号。)在数值上,obj 可能等于 0x5f790ea2 之类的地址,而 *obj 可能等于 13。
  • ohhhhhh 好的,这是有道理的。谢谢 ! :)
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多