给定一个列表和一个布尔函数f,如何重新排序该列表,使得f(element)== 1的所有元素都在前面(这些元素的内部顺序无关紧要)和所有元素f(元素)== 0位于列表的末尾(同样,它们的内部顺序无关紧要)。
我试过但是它非常混乱,有很多指针。我想知道是否有人知道这种“干净”的方式吗?
感谢您的帮助。
答案 0 :(得分:1)
答案 1 :(得分:1)
如果您有数组,请使用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;
}