c - 基于 C 中的 bool 函数对列表重新排序?

标签 c list sorting linked-list

给定一个列表和一个 bool 函数 f,如何重新排序该列表,使得 f(element) == 1 等所有元素都位于前面(这些元素的内部顺序无关紧要)以及所有元素f(element) == 0 位于列表的末尾(同样,它们的内部顺序并不重要)。

我尝试过,但它变得非常困惑,有很多指针。我想知道是否有人知道一种“干净”的方法来做到这一点?

感谢您的帮助。

最佳答案

如果你有一个数组,请使用 qsort:

#include <stdlib.h>

void qsort(void *base, size_t nmemb, size_t size,
           int (*compar)(const void *, const void *));

这是一个与 qsort 兼容并使用 f 的示例比较器。

int comp(const void* elem1, const void* elem2) {
    int a = f(*((type*)elem1)) ? 1 : 0;
    int b = f(*((type*)elem2)) ? 1 : 0;
    return a - b;
}

如果你有一个链接列表,那么:

linkedlist* sort(linkedlist* head) {
  linkedlist* newHead = NULL;
  linkedlist* newTail = NULL;
  linkedlist* backHead = NULL;
  linkedlist* backTail = NULL;

  linkedlist* currNode = head;
  while (currNode != NULL) {
    if (f(currNode)) {
      if (newHead == NULL) {
        newHead = newTail = currNode;
      } else {
        newTail.next = currNode;
        newTail = currNode;
      }
    } else {
      if (backHead == NULL) {
        backHead = backTail = currNode;
      } else {
        backTail.next = currNode;
        backTail = currNode;
      }
    }

    currNode = currNode.next;
  }

  if (currTail != NULL) {
     currTail.next = backHead;
  }
  if (backTail != NULL) {
     backTail.next = NULL;
  }
  return currHead != NULL ? currHead : backHead;
}

关于c - 基于 C 中的 bool 函数对列表重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26513169/

相关文章:

c - OpenGL (GLFW) 在 macOS Mojave 上不显示图像

c - 为什么不能用双指针来表示二维数组呢?

c - 奇怪的 scanf 参数

c - 以下C代码中的内存丢失

python - 基于重复值合并字典

arrays - 已知上限的桶排序的复杂性?

javascript - Sort 方法将 json 排序为包含唯一值数组的 json

python - 用另一个列表索引一个二维列表

python - 在 Python 中组合两个排序列表

java - 如何按长度对字符串进行排序