比较链表中的节点c

时间:2016-11-13 23:38:35

标签: c linked-list nodes alphabetical

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;
    }
}

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

2 个答案:

答案 0 :(得分:1)

您需要访问node_str的{​​{1}}元素。由于您将指向结构的指针传递给函数,因此可以使用struct表示法访问结构元素,例如

->

如果第一项小于第二项,通常比较函数只需返回“小于0”,如果项目相等则返回“0”,如果第一项大于第二项,则返回“大于0”。在这种情况下,您可以将比较功能减少到:

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

这将对每个字符串的第一个字符执行比较。如果要比较整个字符串,请使用int compare_node( struct link_node *n1, struct link_node *n2) { return n1->node_str[0] - n2->node_str[0]; }

strcmp()

答案 1 :(得分:0)

没有。这不对。

这只是比较2 struct link_node个对象。由于C不会对运算符进行重载,因此没有任何意义。您需要比较对象内的实际数据。 e.g。

// 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表示法,但是在这种情况下可能不太可能。