比较链表中的节点c


struct link_node
{
    char node_str[ MAX_STR_LEN ];
    struct link_node *next;
};
int compare_node( struct link_node *n1, struct link_node *n2)
{
    if(n1[0] < n2[0])
    {
        return -1;
    }
    else if(n1[0] == n2[0])
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

这是我目前用于比较链表中节点的首字母的代码。程序没有运行,所以我想确定代码中的错误在哪里。代码看起来正确吗?请记住,错误可能在代码的其他地方。

需要访问structnode_str元素。因为你将指向结构体的指针传递给函数,所以你可以使用->符号访问结构体的元素,例如

int compare_node( struct link_node *n1, struct link_node *n2)
{
    if (n1->node_str[0] < n2->node_str[0])
        return -1;
    // etc...
}

通常比较函数只需要在第一项小于第二项时返回"小于0",在两项相等时返回"0",或者在第一项大于第二项时返回"大于0"。在这种情况下,您可以将比较函数简化为:

int compare_node( struct link_node *n1, struct link_node *n2)
{
    return n1->node_str[0] - n2->node_str[0];
}

这将对每个字符串的第一个字符执行比较。如果要比较整个字符串,请使用strcmp():

int compare_node( struct link_node *n1, struct link_node *n2)
{
    return strcmp(n1->node_str, n2->node_str);
}

No。这是不对的。

这将比较2个struct link_node对象。因为C不做操作符重载,所以没有意义。您需要比较对象内部的实际数据。例如

// Note: probably better to use n1-> instead of n1[0].
// node_str[0] *is* correct usage of `[]` though.
if(n1[0].node_str[0]< n2[0].node_str[0])
{
    return -1;
}

整个事情可以简化为

int compare_node( struct link_node *n1, struct link_node *n2)
{
    return n1->node_str[0] - n2->node_str[0];
}

唯一的区别是现在你得到的不是1和-1,而是+ve, -ve或0。

请注意,这个(和其他答案)使用了->而不是[]。如果传入的是link_nodes数组,则可以使用[]表示法,但在本例中可能不太可能使用。

相关内容

  • 没有找到相关文章

最新更新