gpt4 book ai didi

linux - 使用 list_sort 对 Linux/list.h 链表进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:19 27 4
gpt4 key购买 nike

我正在研究一个 Linux 内核模块,我正在使用内置链表。我需要对这个列表进行排序,我看到有一个内置的 list_sort 函数,如下所述。但是我对 priv 参数感到困惑。这个参数有什么用,我需要传递什么?任何地方都没有太多文档。

linux/list_sort.h 中定义:

/**
* list_sort - sort a list
* @priv: private data, opaque to list_sort(), passed to @cmp
* @head: the list to sort
* @cmp: the elements comparison function
*
* This function implements "merge sort", which has O(nlog(n))
* complexity.
*
* The comparison function @cmp must return a negative value if @a
* should sort before @b, and a positive value if @a should sort after
* @b. If @a and @b are equivalent, and their original relative
* ordering is to be preserved, @cmp must return 0.
*/
void list_sort(void *priv, struct list_head *head,
int (*cmp)(void *priv, struct list_head *a,
struct list_head *b))

编辑所以我知道我可以为 priv 参数传递 NULL。现在我不确定如何编写我的 cmp 函数,因为 list_sort 接收 struct list_head 指针,但我有自己定义的包含 list_head 的结构 birthday。我下面的比较函数将不起作用,因为 list_head 不包含我的生日结构所具有的成员。

struct birthday {
char *name;
int month;
int day;
int year;
struct list_head list;
};

int compare(void *priv, struct list_head *a, struct list_head *b) {
if (a != NULL && b != NULL) {
struct birthday personA = a;
struct birthday personB = b;
int monthA = personA.month;
int monthB = personB.month;
int dayA = personA.day;
int dayB = personB.day;
int yearA = personA.year;
int yearB = personB.year;

if (yearA < yearB) {
return 1;
} else if (yearB < yearA) {
return -1;
} else {
if (monthA < monthB) {
return 1;
} else if (monthB < monthA) {
return -1;
} else {
if (dayA < dayB) {
return 1;
} else if (dayB < dayA) {
return -1;
} else {
return 0;
}
}
}
}

最佳答案

priv 参数只是一个传递回您的cmp 函数的参数,list_sort 本身并没有使用它。如果不需要,可以传入NULL

这样的参数在C中的回调函数中很常见,可以避免使用全局变量向回调函数传递信息。

关于linux - 使用 list_sort 对 Linux/list.h 链表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35694862/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com