【问题标题】:C LinkedList add OrderedC LinkedList 添加有序
【发布时间】:2010-11-02 18:22:33
【问题描述】:

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

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

void ll_add_ordered(ll_node *head, void *d){
 ll_node *cur;
 ll_node *temp;

 if(head->size == 0){
  ll_add_first(head, d);
 }else{
  temp = (ll_node *)malloc(sizeof(ll_node));
  temp->data = d;

  for(cur = head->next; cur->data != NULL && compareTo(temp->data, cur->data); cur = cur->next)
   ;

  temp->next = cur;
  temp->prev = cur->prev;
  cur->prev->next = temp;
  cur->prev = temp;

  head->size++;
 }
}

int compareTo(proc *first, proc *second){
 if(first->arrival < second->arrival)
  return -1;
 else if(first->arrival > second->arrival)
  return 1;
 else
  return 0;
}

【问题讨论】:

    标签: c linked-list compare


    【解决方案1】:

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

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

    【讨论】:

    • 呵呵,你见过C的数据类型库,完全在宏中完成吗?我可以想象这是非常棒的调试。
    【解决方案2】:

    这将定义一个名为 compareFunc 的类型:

    typedef int(*compareFunc)(void *first, void *second);

    现在您将 ll_add_ordered 重写为:

    void ll_add_ordered(ll_node *head, void *d, compareFunc compareTo) { . . .

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

    【讨论】:

      【解决方案3】:

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

      我建议你也为函数签名声明一个别名,以免你在一段时间后发疯:)

      我假设ll_node.datavoid * 类型。因此,您的链表需要两件事:

      1. 比较函数采用两个 void 指针,比较它们(使用内部知识)。比较函数必须知道如何处理数据。这个要求当然是对调用ll_add_ordered 的人/代码/邪恶同事隐式强制执行的。
      2. 比较函数返回 1、0 或 -1。

      这种函数指针的类型别名是:

      typedef int (*ll_comp_func)(void *, void*);
      

      如果您认为这看起来很疯狂,那您是完全正确的。它可以让你在没有任何作用的情况下疯狂杀人如麻。无论如何,它真正做的是为函数指针创建一个 typedef,并调用别名 ll_comp_func

      然后您可以将您的 ll_add_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.
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多