Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C链接列表添加顺序_C_Linked List_Compare - Fatal编程技术网

C链接列表添加顺序

C链接列表添加顺序,c,linked-list,compare,C,Linked List,Compare,我有一个链表c文件/头作为一个独立的库,我使用的项目。我在库中还没有addordered方法。我的问题是编写比较函数,因为我想比较不同项目的不同项。如何在main中为我正在使用的任何项目创建一个compare函数,然后将该函数传递并使用到我的链表库中的add_ordered方法中?我似乎找不到一个可行的解决方案来传递函数并在我的链接列表中使用它 这是我的add_ordered和compareto方法的未编译版本(每个文件的compareto方法不同): void ll_add_ordered(l

我有一个链表c文件/头作为一个独立的库,我使用的项目。我在库中还没有addordered方法。我的问题是编写比较函数,因为我想比较不同项目的不同项。如何在main中为我正在使用的任何项目创建一个compare函数,然后将该函数传递并使用到我的链表库中的add_ordered方法中?我似乎找不到一个可行的解决方案来传递函数并在我的链接列表中使用它

这是我的add_ordered和compareto方法的未编译版本(每个文件的compareto方法不同):

void ll_add_ordered(ll_node*head,void*d){
ll_节点*cur;
ll_节点*温度;
如果(头部->尺寸==0){
ll_先添加_(头,d);
}否则{
temp=(ll_节点*)malloc(sizeof(ll_节点));
温度->数据=d;
对于(cur=head->next;cur->data!=NULL&&compareTo(临时->数据,cur->data);cur=cur->next)
;
温度->下一步=当前;
温度->上一个=当前->上一个;
当前->上一个->下一个=温度;
当前->当前=温度;
头部->尺寸++;
}
}
int比较(过程*第一,过程*第二){
如果(第一次->到达<第二次->到达)
返回-1;
否则如果(第一次->到达>第二次->到达)
返回1;
其他的
返回0;
}

一种方法是传入一个指向采用void*参数的函数的指针,例如int(*cmp)(void*lhs,void*rhs)。在这种情况下,cmp有责任将其参数转换为正确的类型


你也许可以用宏和标记粘贴来做一些类型更安全的事情,但我个人觉得这太过分了。如果您正在实例化链表,那么您知道链表的类型是什么,并且可以传入合适的比较函数

这将定义一种称为compareFunc的类型:


typedef int(*compareFunc)(无效*第一,无效*第二);

现在,您可以将ll_添加_顺序改写为:


作废所有添加顺序(所有节点*头,作废*d,比较函数compareFunc compareTo){
.
.
.


这将允许您将与compareTo函数签名匹配的任何函数传递到ll_add_ordered中,并在进行比较时调用它。

一个简单的解决方案是使用函数指针,并将指针传递给函数

我建议您也为函数签名声明一个别名,以免过一会儿就发疯:)

我假设
ll\u节点。数据
的类型为
void*
。因此,您的链接列表需要两件事:

  • 比较函数使用两个空指针,对它们进行比较(使用内部知识)。比较函数必须知道如何处理数据。这一要求当然会隐式地应用于调用
    ll\u add\u ordered
    的person/code/evil同事
  • 比较函数返回1、0或-1
  • 此类函数指针的类型别名为:

    typedef int (*ll_comp_func)(void *, void*);
    
    如果你认为这看起来很疯狂,那你是完全正确的。它会让你在深夜疯狂杀人,因为没有任何东西可以工作。无论如何,它真正做的是为函数指针创建一个typedef,并调用别名
    ll\u comp\u func

    然后将您的
    ll\u add\u ordered
    更改为以下形式:

    void ll_add_ordered(ll_node *head, void *d, ll_comp_func comparison){
       // Do stuff.
       int order = comparison(temp->data, cur->data);
       // Do even more stuff.
    }
    

    呵呵,你有没有看过C的数据类型库,完全是用宏完成的?我可以想象它的调试非常棒。
    void ll_add_ordered(ll_node *head, void *d, ll_comp_func comparison){
       // Do stuff.
       int order = comparison(temp->data, cur->data);
       // Do even more stuff.
    }