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;
}
}
这是我目前用于比较链表中节点的第一个字母的代码。程序没有运行,所以我想确定代码中的错误在哪里。代码看起来不错吗?请记住,错误可能在代码中的其他位置。
答案 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
表示法,但是在这种情况下可能不太可能。