使用三元运算符作为占位符

Usage of ternary operator as placeholder

我有一个函数 bubble_sort_linkedList 声明为,

void bubble_sort_linkedList(node *head);

函数的定义(按升序排序)是这样的:

void bubble_sort_linkedList(node *head){

            node *ptr, *lptr;
            int temp;   
            lptr = NULL; ptr = head;
            if(ptr == NULL || ptr->next == NULL)
                return;
            while(ptr != lptr){                 
                while(ptr->next != lptr){
                    if(ptr->next->value < ptr->value){    // Change the inequality sign             
                        temp = ptr->next->value;
                        ptr->next->value = ptr->value;
                        ptr->value = temp;                  
                    }
                    ptr = ptr->next;
                }
                lptr = ptr; 
                ptr = head;
            }   
            return;
        }

现在,我也希望相同的函数按降序排序,只需更改注释行中的一个符号即可。

所以,我打算做的改变是:

void bubble_sort_linkedList(node *head, bool is_ascending);  //Prototype declaration

is_ascending是主函数传过来的decision

相同的功能,但三元运算符用作占位符(这是我感到困惑的部分,三元运算符是否可以如下所示使用?)

void bubble_sort_linkedList(node *head, bool is_ascending){

    node *ptr, *lptr;
    int temp;   
    lptr = NULL; ptr = head;
    if(ptr == NULL || ptr->next == NULL)
        return;
    while(ptr != lptr){                 
        while(ptr->next != lptr){
            if(ptr->next->value ((is_ascending) ? <:>)  ptr->value){                            
                temp = ptr->next->value;
                ptr->next->value = ptr->value;
                ptr->value = temp;                  
            }
            ptr = ptr->next;
        }
        lptr = ptr; 
        ptr = head;
    }   
    return;
}

如果你尝试过,你就会发现你做不到。冒号前后的东西必须是一个有效的表达式,它只是一个没有任何内容的二元运算符。

您可以使用三元运算符,但要更冗长。

bool less = (is_ascending) 
          ? (ptr->next->value < ptr->value)
          : (ptr->next->value > ptr->value);

if (less) ...

另一种可能性是传递比较函数(如 qsort 所做的那样)而不是布尔标志来确定如何比较节点。这更通用,但如果您只想区分升序排序和降序排序,则可以说有点开销。

(此外,:><: 是方括号的 digraphs,因此您的代码确实不是乍一看的样子。)

您不能那样更改比较运算符,但您可以更改比较本身。

如果你真的想做单行,你可以这样做:

if (((ptr->next->value - ptr->value < 0) && is_ascending) || ((ptr->next->value - ptr->value > 0) && !is_ascending))) {
    ...
}

你不能这样做。但是您可以编写一个表达式来进行条件比较:

if (is_ascending ? ptr->next->value < ptr->value : ptr->next->value > ptr->value) ...

如果 is_ascending 保证为 01,这里有一个可能更快的单一测试的替代方案:

if ((ptr->next->value < ptr->value) == is_ascending) ...

相同的元素将以不同的顺序排列,但排序仍然是正确的。