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;
}
}
这是我目前用于比较链表中节点的首字母的代码。程序没有运行,所以我想确定代码中的错误在哪里。代码看起来正确吗?请记住,错误可能在代码的其他地方。
需要访问struct
的node_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
数组,则可以使用[]
表示法,但在本例中可能不太可能使用。