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

时间:2015-06-04 06:49:13

标签: c sorting placeholder ternary-operator bubble-sort

我将函数 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 是从主函数传递的决定。

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

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

3 个答案:

答案 0 :(得分:2)

如果你已经尝试过,你会发现你不能这样做。冒号之前和之后的东西必须是一个有效的表达式,它只是一个没有任何东西的二元运算符。

您可以使用三元运算符,但更详细。

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

if (less) ...

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

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

答案 1 :(得分:1)

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

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

如果保证is_ascending01,则可以选择单个测试更快的替代方法:

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

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

答案 2 :(得分:0)

您不能像这样更改比较运算符,而是可以更改比较本身。

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

<div class="...">
    <?php
    // Set counter
    $i = 1;

    // Loop over your posts
    while (have_posts()) {
        // If you have ouputted three already then close and reopen div
        if ($i == 3) {
            $i = 1;

            echo '</div><div class="...">';
        }

        // Output the post and increment the counter
        the_content();
        $i++;
    }
    ?>
</div>