【问题标题】:C: Sort a list of structs by a given sortingC:按给定排序对结构列表进行排序
【发布时间】:2017-10-29 20:34:47
【问题描述】:

我有一个结构列表:

typedef struct {
    uint8_t mac_addr[6];
    uint32_t signal;
    uint32_t freq;
    ...
}pseudo_entry;

在列表中插入内容时,我正在对这些条目进行排序。

伪:

while(next)
  if(curr.mac_addr < next.mac_addr)
      if(curr.signal < next.signal)
      ...

这非常不灵活,我想要一个可以作为启动参数的排序。 有什么好主意吗?

我不需要完整的代码。只是想法或库。

谢谢。 :)

【问题讨论】:

  • 你的代码中没有链表。如果您要使用常规的结构数组,您可以使用 qsort 和不同的回调函数来实现不同的排序。
  • 当你使用&lt; 比较两个数组时,实际上是比较pointers,指向数组中第一个元素的指针。即使您有两个具有相同内容的数组,它们也永远不会比较相等。如果要比较数组,则必须编写一个函数来比较数组的内容
  • 是的,我知道。 ^^ 这就是我写伪代码的原因:

标签: c list sorting


【解决方案1】:

您可以将您的数字转换为字符串 (char*),然后将它们全部连接成一个字符串。我认为对它们进行排序可能更容易,因为你只需要一个 if 语句。但是,转换和连接可能比使用您在问题中刚刚提到的三个条件花费更多时间,因此您应该比较时间以检查它是否真的值得。

【讨论】:

    【解决方案2】:

    你需要一个比较器函数,然后你可以将它传递给qsort函数:

    int compt(void *f, void *s){
      return (f->signal) -(s->signal);
    }
    

    然后:

    qsort(&curr,<yourarraysize>, sizeof(cur), &compt);
    

    【讨论】:

    • qsort 只是处理数组:/我不知道我的列表将包含多少对象
    • 它是通用的,它也可以对结构数组进行排序。
    • 是的。但是我有一个链表^^所以我必须将列表转换为数组然后再转换回来?
    【解决方案3】:

    您可能对Intrusive Lists面向数据的设计(结构数组与数组结构)感兴趣。优点包括更少的缓存未命中和更好的数据和代码分离。

    如果您使用 C,则可以使用函数指针;如果您使用 C++ 负责对值进行排序并返回它们,则可以使用 lambda

    【讨论】:

    • 感谢非常有趣。 :) 我想我会试试这个。但我认为这并没有解决我最初的问题。我仍然需要对侵入性列表进行排序。
    • @Nick 它确实会带来一个更灵活的系统 :)
    • @Nick 这是一个例子:stackoverflow.com/questions/19417826/…
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多