【问题标题】:see get min value of nodes, exceptional case查看获取节点的最小值,例外情况
【发布时间】:2020-08-12 18:44:09
【问题描述】:

问题已被删除,因为它包含私有代码

【问题讨论】:

  • 这是经典的合并排序代码,如果不是两个列表都用尽,则有四种情况:(1)a 用尽; (2) b 用尽; (3) a INT_MAX 作为值,因此该解决方案并不可靠。明确地写出这些案例。 (还有一个问题,当两个节点都为空时会发生什么。是从外部控制的吗?)
  • 是的,当它们都为空时,完全检查,你能帮助编写或改进我的代码吗?
  • @yano 但我需要推进原始指针
  • @clark_smith 不清楚该函数的目的是什么。它在做什么?!例如这个语句是什么 *list1=(*list1)->next;在做什么?
  • 注意:“receives 不完全是 2 个指向一系列节点的指针,而每个节点都有两个属性:”不太正确。该函数接收 2 个指向 Node 的指针。 Node 本身是一个指向 struct node_t 的指针。更像函数接收 2 个指向节点的指针。

标签: c struct module nodes c99


【解决方案1】:

这是经典的合并排序代码,如果不是两个列表都用尽,则有四种情况:

  1. a 已用尽;
  2. b 已用尽;
  3. a b 和
  4. ab.

您已尝试通过比较合并其中一个节点为空的前两种情况,但由于您的列表可以将 INT_MAX 作为值,因此该解决方案并不可靠。

明确写出这些案例。首先是一个小辅助函数,它推进一个节点并返回值:

static int advance(Node *nd)
{
    int res = (*nd)->x;

    *nd = (*nd)->next;

    return res;
}

现在你的实际功能非常简单:

int getMin(Node *list1, Node *list2)
{
    assert(*list1 || *list2);

    if (*list1 == NULL) return advance(list2);
    if (*list2 == NULL) return advance(list1);
    if ((*list1)->x < (*list2)->x) return advance(list1);

    return advance(list2);
}

看到它在行动on ideone

【讨论】:

  • 非常感谢,但由于我的 getMin 是内联的(因为我经常使用它),我是否也应该内联 Advance()?
  • 也许,不知道。除非您要对数百万个元素进行合并排序,否则我猜这并不重要。 (而且我想只要重新设计算法,让它立即重新连接节点,就能带来更好的速度优势。)
  • 我试图内联 getMin() 但现在我收到一个错误:静态函数 'advance' 用于具有外部链接的内联函数 [-Werror,-Wstatic-in-inline]跨度>
  • 是的。 static 函数对外部不可见,因此它们不能被内联代码调用。不要内联或内联两者,但不要让它们成为静态的,无论如何。
  • (你可以把它读成:别再痴迷于内联了。你可能不需要优化的好处。我会在这里开一个库,说优化的潜力会更大以您的合并器的实施方式。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2016-04-29
相关资源
最近更新 更多