使用三元运算符作为占位符
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
保证为 0
或 1
,这里有一个可能更快的单一测试的替代方案:
if ((ptr->next->value < ptr->value) == is_ascending) ...
相同的元素将以不同的顺序排列,但排序仍然是正确的。
我有一个函数 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
保证为 0
或 1
,这里有一个可能更快的单一测试的替代方案:
if ((ptr->next->value < ptr->value) == is_ascending) ...
相同的元素将以不同的顺序排列,但排序仍然是正确的。