Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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_List_Sorting_Linked List - Fatal编程技术网

基于C中的布尔函数对列表重新排序?

基于C中的布尔函数对列表重新排序?,c,list,sorting,linked-list,C,List,Sorting,Linked List,给定一个列表和一个布尔函数f,我如何对该列表进行重新排序,使所有元素(如f(element)==1)位于前面(这些元素的内部顺序无关紧要),而所有元素(如f(element)==0)位于列表的末尾(同样,它们的内部顺序无关紧要) 我试过了,但它变得非常混乱,有很多指针。我想知道是否有人知道一个“干净”的方法来做到这一点 谢谢你的帮助 查找使谓词失败的第一个节点 查找传递谓词的下一个节点 交换数据 继续,直到第一次失败后没有节点通过谓词 如果有数组,请使用qsort: #include <s

给定一个列表和一个布尔函数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 *));
    
    如果您有一个链表,那么:

    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;
    }
    

    列表在哪里?一些代码会很有用。如果你真的有一个链表(根据你的标签),那么如果没有这个结构,你就无法给出一个好的答案。qsort对任何链表都不起作用吗?qsort只对连续的内存块起作用。我正在尝试根据棋子是否捕捉棋子来对棋子进行排序。f是游戏和列表中给定元素(移动)的函数。有没有办法使其与比较器兼容?
    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;
    }