【问题标题】:Usage of ternary operator as placeholder使用三元运算符作为占位符
【发布时间】:2015-06-04 06:49:13
【问题描述】:

我有一个函数 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;
}

【问题讨论】:

  • 不,你不能那样做。但是在 if 测试之前添加一两行代码来评估你想要的比较真的不会很糟糕。
  • 不过,它适用于函数名称。

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


【解决方案1】:

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

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

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

if (less) ...

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

(另外,:&gt;&lt;: 是用于方括号的 digraphs,因此您的代码确实不是乍一看的样子。)

【讨论】:

  • 名称的选择有点令人困惑,或者可能是哲学上的:在某些情况下,less 更多。
  • @chqrlie:只给那些想要混淆的人。 less 指的是列表中的排序,当然不是实际值。 (这个名字的灵感来自面向对象的语言,当对象的类提供less 成员函数或重载&lt; 运算符时,可以对对象进行排序。)
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 2015-12-13
      • 1970-01-01
      • 2021-11-13
      • 2018-09-18
      • 2016-03-30
      • 2020-03-14
      • 2023-03-05
      相关资源
      最近更新 更多