【问题标题】:Comparing nodes in a linked list c比较链表 c 中的节点
【发布时间】:2016-11-13 23:38:34
【问题描述】:
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 link_node { char node_str[ MAX_STR_LEN ];结构链接节点*下一个; };
  • @Tim Eilers 什么是“节点的首字母”?!:) 节点的首字母是“n”。:)
  • 请编辑您的问题而不是添加 cmets,以便所有内容都在一个地方,并且您可以格式化代码,以便于阅读。请提供stackoverflow.com/help/mcve
  • 既然显示的代码无法编译,为什么还要问是否可以?忽略未定义的 MAX_STR_LEN(大概你有 #define MAX_STR_LEN 32 或类似的东西),你在 node_str 之前没有类型,你不能比较结构批发。

标签: c linked-list nodes alphabetical


【解决方案1】:

您需要访问structnode_str 元素。由于您将指向结构的指针传递给函数,因此您可以使用-&gt; 表示法访问结构的元素,例如

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

【讨论】:

    【解决方案2】:

    没有。这是不对的。

    这只是比较 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。

    请注意,这个(和其他答案使用-&gt; 而不是[]。如果您传入link_nodes 的数组,您可能会使用[] 表示法,但在这种情况下可能不太可能。

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 2012-10-24
      相关资源
      最近更新 更多