2017-05-29 88 views
0

我有结构的列表排序结构的列表:C:由给定的排序

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

我整理这个entrys将列表中的东西的时候。

伪:

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

这是非常不灵活,我想的排序,我可以给作为启动参数。 任何好主意?

我不需要整个代码。只是想法或可能库。

谢谢。 :)

+1

。在你的代码中没有链表。如果您要使用常规的结构数组,则可以针对不同的排序使用具有不同回调函数的'qsort'。 – user694733

+2

使用'<来比较两个数组时,实际上比较*指针*,指向数组中的第一个元素。即使你有两个内容相同的数组,他们也永远不会相等。如果你想比较数组,你必须编写一个函数来比较数组的*内容*。 –

+0

是的,我知道。 ^^ 这就是为什么我写了伪代码: – Nick

回答

0

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

1

您可能会感兴趣于Intrusive Lists数据导向设计(阵列结构vs阵列结构)。优点包括更少的缓存未命中以及更好的数据和代码分离。

如果您使用C或lambda如果您使用C++来处理数值并将其返回,您可以使用函数指针。

+0

非常感谢。 :) 我想我会试试这个。但我认为这不是解决我最初的问题。 我仍然需要对入侵列表进行排序。 – Nick

+0

@Nick它确实导致了一个更灵活的系统:) – MattMatt2000

+0

@Nick - 请参阅我的编辑排序 – MattMatt2000

0

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

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

然后:

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

qsort is只是使用数组:/ 我不知道我的列表将包含多少个对象 – Nick

+0

它是通用的,它也可以对结构数组进行排序。 –

+0

是的。但我有一个链表^^ 所以我将不得不将列表转换为数组,然后再返回? – Nick